密码哈希:这是避免碰撞的一种方法吗?

3

我在考虑为每个用户密码使用两个密钥进行哈希,得到两个不同的哈希值。这样,除了实际的密码之外,几乎不可能找到另一个可用的密码。

这样做正确吗?它值得吗?

3个回答

7

一个重要的规则要学习就是“永远不要试图发明自己的密码学”。 最好情况下只是浪费时间,最坏情况下会引入安全漏洞。

如果您不确定自己是否是这个规则的例外,那么您就不是这个规则的例外。

密码哈希函数的设计者已经担心了碰撞问题,所以您不需要担心。只需选择一个(SHA-256是一个很好的选择),并将精力集中在应用程序的其他部分上。


请注意,尽管SHA-256在大小和加密强度方面足够强大,但其纯形式不适用于密码哈希。您需要一种缓慢的、加盐的方案,例如PBKDF2、scrypt或bcrypt。 - CodesInChaos

6

您可以使用SHA256作为哈希算法。迄今为止没有发现任何碰撞,并且未来在密码上看到任何碰撞的可能性非常小。


5

您可以使用更长的哈希值。例如,SHA-512是512位,(假设它是均匀的)与SHA-256相比,发生冲突的可能性要小得多。但就个人而言,我不会担心这个问题。大多数密码本身都少于32字节(256位),因此应该具有极低的与SHA-256冲突的概率。


我不是专家,但我非常确定将位长度加倍会使一个类只有“发生冲突的可能性”。 - cdiggins
2
@cdiggins:你能详细说明一下吗?我不知道你的意思。 - Samir Talwar
1
假设你寻找碰撞的最佳方法是随机猜测(就目前而言,对于SHA-N来说是真的),则选择一个x其哈希与给定y的哈希发生碰撞的概率为1/2^256(对于SHA-256)和1/2^512(对于SHA-512)。后者比前者小得多。然而,这两种情况都不会发生,就像你不可能在余生中每天都赢得彩票一样。 - Nemo
@Nemo:啊,你说得完全正确。千万不要在凌晨1点做数学题。我现在会编辑问题以反映这一点。 - Samir Talwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接