假定使用计算昂贵的哈希算法和CSPRNG盐的密码存储方案。用户ID,salt和哈希值存储在表中;如果表被破坏,则所有三个值都可用于对手。

(我认为,只有在对手具有密码表的副本之前和之后,这个问题才有意义,但是我对此可能是非常错误的。)

评论

与其余问题无关,更改密码后,盐应该始终更改。

#1 楼

如果攻击者已经开始创建彩虹表或进行了一些其他需要了解盐的攻击,则更改盐的密码将要求攻击者从头开始。假设攻击者在密码哈希和盐的副本之前和之后都有。

如果盐没有更改,则攻击者所做的任何工作仍可能适用于新密码。甚至可能意味着新密码已经在彩虹表中或已经以其他方式被破解。

评论


$ \ begingroup $
反之亦然:攻击新密码不应使对手同时攻击旧密码,而在现实世界中,该密码仍可用于其他帐户。
$ \ endgroup $
–otus
2014年9月4日上午10:49

$ \ begingroup $
如果每个帐户使用不同的盐,则创建彩虹表将是愚蠢的:它将不起作用,并且将不如直接的详尽搜索。基本上,如果您使用随机盐,即使不更改它们,彩虹表也已经不起作用(它们无法提供比详尽搜索更快的速度)。因此,此答案中列出的所谓优势实际上并不是改变盐分的优势...
$ \ endgroup $
– D.W.
2014年9月4日在17:36

$ \ begingroup $
@DW:假设存储一个彩虹表是可行的,并且进一步假设一次完整的穷举搜索需要时间T,而我每次T / 100都会更改密码,在我看来,如果我更改盐同时,rainbow表是无用的,每个密码被破解的机会为1%。如果我不同时更改盐值,那么彩虹表会很有用,我会破解第一个密码的1%,第二个密码破解2%,因此第100个密码破解了100%一张满桌子的盐这是否是实际攻击...
$ \ endgroup $
–史蒂夫·杰索普(Steve Jessop)
2014-09-4 18:12



$ \ begingroup $
也可以制作一张彩虹桌来瞄准一个特定的高价值目标帐户,尤其是在攻击者知道盐不变的情况下……
$ \ endgroup $
– Richie车架
2014年9月4日19:38在

$ \ begingroup $
@SteveJessop,如果帐户中有高质量的盐,无论如何,彩虹表都没有用。 (我注意到彩虹表存在很多误解……它们很酷,但它们不是魔术,但确实有局限性。)如果您不更换盐,这是不正确的。彩虹表很有用。如果您的食盐是独一无二的,那么使用彩虹表绝对没有意义。如果攻击者知道盐分,那么攻击者还可以进行详尽的搜索;那绝对比彩虹桌子好。如果攻击者不知道盐,他就没有希望。
$ \ endgroup $
– D.W.
2014年9月4日于20:14

#2 楼

如果现有盐是随机的(并且从足够大的空间中选择),则每次用户更改密码时更改盐几乎没有或没有好处。没有缺点-您最好在用户每次更改密码时都更改密码;这可能是个好习惯-但是,如果您不更改盐分,则不太可能发生任何可怕的事情。 。如果您为每个帐户分配一个随机的盐(假设盐是从足够大的空间中选择的),那么彩虹表已经不起作用。 Rainbow table攻击涉及在许多不同帐户之间摊销工作;它们也与预计算有关,在您知道任何密码哈希之前,您需要提前做一些工作。如果每个帐户都有一个随机盐,则每个帐户可能都有不同的盐,因此就没有机会摊销多个帐户的工作;因此,如果每个帐户使用不同的盐,那么rainbow攻击就没有用了,它们比穷举搜索更好。攻击者了解其中存储的所有内容(所有盐,所有密码哈希)。通常,此操作在单个时间点发生一次。在这个答案中,我假设我们正在谈论减轻这种威胁。多次违反密码的威胁在很大程度上是理论上的关注,而在很大程度上是不相关的。因此,重要的是在那个时间点的盐和密码哈希值是多少。过去的值无关紧要,因为攻击者无法看到它们(假设一次密码数据库被破坏)。

