我已经读过将要使用的盐应该与散列密码具有相同的长度,这背后的原因是什么?它会增加密码保护吗?我在这里读过 :
为了使攻击者无法为每个可能的盐创建查找表,盐必须很长。一个好的经验法则是使用与散列函数的输出大小相同的盐。例如,SHA256 的输出是 256 位(32 字节),所以 salt 应该至少是 32 个随机字节。
这里很好地描述了为什么需要密码盐。
不,您不需要您的盐与密码的长度相同。事实上,文章中列出的所有实现都没有这样做。通常,对于每添加一点盐,您都需要攻击者将其存储预算翻倍。
因此,对于当今的技术水平,拥有 10 字节的盐应该足够了。另请注意,盐是二进制值,而密码不是,因此盐长度应以位/字节而不是字符为单位测量。
盐没有特别需要那么长,尽管它肯定不会伤害。
盐应该满足的唯一真正要求是它应该是全局唯一的。即使这也不是硬性要求,因为拥有一些重复的盐并不能真正帮助攻击者。只有当你得到很多重复时,盐才会开始失去效力。
特别是,由于生日悖论,如果盐是随机选择的,理想情况下它们应该至少有 2·log 2 ( n ) 位长,其中n是您期望拥有的最大用户数(或者更一般地说,最大您希望使用您选择的散列方法的用户数量)。当然,在此之上保留一些安全边际总是一个好主意。
特别是,地球的总人口略多于 2 32。这意味着,即使地球上的每个人都为您的系统注册了一个帐户,64 位的 salt 仍然足够。
我认为盐的强度应该与密码的强度大致相同,因为两者都应该能够抵抗暴力攻击。
简单的盐会更容易受到攻击,但即使是简单的盐也会使攻击比没有盐更加费力。