【问题标题】:How long should my password salt be, and is SHA-256 good enough?我的密码盐应该有多长,SHA-256 是否足够好?
【发布时间】:2011-12-07 04:03:02
【问题描述】:

我正在创建一个游戏社区网站,我的目标是尽快向公众发布。目前,我正在处理密码和登录。我以前只用过 MD5,但我读过关于密码安全的内容,听说目前要进行加盐。

这是我的计划:每个用户都有自己独特的 12 个随机字符(#/¤& 等)的盐,存储在 users 表中。盐分在注册时与密码一起进行哈希处理(使用 SHA-256),并在登录时重新进行哈希处理。

您觉得这听起来如何?有什么我可以改进的吗?我应该选择 SHA-512 和更长的盐,还是这样就足够了?

【问题讨论】:

    标签: php md5 hash password-protection


    【解决方案1】:

    您建议的 12 个字节对于盐来说应该是足够的长度。这需要字典攻击来准备 296 个散列密码数据库。总有一天,这对破解者来说可能是一项微不足道的操作,但我们离那还有一段路要走。

    NIST 推荐 SHA256 具有足够的密码哈希强度,至少目前是这样。

    如果您想探索更强大的密码安全方法,请研究诸如PBKDF2 之类的密钥强化技术,或使用Bcrypt 进行自适应哈希。但这些在 SQL 中没有直接支持。您必须在应用程序代码中进行哈希处理,然后将哈希摘要发布到您的数据库中。

    对于游戏网站来说,这似乎是一种过度安全措施,但这样做是一种很好的做法。因为许多用户(不建议)使用相同的密码进行游戏登录和银行登录!您不想对间接导致重大损失的身份验证违规负责。

    【讨论】:

    • 非常好的建议。 (虽然 OP 似乎使用 12 个字符而不是 12 个字节作为盐,但熵要少得多)。
    • 是的,好点。通过只使用可打印的字符,他每个字符将使用少于 8 位。
    • 这是个坏建议。 SHA256 不适合密码散列;它太快了。您应该使用 bcrypt、scrypt 或 PBKDF2。
    • @D.W.没错,bcrypt 或 PBKDF2 是更强大的解决方案。这就是我在回答中提到它们的原因。
    【解决方案2】:

    更新:

    不要使用散列或 HMAC。使用bcryptscrypt。见http://codahale.com/how-to-safely-store-a-password/

    原文:

    不要简单地散列。使用 HMAC。 (如果有可用的库,请避免自己进行散列或加密,因为库受益于专家输入。)

    参考资料:

    1. http://rdist.root.org/2009/10/29/stop-using-unsafe-keyed-hashes-use-hmac/
    2. http://us2.php.net/manual/en/function.hash-hmac.php

    【讨论】:

      【解决方案3】:

      这对于您的用例可能已经足够了。

      但是,它可以通过以下方式改进:

      1. 增加盐的大小

      2. 盐不应仅限于一小部分字符

      3. 迭代哈希,比如 1000 次(密钥强化)

      看看phpass

      【讨论】:

      • 我没有对你投反对票,但我认为散列哈希不会提供任何实际好处。我读过hash chaining 可以帮助防止密码被盗,如果密钥是通过不安全的通道发送的,但是当通信是在服务器和它的数据库之间时,我有点怀疑它会有所帮助。老实说,我不知道,但我有一种直觉,连续散列会给散列带来噪音,这将使其他人更容易复制和利用。盐可能是最好的选择。
      • 我指的是关键加强,例如PBKDF2(如上面的比尔所述)。多次迭代被认为是最佳实践,因为它阻碍了对已知哈希值的暴力攻击——攻击者可以访问数据库并想要密码(许多人跨站点重复使用密码)。使用常见的散列函数这样做没有已知的数学弱点。
      • @Col。弹片 盐可以阻止 pre 计算的字典攻击并阻碍彩虹表。多次迭代会阻碍蛮力 - 盐与哈希值一起已知,并且单独并不足以阻碍蛮力。
      • '我担心它会通过增加冲突来降低安全性'如果你能用数学来证明这一点,你的直觉将立即在加密社区中赢得赞誉 :-)
      • 如果您想了解按键拉伸,请参阅schneier.com/paper-low-entropy.html
      【解决方案4】:

      我注意到很多关于如何正确进行密码散列的困惑,尤其是在 stackoverflow 上。而且我看到了一些非常糟糕的建议。所以我写了一个应该清除所有内容的页面。除了使用简单的哈希之外,还有更多内容。

      更多信息和源代码:How to do password hashing properly

      如果有人对密码哈希有疑问,请随时分享此链接。这是我在 stackoverflow 上的第一篇文章,如果我做得不对,请见谅

      【讨论】:

      • 感谢您尝试详细编写此内容的工作。但是,此建议并未完全考虑到安全文献中的最新技术水平。关于盐渍的材料很好,但是关于选择哈希算法的材料不是很好。您推荐 SHA256,但这不是散列密码的好选择。人们应该使用 scrypt、bcrypt 或 PBKDF2。
      【解决方案5】:

      如果您真的担心,我会考虑使用漩涡散列函数而不是 SHA 变体之一。 Whirlpool 已被证明是一种非常强大的哈希方法,并且没有冲突历史或任何其他弱点(至少我知道)。

      您可以通过使用 PHP 的hash 函数来使用漩涡。 (但请注意,hash() 需要 PHP 5.1.2 或更高版本。)

      【讨论】:

      • 所有接受可变长度字符串并输出固定长度哈希的哈希例程都有冲突。这是一个数学确定性。 SHA1 和 MD5(可能还有其他)的弱点是有可能以两种方式更改单个字符串以产生冲突。这个弱点不适用于密码散列(尽管可以想象,用户可以编造两个密码,从而产生相同的散列)。
      • 当然,所有的哈希算法都有发生冲突的机会。我的意思是它(据我所知)在散列方法本身没有弱点,它允许这些冲突比数学上的冲突概率更频繁地发生。
      【解决方案6】:

      你目前的方法就足够了。

      【讨论】:

        猜你喜欢
        • 2014-05-12
        • 2019-04-19
        • 2011-11-18
        • 2013-11-11
        • 2012-04-05
        • 2011-05-05
        • 2016-09-27
        • 1970-01-01
        相关资源
        最近更新 更多