在存储之前对密码进行两次哈希处理是否比仅对其进行一次哈希处理更安全?
我所说的是这样做:
$hashed_password = hash(hash($plaintext_password));
而不仅仅是这个:
$hashed_password = hash($plaintext_password);
如果它不太安全,您能否提供一个好的解释(或一个链接)?
另外,使用的哈希函数有什么区别吗?
注 1:当我说"双重哈希"时,我指的是对密码进行两次哈希处理,以使其更加模糊。解决冲突的技术。
Note 2: I know I need to add a random salt to really make it secure. The question is whether hashing twice with the same algorithm helps or hurts the hash.
答案
对密码进行一次哈希处理是不安全的
不,多个散列不是更不安全;
迭代哈希会增加攻击者尝试候选列表中每个密码所需的时间。
简单的迭代是不够的
仅仅将哈希输出链接到输入不足以保证安全。
像 PBKDF2 这样的良好密钥派生算法会将密码注入到每轮哈希中,从而减轻对哈希输出冲突的担忧。
如何破解密码
存储的密码需要防止离线攻击。
所有密码出现的可能性并不相同。
假设攻击者名单很长,有 100 亿个候选者;
多少钱才够呢?
使用的迭代次数是安全性和用户体验之间的权衡。它仍然可以每秒执行数亿次迭代。的性能攻击者 系统确定在给定多次迭代的情况下破解密码所需的时间。你的系统。
您可以让用户在身份验证期间额外等待 3/4 秒左右。PBKDF2迭代次数在 60,000 到 120,000 之间,或者密码成本系数为 12 或 13。
更多背景
读PKCS
以下是我就该主题撰写的其他答案: