基本上单向函数有两个属性: 1. 不可逆 2. 防碰撞(这意味着没有两个相同的词具有相同的哈希值,如果我错了,请纠正我)
另一方面,我看到加盐哈希密码用于为密码的哈希值提供更高的安全性,并为具有相同纯值的密码提供冲突避免。
那么为什么会发生这种情况,哈希函数不应该具有抗碰撞性,为什么当哈希函数已经具有该属性时,Salt 必须提供这个?
先感谢您。
基本上单向函数有两个属性: 1. 不可逆 2. 防碰撞(这意味着没有两个相同的词具有相同的哈希值,如果我错了,请纠正我)
另一方面,我看到加盐哈希密码用于为密码的哈希值提供更高的安全性,并为具有相同纯值的密码提供冲突避免。
那么为什么会发生这种情况,哈希函数不应该具有抗碰撞性,为什么当哈希函数已经具有该属性时,Salt 必须提供这个?
先感谢您。
如果单向散列函数真的是单向的,那就太好了。
如果两个用户选择相同的密码会发生什么?没有盐,他们得到相同的哈希值。
你猜怎么着?人们不擅长选择密码。这些内存有限且缺乏自然内部密码随机性的生物通常选择短、低熵和暴力破解的密码。
如果你想破解不涉及盐的密码的哈希,那么只需谷歌它。
盐有助于解决问题,但它不是灵丹妙药。使用 salt,假设两个用户的 salt 不同,选择相同密码的两个人不会获得相同的密码哈希。盐还有助于防止彩虹表攻击,这是破解密码的时间内存权衡。
尽管如此,这并不能解决所有问题。如果您的数据库公开,salt + 加密哈希是不够的,因为攻击者仍然可以使用低成本 GPU 暴力破解密码。
那么解决方案是什么?您不仅需要盐,还需要暴力破解是一个缓慢的过程。这就是为什么我们不对密码使用哈希函数,而是使用密码哈希函数。不要因为愚蠢的术语而责备我,我完全同意。底线:从 bcrypt、scrypt、argon2、pbkdf2 中选择。我个人推荐bcrypt。
只想在@TheGreatContini 的答案中添加一个细节。