0

基本上单向函数有两个属性: 1. 不可逆 2. 防碰撞(这意味着没有两个相同的词具有相同的哈希值,如果我错了,请纠正我)

另一方面,我看到加盐哈希密码用于为密码的哈希值提供更高的安全性,并为具有相同纯值的密码提供冲突避免。

那么为什么会发生这种情况,哈希函数不应该具有抗碰撞性,为什么当哈希函数已经具有该属性时,Salt 必须提供这个?

先感谢您。

4

2 回答 2

2

如果单向散列函数真的是单向的,那就太好了。

如果两个用户选择相同的密码会发生什么?没有盐,他们得到相同的哈希值。

你猜怎么着?人们不擅长选择密码。这些内存有限且缺乏自然内部密码随机性的生物通常选择短、低熵和暴力破解的密码。

如果你想破解不涉及盐的密码的哈希,那么只需谷歌它

盐有助于解决问题,但它不是灵丹妙药。使用 salt,假设两个用户的 salt 不同,选择相同密码的两个人不会获得相同的密码哈希。盐还有助于防止彩虹表攻击,这是破解密码的时间内存权衡。

尽管如此,这并不能解决所有问题。如果您的数据库公开,salt + 加密哈希是不够的,因为攻击者仍然可以使用低成本 GPU 暴力破解密码

那么解决方案是什么?您不仅需要盐,还需要暴力破解是一个缓慢的过程。这就是为什么我们不对密码使用哈希函数,而是使用密码哈希函数。不要因为愚蠢的术语而责备我,我完全同意。底线:从 bcrypt、scrypt、argon2、pbkdf2 中选择。我个人推荐bcrypt。

于 2017-09-03T21:50:11.633 回答
1

只想在@TheGreatContini 的答案中添加一个细节。

  1. 对于没有加盐的密码,您可能会找到一个已经预建的彩虹表。
  2. 如果您对所有密码使用单一盐,攻击者必须使用此盐构建 1 个彩虹表,以获取所有密码。
  3. 如果每个密码都有其唯一的盐,攻击者将不得不为每个密码构建一个彩虹表。构建一个完整的彩虹表只获得一个密码是没有意义的,这就是为什么我们可以说唯一的盐可以防止彩虹表攻击。
于 2017-09-04T08:24:09.913 回答