为什么盐的长度与散列值相同?

时间:2012-12-28 03:30:48

标签: java security passwords

我已经读过,将要使用的盐应该与散列密码具有相同的长度,这背后的原因是什么?它会增加密码保护吗? 我看过了 Here

  

为了使攻击者无法为每个可能的盐创建查找表,盐必须很长。一个好的经验法则是使用与散列函数输出大小相同的salt。例如,SHA256的输出是256位(32字节),因此盐应至少为32个随机字节。

3 个答案:

答案 0 :(得分:9)

Here很好地描述了为什么需要密码盐。

不,您不需要您的盐与密码长度相同。实际上,文章中列出的所有实现都没有这样做。通常,对于每增加一点盐,您需要攻击者将其存储预算加倍。

因此,拥有10字节的盐应该足以满足当今的技术水平。另请注意,salt是二进制值而密码不是,因此salt的长度应以位/字节而非字符来度量。

答案 1 :(得分:4)

没有特别需要盐那么长,虽然它肯定不会受伤。

salt应该满足的唯一真正要求是它应该是全球唯一的。即使这不是 hard 要求,因为有一些重复的盐并不能真正帮助攻击者。只有当你得到重复的批次时,盐开始失去效力。

特别是,由于birthday paradox,如果随机选择盐,理想情况下,它们的长度应至少为2·log 2 n )位,其中 n 是您希望拥有的最大用户数(或者更一般地说,您希望使用所选散列方法的最大用户数)。当然,最重要的是要有一些安全边际。

特别是,地球的总人口有点超过2 32 。这意味着,即使地球上的每个人都为您的系统注册了一个帐户,64位盐仍然是足够的。

答案 2 :(得分:2)

我认为盐的强度应该与密码的强度大致相同,因为两者都应该能够抵抗暴力攻击。

一种简单的盐会更容易受到伤害,但即使是简单的盐也会使得攻击比没有盐更加费力。