可能重复:
存储密码的推荐散列算法是什么?
您好,最近有人告诉我,像 SHA256 这样的常见哈希函数用作密码哈希函数是不安全的,因为它们“设计得很快”(顺便说一下,我之前在programmers.se 上询问过更快的哈希函数)。所以我的问题是,网站或其他一般应用程序应该使用什么?
另外,第二个问题:SHA256 真的不是散列密码的好选择吗?我有点不相信,但我听说过更疯狂的事情是真的。
(注意:假设正在采取所有其他适当的措施,例如独特的盐)
可能重复:
存储密码的推荐散列算法是什么?
您好,最近有人告诉我,像 SHA256 这样的常见哈希函数用作密码哈希函数是不安全的,因为它们“设计得很快”(顺便说一下,我之前在programmers.se 上询问过更快的哈希函数)。所以我的问题是,网站或其他一般应用程序应该使用什么?
另外,第二个问题:SHA256 真的不是散列密码的好选择吗?我有点不相信,但我听说过更疯狂的事情是真的。
(注意:假设正在采取所有其他适当的措施,例如独特的盐)
你应该使用bcrypt。
在撰写本文时,SHA256 足以用于密码保护,尽管可能不会在一年左右。
我可能会使用 SHA512,因为目前我对真正安全的东西还不太了解,而且我不确定是否有任何东西可以真正安全,因为 CPU 和 GPU 的计算能力大大提高。
迈克霍华德对问题标记的回答是正确的最佳实践。
仅仅使用一个好的散列是不够的,因为:
它不能保护您免受彩虹表攻击。相同的密码每次都会散列到相同的结果。攻击者可以在时间与空间的权衡上妥协,预先计算最流行的密码,然后简单地查找答案。要击败,你需要加盐。(Mike 建议使用用户 ID)
正如您所建议的,散列算法旨在快速。这有时是需要的(例如获取 50MB 文件的哈希),但在密码的情况下则不需要。请改用基于密码的密钥派生函数。它会显着减慢攻击者的速度,但不会影响您自己的速度。