Hash 为什么要有好的盐?

Hash 为什么要有好的盐?,hash,passwords,salt,Hash,Passwords,Salt,假设我们不使用password\u散列,而是使用crypt()和sha512来散列密码。我们需要在密码中添加盐,这样攻击者就不能使用彩虹表攻击。为什么盐必须是好的和非常随机的,如许多答案所述?即使盐有一点不同或不是很随机,它仍然会给出与其他盐完全不同的散列。因此,攻击者不知道谁使用了相同的密码,他仍然无法创建一个彩虹表。计算和存储一个强salt只需很少的努力,但却降低了彩虹表被用小得惊人的salt预先计算的机会 如果salt是一个3位数的数字,那么攻击者可以预先计算所有可能的salt组合的彩虹表

假设我们不使用
password\u散列
,而是使用
crypt()
sha512
来散列密码。我们需要在密码中添加盐,这样攻击者就不能使用彩虹表攻击。为什么盐必须是好的和非常随机的,如许多答案所述?即使盐有一点不同或不是很随机,它仍然会给出与其他盐完全不同的散列。因此,攻击者不知道谁使用了相同的密码,他仍然无法创建一个彩虹表。

计算和存储一个强salt只需很少的努力,但却降低了彩虹表被用小得惊人的salt预先计算的机会


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

salt应该是唯一的,必须足够长,并且应该是不可预测的。随机性是不必要的,但它是计算机满足这些要求的最简单的方法。盐的目的不是为了保密,盐即使在被知道的时候也能达到它的目的

唯一性意味着它不仅在数据库中是唯一的(否则您可以使用用户ID),而且在全球范围内也是唯一的。有人可以为salts(例如1-1000)创建rainbowtables,并能够检索所有具有这些用户ID的帐户的密码(通常管理员帐户的用户ID较低)

足够长:如果盐太短(可能的组合太少),建造彩虹表再次获利。Salt和password一起可以被看作是一个较长的密码,如果您可以为这个较长的密码构建一个彩虹表,那么您也可以得到较短的原始密码。对于非常强且很长的密码,实际上根本不需要添加盐渍,但大多数人工生成的密码都可以强制执行,因为它们很短(人们必须记住它们)

此外,使用从其他参数中提取的盐也属于这一类。仅因为您从userid计算了一个散列,所以这不会增加可能的组合

不可预测性稍微不那么重要,但再次想象一下,如果您将用户ID用作salt,攻击者可以发现接下来的几个用户ID,因此可以预先计算出少量的rainbow表。根据所使用的哈希算法,这可能适用或不适用。他有一个时间优势,便可以立即检索密码。如果管理员帐户使用了可预测的salt,那么问题就更大了


因此,最好使用从OS随机源(dev/urandom)生成的真正随机数。即使你忽略了上面所有的原因,为什么你应该使用衍生盐当有更好的方法时,为什么不使用你知道的最好的方法?

好的和随机的盐应该是不可能“猜测”一种盐。我认为“好”是指“随机”,在这种情况下,你应该阅读,特别是“那么,为什么盐必须是随机的?”@Rufinus如果他得到密码,他就会得到盐。从一行中使用用户的
Id
,和另一个更复杂的值,是不一样的,因为Id可能很容易被猜到。可能重复