用户密码盐的最佳长度是多少?[关闭]


128

盐分和哈希用户密码时,任何盐分都显然会有所帮助。是否有关于盐应保留多长时间的最佳实践?我将盐存储在用户表中,因此我希望在存储大小和安全性之间取得最佳平衡。随机添加10个字符的盐是否足够?还是我需要更长的时间?


10
我没有关于盐的长度的建议,但是这里显示的答案有很多不好的信息。您的食盐绝对应该:-随机-是秘密的(不是存储在程序映像或配置文件中的单个值)。盐不是密码的秘密,因此将其存储在表中没有问题。盐的唯一目的是确保对同一项目的不同实例进行哈希(或加密)时,您将获得不同的结果。
Michael Burr

2
对于那些不知道盐是什么的人:Wikipedia上的<a href=" en.wikipedia.org/wiki/Salt_(cryptography)">盐(加密)</a>
David Koelle,

1
还是盐的长度与哈希输出的长度之间存在最佳比率?对于HMAC-SHA-256,8字节盐可能已足够,但对于HMAC-SHA-512,盐可能还不够。
Crend King

1
与哈希函数输出大小相同的密码随机盐,意味着“尝试所有可能的盐”(加上密码字典)攻击与“尝试所有可能的哈希结果”攻击所需的精力相同-这是标准的蛮力。较短的盐意味着您可以将盐字典和密码字典作为暴力破解来使用。
理查德·加兹登

-1不能(甚至试图)回答问题。
2011年

Answers:


70

这些答案大多数都被误导了,表明了盐和加密密钥之间的混淆。包含盐的目的是修改用于对每个用户的密码进行哈希处理的功能,以便每个存储的密码哈希将必须分别受到攻击。唯一的安全性要求是它们对于每个用户都是唯一的,因此无法预测或难以猜测没有任何好处。

盐只需要足够长,以便每个用户的盐都是唯一的。即使拥有十亿注册用户,随机64位盐也极不可能重复出现,因此应该没问题。一次重复执行盐操作就不会造成太大的安全问题,它使攻击者可以一次搜索两个帐户,但总的来说并不会大大加快整个数据库的搜索速度。对于大多数目的,即使32位盐也可以接受,在最坏的情况下,它将使攻击者的搜索速度提高约58%。将盐增加到64位以上的代价并不高,但是没有安全理由这样做。

在每个用户的盐之上还使用站点范围的盐有一些好处,这将防止与存储在其他站点的密码哈希可能发生冲突,并防止使用通用彩虹表,即使32位的盐足以使彩虹桌子变得不切实际。

如果您有唯一的用户ID或登录名,那么即使是简单的开发人员也总是会忽略这一点,如果您使用的是唯一的用户ID或登录名,那么它们就很好用了。如果这样做,则应在整个站点范围内添加盐,以确保不会与具有相同主意的另一个系统的用户重叠。


16
盐的变化是不可预测的。可预测的盐可以被预测并用于哈希表攻击。例如,如果您的用户名只是userID,那么足够长的纯alpha哈希表将不仅包括所有密码,还包括所有用户名+密码组合。
理查德·加兹登

6
关于最后一段,请注意,如果您使用站点范围内的盐,则应完全是:站点范围内的盐。不是整个应用程序范围,也就是说,您在应用程序中安装的每个新实例都应生成一个新的站点范围盐。例如,如果Windows在每个Windows身份验证数据库上使用相同的盐,则值得为该盐创建一个彩虹表,但是如果每个Windows安装都生成一个新的盐,则不会。
理查德·加兹登

5
问题并不是盐很难被猜到。攻击者无需猜测盐:可以访问哈希的任何人都已经有了盐。问题是,如果您的盐非常常见(例如用户名),则它们可能与其他站点的盐相同,这时,攻击者需要使用更小的彩虹表集才能使攻击可行。这就是为什么要提到按站点添加盐的想法,以避免与其他站点发生这种冲突的原因。
Nate CK 2014年

3
快速说明:如果使用用户名作为替代,如果用户名更改,则可能会出现问题。实际上,(尽管客户的设计文档中有说明),我发现用户经常想更改用户名。
SilentSteel 2014年

5
@ NateC-K,您正在谈论的针对每个站点的盐想法称为胡椒。
Pacerier 2014年

35

当前接受的哈希密码标准为每个密码创建了一个新的16字符长的盐,并将盐与密码哈希一起存储。

当然,应该采取适当的加密措施以产生真正随机的盐。


6
字符定义不正确。你应该说字节
CodesInChaos

10
@CodesInChaos我相信你的意思是八位组 ;-)
user2864740

1
嗨!维基百科的文章似乎已更改-也许您应该参考en.wikipedia.org/wiki/PBKDF2之类的东西?
鲍里斯·特鲁霍夫


24

编辑:我下面的答案按要求回答问题,但“真正的”答案是:只需使用bcryptscryptArgon2即可。如果您要问这样的问题,那么几乎可以肯定您使用的工具水平太低。

老实说,没有合理的理由不让盐与哈希密码具有相同的长度。如果您使用的是SHA-256,则您有256位的哈希值。没有理由不使用256位盐。

从数学上讲,超过256位不会使您在安全性方面有任何改善。但是,使用较短的盐总是可能会遇到彩虹表赶上您的盐长度的情况,尤其是较短的盐时。


10
这并不是什么大不了的事; 用户几乎不会注意到毫秒散列和半秒散列之间的区别,加上密码散列实际上应该花费更长的时间来减慢蛮力攻击-尽管锁定15分钟的典型三击更好。您是否正在“浪费” CPU周期来执行此操作?好吧,无所谓了。无论如何,CPU在空闲时间上花费的时间要比在大多数网站上花费的时间多,那么这有什么关系呢?如果遇到性能问题,请向外扩展。
Randolpho

14
盐防彩虹桌。带有256位哈希的512位盐仍然只会在最终密码中产生256位熵。
Stephen Touset 2011年

8
慢速散列是一项功能,而不是错误。
outis 2011年

7
如果您有3位哈希,那么您的9999位salt仍将仅哈希到3位可能的熵。彩虹表只需要为每个密码找到三个盐,这会导致不同的输出,这是一个恒定的乘法因子,因此从big-O中被丢弃。
Stephen Touset

2
................................................... ....................................特定系统。 目的是阻止预计算攻击,这样哈希不能被搜索并立即转化成明文。使用9999位盐,您的密码仍然是一个秘密,而使用3位盐,您的密码现在已为全世界所知(由于许多人经常重复使用密码,他们可以使用它登录到您的其他帐户)。我觉得很有趣,因为其中有“熵”一词,实际上有5个人赞成您的评论。
Pacerier 2014年

7

维基百科

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

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


在我看来,其他安全系统使用的示例是最佳实践的一个很好的示例。
cjbarth

1
@ mklement0谢谢,我已经更新了答案。
安德烈·涅姆琴科

2

一个答案可能是将要使用的哈希值在安全性方面提供的值用作盐的大小。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.