鉴于渴望为系统的每个用户拥有唯一的盐,实际上是否有必要为每个用户创建一个密码随机的盐? ID,用户名或电子邮件地址),如果仅使用该值作为盐,安全性是否会有效降低?它为每个用户带来唯一的盐,并且不需要额外为每个用户生成和跟踪新值。

#1 楼


如果您的系统已经具有其他唯一的用户标识(例如ID,用户名或EmailAddress),那么仅使用该值作为盐就可以有效降低安全性吗?


哈希中的盐实际上有两个不同的用途。通常,已知盐是可以接受的,因此让我们考虑将H()作为哈希函数,S,一些数据和P加以保护。根据此信息,我们存储H(S+P)S。为攻击者生成H(S+P)的彩虹表有两个后果:



它们可以为可能为S+P的所有可能性生成巨大的彩虹表。您希望在哈希中反转的数据越长,彩虹表的数据存储需求就越大,因此,延长哈希数据的长度将使其无法通过生成通用彩虹表来反转哈希。
攻击者可以为特定盐缺少的特定输入字段生成彩虹表。显然,彩虹表的用途仅限于要攻击的一组特定哈希,因为理论上所有其他哈希都应该是无用的。

在1)的情况下,添加为盐的任何东西都会确实,确实如此。问题是两个的情况。使用唯一的随机盐的原因是,针对特定的哈希输出冲突的盐的机会大大减少了。例如,对userid:fred:mypassworduserid:fred:myotherpassword进行哈希处理,生成一个彩虹表,知道盐userid:fred,并且哈希文本的正确构造将在两种情况下均有效。

评论


$ \ begingroup $
据我所知,将全局(即特定于数据库的随机)盐与用户ID一起用作哈希输入,对于每位用户都是随机盐,对于攻击者而言,两者的相似性都很好。在两种情况下都必须为一个用户在一个系统上创建一个彩虹表。我在这里错了吗?
$ \ endgroup $
–PaŭloEbermann
2011年7月12日在22:21

$ \ begingroup $
@PaŭloThomas用两个密码的相同盐问题在评论中回答了这个问题。也许我应该为此准备3)?另外,还有一个实际的考虑因素-如果出于任何原因更改用户名会怎样?您需要重新计算哈希值,因此需要输入密码。您可能会接受也可能不会接受。
$ \ endgroup $
–user46
2011年7月12日在22:27

$ \ begingroup $
好的。现在,避免重复的密码具有相同的哈希值是我在这里看到的唯一优势。 (并且允许在不输入密码的情况下更改用户名-我想通常并不需要这样做。)
$ \ endgroup $
–PaŭloEbermann
2011年7月12日在22:44



#2 楼

盐必须是唯一的。随机性(使用“好的”随机数生成器)足以确保唯一性。

每个用户的ID(例如用户登录名)不足以确保唯一性,因为它不能捕获某些出现的事件确实发生在实践中:


两个用户在两个不同的系统(运行相同的软件)上共享相同的ID(有多少个Joes和Bobs?)
决定更改密码的用户(旧密码和新密码将共享相同的密码)

即使这两种情况在您的情况下都不必担心,您也无法确定您想到了所有可能的情况。另一方面,足够长的随机盐(例如128位或更多)并填充有适当良好的随机位(来自密码安全的生成器),可证明产生所需的唯一性(以压倒性的可能性)。

评论


$ \ begingroup $
如果新密码和旧密码共享相同的盐,为什么会出现问题?
$ \ endgroup $
–PaŭloEbermann
2011年7月12日在21:13

$ \ begingroup $
首先,我考虑使用系统特定的全局盐,并结合用户的登录名。
$ \ endgroup $
–PaŭloEbermann
2011年7月12日在21:14

$ \ begingroup $
@Paũlo:旧密码对攻击者来说很有价值,因为它们对于其他系统上的同一用户可能是有效密码;旧密码也可以是非常新的密码:某些(许多?)用户在2或3个密码列表中“轮换”。
$ \ endgroup $
–托马斯·波宁(Thomas Pornin)
2011年7月12日在21:18

$ \ begingroup $
Paŭlo,如果存在全局盐,那么使用相同密码的任何两个用户最终将在数据库中具有完全相同的密文。而且,即使您将这些盐与用户ID结合使用,攻击者也可以通过将所有密码与所有用户ID组合在一起来获取密钥。使用全局盐值意味着对具有相同盐值的密码进行XOR运算,并且鉴于攻击者也了解用户ID(在此它们各自充当第二个透明盐),因此使用这种意义不大这样的价值。
$ \ endgroup $
–uygar.raf
2011年7月12日在21:19



$ \ begingroup $
@uygar:当然是全局盐+用户ID。
$ \ endgroup $
–PaŭloEbermann
2011年7月12日在21:20

#3 楼

盐的真正目的是做到这一点,以使攻击者甚至在知道盐之前就无法开始使用其资源进行蛮力攻击,因此,可以在入侵后花宝贵的时间来更改密码。

如果以任何可预测的方式生成盐,那么攻击者就已经在破解密码方面占了先机-他们可以在实际违反密码之前完成所有计算工作(以他们感兴趣的盐的彩虹表形式)。系统以获取密码哈希。

将盐随机保存,保留较长的时间,使其保密,并按哈希进行个性化设置。您可以向其添加全局哈希作为附加哈希,但是它也应该是长且随机的,并且应该事先计划好如何处理经常更改它。

#4 楼

盐的目的是使得难以预先计算逆哈希表,并防止生日不足。这些都不要求盐是随机的,只是唯一的。

在现实生活中,默认情况下,Kerberos使用用户名和领域作为盐。考虑到Kerberos的性质,对于给定的用户,它绝对必须是可预测的。但是,由于用户名+领域是唯一的,因此您无法一次预先计算彩虹表并将其用于世界上的每个站点。即使在使用仅领域盐的较弱配置中,您也必须针对要攻击的每个域重新计算它。