强制使用复杂密码比盐值加密更重要吗?

11

我花了过去的两个小时阅读有关密码加盐的文章,并确信自己理解了这个概念。我希望你们中的一些人可以分享你们对我的结论的见解。


如果我是攻击者,并且我获得了用户数据库的访问权限,我可以使用表中存在的所有每个用户的盐来创建彩虹表。对于大型表格,这可能需要很长时间。如果我能将列表缩小到感兴趣的用户(管理员,moderator),我可以使用更大的字典列表来创建彩虹表,提高我的命中率......

如果这是真的,那么看起来加盐并没有太多帮助。它只会稍微减缓攻击者的速度。

我知道理想情况下,您希望强制使用复杂密码,并将其用唯一和随机的字符串进行加盐,但强制使用复杂密码可能会令用户感到困扰(我知道它也会令我感到困扰),因此很多网站不这样做。这似乎是网站在对其用户做出错误服务,而强制使用复杂密码比使用良好的加盐方法更为重要。

我猜这不是一个问题,而是请求其他人就该情况的了解分享。


2
您需要明确指定您所考虑的特定加密用途,以及您希望防止的攻击类型。例如,如果您指的是“取表中的所有盐”,那么这意味着什么并不清楚。 - mjv
我并没有特定的加密方法在脑海中。我更感兴趣的是盐值和最佳实践的一般概念。我编辑了它,希望能更清楚,谢谢。 - Galen
7个回答

14

盐的作用在于攻击者不能再使用预先存在的字典攻击系统中的任何用户。他们必须使用该用户的盐为每个用户创建全新的字典,这需要时间和精力。如果在为系统中的所有用户创建字典之前发现了破坏事件,则有时间采取行动(警告用户必须更改其登录凭据,这应该生成一个新的随机盐)。

我认为您应该使用盐以及您的用户可以容忍的最复杂的密码(实际上是密码短语)。即使如此,加盐仍然是一项基本的安全措施,您真的不能没有它。


2
同意,加盐不应该是可选的。这可以消除整个攻击向量,可能会危及整个安全系统,而允许使用弱密码只会危及个人账户。 - Kitson
2
你还应该提到创建每个用户字典是没有意义的 - 直接使用暴力破解破解他们的密码更快。 - Nick Johnson
2
这里最重要的一点是,创建全新的字典所需的时间与直接暴力破解用户的盐值哈希所需的时间相同 - 彩虹表仅在可以针对多个密码哈希使用相同表的情况下才是一种优化。 - caf

6
保持充足的水分摄入比呼吸更重要吗?

5
我倾向于采用每个用户一个盐、全局盐(算法每个盐)和适度的密码复杂性规则(8+个字符,至少有2个大写字母/数字/标点符号组合)来保护大多数网站的安全。使用盐需要为您想要破解的每个帐户生成一张彩虹表——假设每个用户都有唯一的盐。使用全局盐需要同时攻破数据库和应用服务器。在我的情况下,这些始终是两个单独的系统。使用密码复杂性规则有助于防止使用简单易猜的密码。

对于具有更高权限的帐户,您可能需要强制执行更高的密码复杂性。例如,我们 AD 林中的管理员需要有至少 15 个字符的密码。实际上,它比较容易记住,因为它几乎强制您使用短语而不是密码。

您还应该指导用户如何创建好的密码,或者更好的是,短语,并了解各种社交工程攻击,以规避所有技术手段来保护数据的方法。


1
我从未真正理解“全局盐”。假设您使用好的随机数生成器选择每个用户盐值为8字节。全局盐提供了什么进一步的价值呢? - erickson
+1 - 分层策略是保护特权账户的好主意。 - Bill the Lizard
2
@erickson - 通常,每个用户的盐值存储在数据库中。如果您攻击了数据库,那么破解密码只是时间和资源的问题。在算法中存储的全局盐需要他们破解应用服务器和数据库。另一个好处是,黑客在哈希时需要检查三个排列的两倍。 - tvanfosson
在密码短语方面加1分。除了更容易让人记住,同时长度也会增加密码的复杂性。 - Jimmy Chandra
谢谢,我喜欢使用每个用户盐和全局盐的想法。 - Galen

4

好的,让我们看看实际数字:

单个 Nvidia 9800GTX 可以计算 3.5 亿个 MD5 哈希 / 秒。以这个速度,整个小写和大写字母数字字符的密钥空间将在 7 天内完成。7 个字符,两个小时。应用盐只会将这些时间加倍或加倍,具体取决于您的算法。

廉价的现代 GPU 轻松就能夸耀每秒十亿个 MD5 哈希。有决心的人通常会连接起来 6 个,获得 60 亿 / 秒的速度,使得 9 个字符的密钥空间在 26 天内过时。

请注意,我在这里谈论的是暴力破解,因为在这个复杂度水平之后可能适用预像攻击,也可能不适用。

现在,如果您想防御专业攻击者,他们没有理由不能获得每秒 1 兆个哈希值,他们只需使用专门的硬件或一堆便宜的 GPU 机器中的其中一种即可。

然后,您的 10 个字符密钥空间将在 9.7 天内完成,但是 11 个字符的密码需要 602 天。请注意,此时将允许字符列表中添加 10 或 20 个特殊字符,这只会将 10 个字符密钥空间的破解时间分别提高到 43 或 159 天。

