单向函数,哈希算法

时间:2017-09-03 19:22:52

标签: security hash hash-collision saltedhash

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

另一方面,我看到Salted Hash密码用于为密码的哈希值提供更多安全性,并且还为具有相同普通值的密码提供冲突避免。

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

提前谢谢。

2 个答案:

答案 0 :(得分:2)

如果单向散列函数真的是单向的,那将是很棒的。

如果两个用户选择相同的密码会怎样?没有盐,他们会得到相同的哈希。

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

如果你想破解不涉及盐的密码的哈希值,那么只需要Google it

Salt有助于解决问题,但它不是灵丹妙药。对于salt,两个选择相同密码的人不会获得相同的密码哈希,假设两个用户的盐不同。 Salts还有助于防止rainbow table attacks,这是一种时间记忆权衡来破解密码。

但是,这并没有解决所有问题。如果您的数据库公开,那么salt +加密哈希是不够的,因为攻击者仍然可以brute force-passwords using low cost GPUs

那么解决方案是什么?你不仅需要盐,而且还需要暴力迫使它是一个缓慢的过程。这就是为什么我们不对密码使用哈希函数,而是使用password hashing functions。不要怪我这个愚蠢的术语,我完全同意。底线:选择bcrypt,scrypt,argon2,pbkdf2。我个人推荐bcrypt。

答案 1 :(得分:1)

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

  1. 对于没有盐的密码哈希,你可能会找到一个 已经预建的彩虹表。
  2. 如果您对所有密码使用单一盐,则攻击者必须使用此盐构建1个彩虹表, 获取所有密码。
  3. 如果每个密码都有其唯一的盐,则攻击者必须为每个密码构建一个彩虹表。构建一个完整的彩虹表只能获得1个密码没有意义,这就是为什么我们可以说独特的盐可以防止彩虹表攻击。