盐化密码哈希有什么好处?

The*_*ver 3 database encryption hash salt

我刚刚阅读了许多关于使用salt散列密码的文章,但是我找不到我所遇到的特定查询/混淆的答案.

假设我刚刚为数据库添加了密码和盐这个方法:

  • 创建一个随机盐
  • 将用户密码+盐一起哈希
  • 将哈希输出存储为"密码"列中的密码
  • 将随机盐储存在"盐"栏中

如果这是正确的,当攻击者访问我的数据库时会发生什么?当然,如果他们能够读取散列密码的盐值,他们可以计算出没有盐的散列密码,然后使用彩虹表吗?或者用可逆的东西加密盐值是个好主意?

如果salt值以纯文本形式存储,我就看不到它的重点.请赐教?

小智 6

如果攻击者进入数据库,则所有投注均已关闭,但就盐而言...

盐点不是秘密,而是阻止彩虹攻击 - 彩虹攻击是通过彩虹表完成的.彩虹表只是数百万个密码的预先生成的哈希值(这是一个时空权衡).盐的引入使这些预先计算的哈希无效:必须为每个独特的盐制作彩虹表.

所以...

  1. 随机制盐,并且;
  2. 让盐

现在,如果假设攻击者拥有数据库,那么还有另一个问题:攻击速度不受限制,这就是为什么密码散列方案如bcrypt或多轮是有价值的.它可以减缓进攻速度数亿每秒哈希(MD/SHA和朋友们要快),比方说,几百每秒(在相同的硬件)......还要考虑一个HMAC方法,它还包含一个服务器秘密(使其有效地密码+盐+秘密).

(我只会使用已解决所有这些问题的现有系统,以及更多:-)

快乐的编码.


Jon*_*ler 5

您概述的步骤是正确的。

如果攻击者访问您的数据库,他必须对可能的密码和随机盐进行暴力搜索。如果您使用 64 位合理随机的盐,那么不会有两个条目使用相同的盐,因此任何彩虹表攻击一次仅适用于(最多)一个盐值,这也使得彩虹表攻击贵是值得的。(您甚至可以在为用户建立盐时检查以确保没有其他密码使用给定的盐。)

加盐散列密码过程的重点是使预计算可能的密码散列在计算上不可行,因为随机盐会破坏预计算过程。

这也意味着,如果在不同的站点使用相同的密码,仅通过查看(加盐散列的)密码值就不会很明显 - 因为不同站点的盐会不同,因此生成的散列值将是不同的。(当然,如果发现某个站点的密码,那么攻击者会先在下一个站点尝试该密码;还是最好不要在多个位置使用相同的密码。但事实上使用相同的密码被隐藏了。)