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

时间:2011-11-29 04:33:42

标签: database encryption hash salt

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

假设我刚刚使用这种方法为DB添加密码和盐:

  • 创建随机盐
  • 哈希用户密码+盐一起
  • 将哈希输出存储为“密码”列
  • 中的密码
  • 将随机盐存储在'salt'列中

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

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

3 个答案:

答案 0 :(得分:6)

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

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

因此...

  1. 制作盐随机和;
  2. 制作一个盐
  3. 现在,如果假设攻击者拥有数据库,那么还有另一个问题:攻击速度不受限制,这就是密码哈希方案,如bcrypt或多个 - 周围很有价值。它可以将攻击速度从数以亿计的每秒哈希值(MD / SHA和朋友使更快)降低到比如说几百第二个(在相同的硬件上)...还考虑一个HMAC方法,它还包含一个服务器秘密(使其有效地密码+盐+秘密)。

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

    快乐的编码。

答案 1 :(得分:4)

您概述的步骤是正确的。

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

盐渍哈希密码处理的目的是使计算上不可能预先计算可能的密码哈希,因为随机盐搞砸了预计算过程。

这也意味着如果在不同的站点使用相同的密码,只需查看(盐渍哈希)密码值就不会明显 - 因为不同站点的盐会有所不同,因此产生的哈希值价值会有所不同。 (当然,如果为一个站点发现了密码,那么攻击者将首先在下一个站点尝试该密码;最好不要在多个位置使用相同的密码。但是使用相同密码的事实是隐藏的。)

答案 2 :(得分:3)

假设您没有使用盐,而攻击者则获得了哈希值。她需要做的就是将哈希值与查找表进行比较,看看是否有任何哈希值用于已知密码。假设该表中有一百万个密码。她可以非常高效地检查你的所有哈希值,反对一百万个可能的密码。

现在让我们说同一个攻击者得到了你的哈希,但是他们被腌了。对于她想要检查的每个哈希,她需要获取候选密码,应用salt,计算新哈希,并将其与您存储的哈希进行比较。现在她必须做大量的计算,而且效率不高。 (或者,她可以在其中找到包含每种可能盐的查找表,但是好的,那么她需要一个比不含盐的查找表大几个数量级的查找表。)

所有这些都是为了破解哈希所需的资源数量超过攻击者的价值。