7

当密码或其他重要信息的数据库遭到破坏时,我很难理解附加到哈希的盐如何帮助提高安全性。

例如,如果盐是“hello”,并附加到密码“password”,那么盐和密码存储在一起,“hellopassword”并散列产生:

94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1) 

然后加盐:

hello$94e66f94517d606d5ad6d9191b980408952f2ed2

这如何更安全?攻击者知道盐,所以现在可以轻松计算密码......对吗?还是我从根本上误解了什么?

4

3 回答 3

8

不,不是“有点额外的困难”——可能会有更多的困难。

想象一下有 20 亿个常用密码。很容易散列所有这些并存储结果。然后,如果您有一个未加盐的密码哈希,您只需检查哪些常见密码与给定的哈希匹配。

现在将其与加盐哈希进行比较……现在您有 20 亿个常用密码,还有数十亿个可能的盐。计算所有可能的盐/密码组合将花费更长的时间 - 希望变得不可行。

此外,这意味着即使两个人拥有相同的密码,他们也很可能拥有不同的哈希值——因此一个用户在泄露密码时的粗心不会危及另一个用户的安全。

有关此内容的更多信息,请参阅Wikipedia 条目(如果您还没有的话)。

于 2010-09-04T17:08:47.760 回答
6

盐有两种帮助:

1)当两个(或更多)人使用相同的密码时,没有盐你可以看到谁使用了相同的密码(哈希值都是一样的)。所以理论上,如果那个人知道其中一个人的密码,他就知道每个人的密码都具有相同的哈希值。这是一个小原因。

2)主要是为了防止通常称为字典攻击或彩虹攻击的攻击。在这些攻击中,有人使用预先计算的哈希数据库作为常用密码。很多时候,这些数据库的大小都是零星的。但在这一点上,只需根据预先计算的散列列表查找您拥有的散列(散列密码)并查看相关密码是什么就很容易了。

通过使用盐值(通常您希望这是一个随机数),哈希将与字典不匹配(他们预先计算具有所有可能盐值的所有密码的机会成倍增加)。因此,即使您的用户使用容易受到攻击的密码,比如“密码”,它几乎可以保证在任何密码字典/彩虹表中都是任何密码,通过预先设置您的随机盐值,您可以保证散列几乎没有用给攻击者。同时对您而言,由于盐只是以明文形式存储,因此您可以很容易地将其添加到明文中,以便比较用户输入的密码。

于 2010-09-04T17:09:21.380 回答
3

The salt isn't appended to the hash, its appended to the password THEN hashed. This is more secure because hackers have to know the salt and the actual password, which you should both protect heavily. :D

于 2010-09-04T17:10:25.830 回答