为什么有好盐?

时间:2013-10-02 12:39:00

标签: hash passwords salt

假设我们不使用password_hash并使用crypt()sha512代替哈希密码。我们需要在密码中添加salt,因此攻击者无法使用彩虹表攻击。为什么盐必须并且非常随机,如许多SO答案所述?即使盐的差别很小或不是很随机,它仍会给出与其他人完全不同的哈希值。因此,攻击者不会知道谁使用相同的密码,他仍然无法创建一个彩虹表。

2 个答案:

答案 0 :(得分:2)

计算和储存强盐需要最少的努力,同时降低彩虹表用天文数字小的盐预先计算的机会。

如果盐是3位数,那么攻击者可以为所有可能的盐组合预先计算彩虹表是可行的。如果salt是一个随机的24个字符的字母数字字符串,那么攻击者可以预先计算出所有可能的盐的几率为零。

答案 1 :(得分:2)

盐应该是唯一的,必须足够长,并且应该是不可预测的。随机性不是必需的,但它是计算机满足这些要求的最简单方法。盐的目的不是秘密,盐即使在已知的情况下也能实现其目的。

唯一性意味着它不仅应该在您的数据库中是唯一的(否则您可以使用用户ID),它应该在全球范围内是唯一的。有人可以为像盐这样的盐制作彩虹饼。 1-1000并且能够检索具有这些用户ID的所有帐户的密码(通常管理员帐户的用户ID较低)。

足够长:如果盐太短(可能的组合太少),那么再次构建彩虹表会变得有利可图。盐和密码一起可以看作只是一个更长的密码,如果你可以为这个更长的密码建立一个彩虹表,你也可以得到更短的原始密码。对于非常强大和长时间的密码,实际上根本不需要进行腌制,但是大多数人为生成的密码都是强制性的,因为它们很短(人们必须记住它们)。

同样使用来自其他参数的盐也属于这一类。仅因为您从用户标识计算哈希值,这不会增加可能的组合。

不可预测性稍微不那么重要,但想象一下,如果你使用userid作为salt,攻击者可以找出接下来的几个用户名是什么,因此可以预先计算出一个狭窄的彩虹表的数量。根据使用的散列算法,这可以适用或不适用。他有时间优势,可以立即检索密码。如果管理员帐户使用可预测的盐,则会出现更多问题。

因此,使用从OS随机源(dev / urandom)生成的真正随机数是您可以做的最好的。即使您忽略了上述所有原因,为什么在有更好的方法时使用衍生盐,为什么不使用您知道的最佳方式呢?