因此,假设您一开始就正确选择了盐,那么用户每次登录时更改盐的理由就没有太多了。对于不更改盐就可以进行的任何攻击,该攻击的变种至少速度一样快,并且只要更改盐就可以进行。 />当然,如果您担心自己的密码数据库可能多次遭到破坏,答案将有所不同:如果用户更改了密码,则对同一帐户重新使用相同的盐可能会对攻击者有所帮助在两次违规之间。但是,如果您认为您的密码数据库很有可能遭到破坏,那么您可能会遇到更严重的问题,也许您需要做的不仅仅是调整盐生成方式。每次密码数据库被破坏时更改密码盐的一个很好的理由。实现此目的的一种方法是在密码数据库遭到破坏时强迫用户更改密码,并在用户每次更改密码时编写代码以更改密码。因此,从某种意义上讲,这是用于每次用户更改密码时更改盐的间接参数。但是,只有在您认为您的密码数据库可能被多次破坏的情况下,这才有意义。因为这很容易做到。但是,如果您遇到的代码每次用户更改密码都不会改变,那就不要惊慌;在最坏的情况下,这是一个低严重性的问题,在实践中,这可能无关紧要。

评论


$ \ begingroup $
假设已知一个用户每周切换一次密码,但选择时只需要$ k $熵即可。具有对数据库的只读访问权限的攻击者可以创建所有$ 2 ^ k $ $ k $位密码的哈希表。即使他们没有足够的时间每周破解一个密码,但如果保持不变的话,他们最终还是会破坏所有密码。如果使用新的盐,则每周必须重新开始。
$ \ endgroup $
–otus
2014年9月4日在17:53

$ \ begingroup $
假设爱丽丝有密码“ azerty”,而对手则破坏了密码表。攻击者出于某种原因而将注意力集中在Alice上,并使用Alice的盐对前10,000个密码进行哈希处理。如果在这种情况下,爱丽丝将密码更改为“猴子”,但盐保持不变,则新哈希将位于对手已经计算的表中。如果盐改变了,对手必须重新开始。 (我认为那是otus所说的,但是没有上标,是吗?)
$ \ endgroup $
–鲍勃·布朗(Bob Brown)
2014年9月4日19:30在

$ \ begingroup $
@otus,建议您阐明攻击模型。正常的攻击模型是:在某个时间点,密码数据库已被破坏。在那个时间点,攻击者在那个时间点学习了盐和密码哈希。通常,盐和密码哈希不是公开的,因此攻击者无法在该时间点之前或之后观察其值。因此,即使用户多次更改了密码,攻击者也不会看到一个以上的密码哈希-违反数据库时的密码哈希。因此,这对攻击者没有帮助。
$ \ endgroup $
– D.W.
2014年9月4日在20:17

$ \ begingroup $
@BobBrown,您是否假设密码数据库在两个不同的时间点被两次破坏?那是非常罕见的。
$ \ endgroup $
– D.W.
2014年9月4日20:18在

$ \ begingroup $
我不认为有什么好的方法可以估算密码文件丢失的频率以及所有者没有意识到的频率?我不知道该如何进行研究,但是它可能不比丢失密码文件少几个数量级,而且所有者确实可以找到。因此,每当您丢失密码文件时应执行的所有操作应比每次您发现密码丢失时更频繁地执行!尤其是当您一开始就说过的时候,忽略文件只有一次丢失的假设没有任何不利之处。
$ \ endgroup $
–史蒂夫·杰索普(Steve Jessop)
2014年9月4日20:50



#3 楼

总结和扩展先前的答案和评论,如果一切都按计划进行,则盐只需要与众不同,但实际上,只要更改密码,始终生成新的盐就可以避免攻击。 >


如果攻击者可以使用相同的盐访问多个不同的密码哈希(由于多次泄露或例如旧哈希仍在备份中),则他们可以用更少的时间同时攻击这些哈希时间超出了预期。造成不良后果的原因有多种:


旧密码可能仍然有用。即使不是很好的做法,用户也可能在其他帐户上使用了它们。
一些用户重用了密码的一部分(或包括半秘密的“ pepper”)。如果破解了较早的密码,则可以更快地攻击新密码。


如果攻击者知道了盐,他们可以在用户选择密码之前发起有针对性的攻击。这可能是由于较早的妥协和随后的密码更改导致的,或者可能是公开信息(例如在某些PAKE协议中)。然后,攻击者可以在设法破坏密码哈希时完成大部分工作。通过在每次更改密码时更改盐值,您就可以迫使攻击者在用户更改密码时重新发起攻击。 100位的熵。但是,如果您假设这样做,则也不需要使用慢速密码哈希。实际上,许多用户会选择较差的密码,甚至应该尽可能地对其进行保护。