密码哈希的问题在于,它只能减少您徒劳无功的时间。如果您想要 真正 强大的东西,但仍像存储哈希密码一样天真,那就选择 PBKDF2。

然后还有一个问题,用户会在所有其他站点上使用您强制他使用的“强大”密码吗?如果他不保存它们在主密码文件中,他肯定会。而那些其他网站不会使用您使用的相同的强散列算法,从而破坏了您的系统的目的。我真的看不出来为什么您希望您的哈希值非常强大,如果不是为了阻止用户在多个站点上使用相同的密码;如果攻击者可以访问您的哈希值,您很可能已经输了。

另一方面,就像我会一遍又一遍地对那些询问他们的哈希方案“安全性”的人重复的那样,只需使用客户端证书,您的所有问题都得到了解决。用户无法在多个站点上使用相同的凭据,攻击者无法在不修改它们的情况下破坏您的凭据,如果用户将其存储在智能卡上,则用户无法轻松地窃取凭据等等。

幼稚地回答您的问题:强密码只有强哈希算法支持。


2
应用盐值只会将这些时间增加一倍或三倍,具体取决于您的算法。嗯,盐并不是为了使破解单个密码更加困难,而是为了防止使用预生成的密码哈希表。 - Nick Johnson
我知道,我所说的是暴力破解时间,如果存在一个强大的随机盐系统,预像攻击通常是无用的。 - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
一个已知的盐不会改变搜索给定空间所需的时间。但由于我们要执行数千次哈希迭代,所以一个包含10个字符的密钥空间需要几十年的时间。 - erickson
是的,但你忘了一个网站的密码通常不是那么重要,除非目标在多个网站上使用相同的密码,在这种情况下,强密码哈希方案将完全无济于事。否则,如果密码对于你的网站非常重要,你很可能已经输了... - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
无论如何,你是正确的,一个_强大的_,_迭代的_,_加盐_哈希算法在无法使用真正身份验证(比如客户端证书)的地方是理想的,但我从未在真实场景中使用较差的哈希技术(除非与客户端证书混合使用)。 - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

3
除了需要长字符串的要求外,每个约束条件都会减少密码相位空间的大小。约束条件会导致复杂度降低,而不是增加。
如果这看起来有些违反直觉,那么请考虑你为破解者提供了一堆可靠的假设。让我用我的青春岁月中的一个真实故事来说明这一点:
在双质数加密的早期,处理器速度非常慢,人们倾向于使用int32算术以获得更快的速度。这使我可以假设质数在0到40亿之间。人们总是选择大质数,因为传统智慧认为越大越好。所以我使用了一个预先计算好的质数字典,并从已知的上限向下工作,因为人们通常选择靠近那个上限的密钥。这通常让我能够在约30秒内破解他们的密钥。
坚持使用长密码短语,并使用盐,没有其他限制。
当人们说“复杂”的技术时,他们通常指的是复杂。一个变换可以非常复杂,但仍然是可交换的。不幸的是,如果你不知道这意味着什么,那么你就无法评估该技术的优点。算法的复杂性只能提供模糊的安全性,就像在城外买一所房子而不锁门一样。

但这难道不会简化破解吗?如果最小密码长度为2,则相当有把握一些用户会选择一个2个字符的密码。对于暴力破解密码攻击来说,这只需要几毫秒,或者至少需要几秒钟来处理一个未知的12位盐值。 - wallyk
我所指的最小密码长度是强制要求相当长的密码。 - Peter Wone

1
使用先进的技术,如盐哈希,来保护用户的私人信息安全。
但不要阻碍用户。提供建议,但不要妨碍他们。
选择好密码是用户的责任。您需要建议如何选择好密码,并接受任何给定的密码,并尽可能保护用户信息的安全性。

1
你有责任确保所有用户设置强密码,以保护其他用户的数据安全。随着数据重要性的增加,执行良好策略的重要性也随之增加。你的数据安全程度取决于最不安全用户对其的访问权限。 - tvanfosson
随着数据重要性的增加,以及有关用户获得更多更重要的数据的访问权限的扩大,考虑实施强密码是有必要的。只要每个用户的帐户仅包含他自己的数据,那么该用户就对自己的帐户负责。 - yfeldblum

1

真正的安全需要同时使用加盐密码和复杂密码。通常彩虹表不是即时创建用于攻击特定网站,而是预先计算好的。相比于基于特定盐值生成查找表,直接暴力破解密码更为高效。

话虽如此,哈希的目的在于确保在数据库被攻击者入侵后,攻击者无法恢复密码。但它对于防止攻击者猜测简单密码没有任何作用。

要求密码复杂度实际上取决于您所保护的网站/数据类型。这会让一些用户感到烦恼,并导致其他人将其密码写在便条上并粘贴在显示器上。我认为,在您的端点使用强大的哈希和盐是绝对必要的——忽略这一点不仅会暴露您的网站,还会完全破坏每个重复使用用户名/密码组合的用户。

因此,在我看来,无论您的网站安全级别如何,加盐都是必须的。强制密码复杂度对于高安全性网站非常有用,但情况确实更具体。它不能保证用户采取良好的安全实践。我还要补充的是,对于不需要安全密码的网站要求使用安全密码可能会带来更多的伤害,因为用户更有可能重复使用他们在其他更重要的网站上使用的高安全性密码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接