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

Tho*_*s O 7 hash sha1 salt

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

如果盐是,例如,"你好",并附加到密码"密码",那么盐和密码一起存储,"hellopassword"并散列产生:

94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1) 
Run Code Online (Sandbox Code Playgroud)

然后附上盐:

hello$94e66f94517d606d5ad6d9191b980408952f2ed2
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 8

不,没有"一点点额外的困难" - 可能会有更多的困难.

想象一下,有20亿个常用密码.散列所有这些并存储结果很容易.然后,如果你有一个无盐密码哈希值,你可以检查哪些常见的密码散列给出匹配.

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

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

有关详细信息,请参阅维基百科条目(如果您还没有).


Zip*_*pit 6

盐有两种帮助:

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

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

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

  • 如果您使用随机盐,则使用密码存储它.否则,您无法重新创建哈希来检查密码. (2认同)