基本上单向函数有两个属性: 1.不可逆转 2.碰撞阻力(这意味着没有两个相同的单词具有相同的哈希值,如果我错了,可以纠正我)
另一方面,我看到Salted Hash密码用于为密码的哈希值提供更多安全性,并且还为具有相同普通值的密码提供冲突避免。
那么为什么会发生这种情况,并不是哈希函数应该具有碰撞阻力,为什么当哈希函数已经具有该属性时,Salt必须提供这个?
提前谢谢。
答案 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的答案中添加一个细节。