【问题标题】:Using GetHashCode to "secure" users passwords使用 GetHashCode 来“保护”用户密码
【发布时间】:2009-03-04 10:51:04
【问题描述】:

我工作的公司签订了一份大型订单处理系统的支持合同。作为初始系统审核的一部分,我注意到存储在数据库中的密码实际上是密码的哈希码。

基本上:

string pwd = "some pasword";
string securePwd = pwd.GetHashCode();

我的问题是,这有多安全?

我对此并不满意,但我对 GetHashCode 的工作原理知之甚少。我更喜欢使用 MD5 哈希之类的东西,但如果我在浪费时间,我不会打扰。

【问题讨论】:

    标签: c# .net security cryptography


    【解决方案1】:

    您应该使用加盐的、加密的强哈希,例如SHA256Managed

    Jeff Attwood 有几篇关于这个主题的好帖子:

    Rainbow Hash Cracking

    You're Probably Storing Passwords Incorrectly

    【讨论】:

      【解决方案2】:

      这不仅不安全,而且可能会发生变化:

      http://netrsc.blogspot.com/2008/08/gethashcode-differs-on-systems.html

      GetHashValue 为给定输入返回的值在过去发生了变化。

      不能保证在应用的不同执行之间它甚至会是相同的。

      【讨论】:

      • +1 链接示例表明,即使在修补 .NET 框架的简单 Windows 更新之后,哈希值计算也会发生变化。这意味着没有人可以再登录了。
      【解决方案3】:

      GetHashCode 返回一个 32 位整数作为哈希值。考虑到birthday paradox,由于碰撞概率相对较高,它的哈希值不够长,即使它被明确设计为抗碰撞,但事实并非如此。

      您应该选择 SHA256 或其他旨在处理此类任务的加密安全哈希函数。

      要存储密码,仅使用简单的哈希函数是不够的。您应该为每个用户添加一些随机的“盐”并迭代足够多的时间,这样蛮力的计算成本就会很高。因此,您应该使用 bcrypt、scrypt、PBKDF2 之类的东西,并进行大量迭代。

      【讨论】:

      • 取决于你如何定义破碎。有一些已知的方法可以计算碰撞的值(至少我确定 MD5 中的这种情况),但这并不会使它们毫无用处。在大多数情况下,即使是加盐的 MD5 也足以存储密码。它们的“损坏”属性对数字签名的影响更大。
      • 哦,也就是说,我不建议使用 MD5 或 SHA1。正如 Mitch 所说,使用 SHA256 或更高的哈希算法。我评论的重点是“破碎”的事情。在加密算法中,损坏 = 死亡。但在哈希算法中,灰色区域有点多。
      • 谢谢,我就是这么想的。我尝试将系统移至 SHA256。
      【解决方案4】:

      我建议改用BCrypt。正如其他人已经说过的那样,使用 GetHashCode 作为密码并不是一个好主意。

      【讨论】:

        【解决方案5】:

        GetHashCode 绝对不是为了以这种方式使用而设计的,因为实现不保证不同对象的不同哈希返回。这意味着潜在的多个密码可能会产生相同的哈希值。也不保证在不同版本的 .NET 框架上返回相同的哈希值,这意味着升级可能会为相同的字符串生成不同的哈希值,从而使您的密码无法使用。

        建议您在推送时使用加盐哈希甚至 MD5。您可以轻松地将其切换到 Security.Cryptography 命名空间中的内容。

        【讨论】:

          【解决方案6】:

          正如其他人所说,GetHashCode 不是为您想要做的事情而设计的。真的有excellent article on how to handle user passwords securely

          总结这篇文章,您需要使用相对较慢的自适应哈希方案,例如bcrypt,或者Stanford Secure Remote Password Protocol。我建议前者。当然,您还应该使用盐。

          【讨论】:

          • SRP 与密码哈希的选择是正交的。它仍然需要一个良好的慢散列作为构建块。不幸的是,许多 SRP 实现都使用快速的。
          • 您的答案中用于安全处理用户密码的链接将转到某些 ncctrust 网站的主页。请问可以修吗?
          猜你喜欢
          • 1970-01-01
          • 2013-06-15
          • 2017-07-21
          • 2017-05-19
          • 1970-01-01
          • 2011-06-20
          • 2014-10-07
          • 2016-10-03
          • 2016-08-17
          相关资源
          最近更新 更多