【问题标题】:VB.Net Password Hashing practicesVB.Net 密码散列实践
【发布时间】:2011-07-26 06:17:57
【问题描述】:

我正在尝试保护一个即将转移到公共服务器的网站。我刚刚将密码散列函数添加到我的所有登录脚本中。我正在使用FormsAuthentication.HashPasswordForStoringInConfigFile(pw, method) 这样做。我对我正在使用的进程以及它对于网络服务器是否安全有疑问:

  1. 密码通过 HTTPS 以纯文本形式发送到服务器
  2. 服务器在用户表中查找用户的 Salt(几个随机字符)以及他们的哈希和加盐存储密码
  3. 纯文本密码附加了 Salt
  4. 使用上述函数对新字符串进行哈希处理
  5. 将新散列的版本与存储的版本进行比较
  6. 如果相等,则允许登录
  7. 如果不相等,登录尝试会记录在 Session 变量中,最多 3 次,然后锁定用户的计算机,使其无法访问登录页面,直到管理员验证 IP 地址并解锁。

这看起来对吗?我只是看不出盐在这种方法中的效果如何......无论如何,我所做的只是添加盐和哈希。这被认为是加密吗?还是我错过了一步?我记得读过像 SHA1 和 MD5 这样的哈希算法不是加密算法,那么还需要做什么呢?

【问题讨论】:

  • 密码永远不应该被加密,它们必须总是被散列。
  • 谢谢,你这么说很有趣。当它实际上只是散列时,我一直将这种方法称为“加密”。我对这些东西还很陌生,所以我不知道有很大的不同。刚刚将问题标题从“加密”更改为“散列”

标签: vb.net security hash cryptography


【解决方案1】:

您不应该在会话中存储重试计数 - 攻击者可以在每次尝试后简单地丢弃他们的会话 cookie,从而允许他们重试任意多次。相反,将其存储在用户记录中。

【讨论】:

    【解决方案2】:

    没错。盐用于防止彩虹表攻击,其中使用 MD5 散列的常见作品字典试图获得条目。使用 salt 可以确保即使他们有单词的 MD5 哈希,它也不会起作用,因为他们不知道 salt。

    MD5 算法是一种单向哈希算法,而不是加密值。不同之处在于,一旦您对值进行了散列处理,就无法恢复到原始值。加密允许您解密数据并取回原始值。所以你是对的,它们不一样,你的密码没有加密,它们是散列的。这意味着如果有人忘记了他们的密码,您将无法将其发送给他们。您必须为他们提供一种重置密码的方法。这也意味着任何有权访问数据库的人都无法访问原始密码。这很好,因为很多人在任何地方都使用相同的密码,如果您可以访问大量用户名和密码,那么有人可能会决定开始尝试登录银行/信用卡网站。

    您正在做的是推荐的做法。

    【讨论】:

    • 好的,很好。我们实际上有一个密码重置表单,而不是发送密码。那么MD5呢?我已经读到这些天它不安全,但我不确定我对该散列函数的选择是什么。据我所知,只有 MD5 和 SHA1。还有更多吗?或者我是否可以安全地将其用于存储非敏感个人信息(如电子邮件、电话和地址)(无凭据或财务信息)的网站
    • @Dexter 并不是说​​ MD5 不安全,而是有现成的表可用于快速查找哈希。另一个问题是已经证明存在碰撞。这意味着有多个不同的值会产生相同的哈希值。我不知道碰撞发生频率的统计数据,但这种情况很少见。使用 MD5 对密码进行哈希处理是安全的。并且通过在 3 次尝试后锁定登录表单来使暴力攻击站点变得困难,这也有帮助。我会小心IP锁定。 IP 不是个人独有的,可能会锁定 > 1 个人。
    • 是的,我想我只需要在数据库中添加一个用于锁定的字段,然后完全锁定用户。感谢您的帮助!
    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 2013-02-23
    • 2011-02-18
    • 2017-01-07
    • 2015-08-13
    • 2012-05-30
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多