有人可以解释在存储散列密码时盐的帮助吗?

时间:2010-09-04 17:01:50

标签: hash sha1 salt

我很难理解当密码数据库或其他重要信息被泄露时,附加到散列的salt如何帮助提高安全性。

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

94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1) 

然后添加盐:

hello$94e66f94517d606d5ad6d9191b980408952f2ed2

这怎么更安全?攻击者知道盐,所以现在可以用很少的额外难度计算密码......对吧?还是我从根本上误解了什么?

3 个答案:

答案 0 :(得分:8)

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

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

现在将它与盐渍哈希进行比较......现在你有20亿个常用密码,但也有数十亿个可能的盐。计算所有可能的盐/密码组合将需要更长时间 - 希望变得不可行。

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

有关详情,请参阅Wikipedia entry(如果您还没有)。

答案 1 :(得分:6)

盐有两种帮助:

1)当两个(或更多)人使用相同的密码时,如果没有盐,您可以看到谁使用相同的密码(哈希是完全相同的)。所以从理论上讲,如果那个人知道这些人的密码之一,他就知道每个人的密码都是用相同的哈希。这是一个次要原因。

2)主要原因是防止通常称为字典攻击或彩虹攻击的攻击。在这些攻击中,有人使用预先计算的哈希数据库来获取常用密码。通常这些数据库都是大小的演出。但是,就这一点而言,只需要对预先计算的哈希列表进行哈希查找(哈希密码),并查看相关密码是什么。

通过使用salt值(通常您希望这是一个随机数),哈希值与字典不匹配(他们预先计算具有所有可能盐值的所有密码的几率是指数级的难度)。因此,即使您的用户使用容易受到攻击的密码,也可以说“密码”,这几乎可以保证在任何密码字典/彩虹表中,通过预先挂起您的随机盐值,您可以使哈希几乎保证无用对攻击者与此同时,由于盐只是以明文形式存储,因此您可以很容易地将其添加到明文中,以便比较用户输入的密码。

答案 2 :(得分:3)

salt不会附加到哈希值,它会附加到密码THEN哈希值。这更安全,因为黑客必须知道盐和实际密码,你应该大力保护。 :d