我很难理解当密码数据库或其他重要信息被泄露时,附加到散列的salt如何帮助提高安全性.
如果盐是,例如,"你好",并附加到密码"密码",那么盐和密码一起存储,"hellopassword"并散列产生:
94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1)
Run Code Online (Sandbox Code Playgroud)
然后附上盐:
hello$94e66f94517d606d5ad6d9191b980408952f2ed2
Run Code Online (Sandbox Code Playgroud)
这怎么更安全?攻击者知道盐,所以现在可以用很少的额外难度计算密码......对吧?还是我从根本上误解了什么?
盐有两种帮助:
1)当两个(或更多)人使用相同的密码时,如果没有盐,您可以看到谁使用相同的密码(哈希都是相同的).所以从理论上讲,如果那个人知道这些人的密码之一,他就知道每个人的密码都是用相同的哈希.这是次要原因.
2)主要原因是防止通常称为字典攻击或彩虹攻击的攻击.在这些攻击中,有人使用预先计算的哈希数据库来获取常用密码.这些数据库通常都是大型演出.但是,就这一点来说,只需要对预先计算的哈希列表进行哈希查找(哈希密码),并查看相关密码是什么.
通过使用salt值(通常您希望这是一个随机数),哈希将与字典不匹配(他们预先计算所有可能的盐值的密码的几率是指数级的难度).因此,即使您的用户使用容易受到攻击的密码,也可以说"密码",这几乎可以保证在任何密码字典/彩虹表中,通过预先挂起您的随机盐值,您可以使哈希几乎保证无用对攻击者 与此同时,由于盐只是以明文形式存储,因此您可以很容易地将其添加到明文中,以便比较用户输入的密码.