用户密码salt的最佳长度是多less?

当腌制和散列用户密码时,任何盐都显然会有帮助。 盐应该有多长时间? 我将把salt存储在我的用户表中,所以我希望在存储大小和安全性之间取得最佳平衡。 是一个随机的10字符盐够了吗? 还是我需要更长的时间?

这些答案中的大部分都有点误导,并且显示出盐和密码键之间的混淆。 包含salt的目的是修改用于散列每个用户密码的函数,以便每个存储的密码散列必须单独被攻击。 唯一的安全要求是每个用户都是独一无二的,他们不可预测或难以猜测。

盐只需要足够长的时间,使每个用户的盐将是唯一的。 即使有10亿注册用户,随机的64位盐也不可能重复,所以这应该没问题。 单一重复的盐是一个相对较小的安全问题,它允许攻击者一次search两个帐户,但总的来说不会加快整个数据库的search速度。 即使是32位盐也可以用于大多数目的,在最坏的情况下,攻击者的search速度将提高大约58%。 增加超过64位的盐的成本不高,但没有安全理由。

在每个用户的盐之上使用站点范围内的盐也是有好处的,这样可以避免可能与其他站点中存储的密码哈希冲突,并且防止使用通用的彩虹表,尽pipe32位盐足以使彩虹桌不切实际的进攻。

甚至更简单 – 开发人员总是忽略这一点 – 如果你有唯一的用户名或login名,这些服务器就像盐一样完美。 如果你这样做,你应该添加一个网站的盐,以确保你不与另一个系统谁有同样的好主意的用户重叠。

目前公认的哈希密码标准为每个密码创build一个新的16个字符长的盐,并将密码哈希存储在salt中。

当然应该采取正确的encryption护理来创build真正的随机盐。

编辑:我的下面的答案回答问题,但“真实”的答案是:只使用bcrypt , scrypt ,或氩2 。 如果你问这样的问题,你几乎可以肯定地使用的工具水平太低了。

老实说,没有可靠的理由不让盐和密码哈希值一样长。 如果你使用SHA-256,那么你有一个256位的散列。 没有理由不使用256位盐。

在math上超过256位不会使您的安全性有任何改善。 但用较短的盐进行的话可能会导致一个彩虹台会随着盐的长度而变化,尤其是在盐较短的情况下。

维基百科 :

Linux,BSD Unix和Solaris中使用的SHA2-crypt和bcrypt方法具有128位的盐度。 在可预见的未来,这些较大的盐值使得对于这些系统几乎任何长度的密码都不可行的预计算攻击。

128位(16字节)盐就足够了。 您可以将其表示为128 / 4 = 32hex数字的序列。

一个答案可能是在安全性方面使用你要使用的散列的值作为salt的大小。

例如,如果您打算使用SHA-512,则使用256位盐,因为SHA-512提供的安全性是256位。