散列时“盐”的目的是什么?

时间:2009-12-10 22:40:42

标签: hash saltedhash

好的,我正在尝试了解使用盐的原因。

当用户注册时,我为他/她生成一个我存储在DB中的唯一盐。然后我用SHA1散列它和密码。当他/她登录时,我用sha1($salt.$password)重新哈希。

但如果有人攻击我的数据库,他可以看到哈希密码和盐。

难道不仅仅是用盐来破解密码吗?我不明白......

对不起,如果我很蠢......

3 个答案:

答案 0 :(得分:9)

如果您不使用salt,则攻击者即使在进入您的服务器之前也可以预先计算密码< - >哈希数据库。添加盐大量增加了该数据库的大小,使得执行此类攻击变得更加困难。

此外,一旦他们陷入困境,他们可以猜出一个常用的密码,哈希,然后检查数据库中的所有密码是否匹配。对于每个用户使用不同的盐,他们一次只能攻击一个密码。

维基百科上有一篇关于salts in cryptography的文章。

答案 1 :(得分:1)

使用salt的另一个目的是确保具有相同密码的两个用户最终不会在users表中具有相同的哈希值(假设它们的盐不相同)。但是,salt和密码的组合最终可能导致相同的“字符串”或散列,并且散列将完全相同,因此请务必使用salt和password的组合,其中两个不同的组合不会导致相同的哈希。

答案 2 :(得分:1)

如果攻击者创建了giant table of hash values for plaintext passwords,则使用salt会阻止他使用同一个表来破解多个密码。攻击者必须为每个盐生成一个单独的表。请注意,为了实际工作,你的盐应该相当长。否则攻击者的预先计算的表可能包含salt +密码哈希值。