“经常被引用的 XKCD 方案 [...] 不再是好建议”?

信息安全 密码
2021-09-02 22:18:48

我跌跌撞撞地偶然发现了 Bruce Schneier 的这篇文章,声称XKCD 密码方案实际上已经死了。

现代密码破解者结合了字典中的不同单词:[...]

这就是为什么经常引用的用于生成密码的 XKCD 方案——将诸如“correcthorsebatterystaple”之类的单个单词串在一起——不再是好的建议。密码破解者正在使用这个技巧。

攻击者会将他有权访问的有关密码创建者的任何个人信息提供给密码破解者。一个好的密码破解者会测试地址簿中的姓名和地址、有意义的日期以及它拥有的任何其他个人信息。[...] 如果你的程序曾经将它存储在内存中,这个过程会抓取它。

他的论点似乎是因为众所周知,人们可能会以一种易于攻击的方式构建密码,但似乎力量完全在于指数的力量。我想他是在暗示人们不是真正随机选择单词,这也许不是完全不诚实,因为我已经重新滚动了几次以获得不全是副词和形容词的东西。但是,我认为将熵降低 2 到 10 倍并不是很重要(如果单词列表加倍到 4000,不是那么难,损失就超过了恢复)。

关于“如果你的程序曾经将它存储在内存中”的另一个俏皮话有点令人不安......不是所有密码都存储在内存中吗?似乎有点过于宽泛了。他实际上指的是什么?

4个回答

圣战

我想你会发现生成密码的正确方法可能会引发一场圣战,每个小组都认为对方犯了一个非常简单的数学错误或没有抓住重点。如果你让 10 位计算机安全专家在一个房间里问他们如何想出好的密码,你会得到 11 个不同的答案。

误解

没有关于密码的一致建议的众多原因之一是这一切都归结为威胁建模问题。你到底想防御什么?

例如:您是否试图防范专门针对您并知道您的系统生成密码的攻击者?或者您只是某个泄露数据库中数百万用户中的一员?您是在防御基于 GPU 的密码破解,还是防御弱的 Web 服务器?您是否在感染了恶意软件[1] 的主机上?

我认为您应该假设攻击者知道您生成密码的确切方法并且只是针对您。 [2] xkcd 漫画在这两个例子中都假设这一代的所有细节都是已知的。

数学

xkcd 漫画中的数学是正确的,不会改变。

对于我需要输入并记住的密码,我使用了一个python 脚本来生成真正随机的 xkcd 风格的密码。我有一本包含 2^11 (2048) 个常见的、易于拼写的英文单词的字典。我可以将完整的源代码和我的单词列表的副本提供给攻击者,仍然会有 2^44 个可能的密码。

正如漫画所说:

1000 Guesses / Sec 对弱远程 Web 服务的合理攻击。是的,破解被盗的哈希更快,但这不是普通用户应该担心的。

这在易于记忆和难以破解之间取得了很好的平衡。

如果我们尝试更多的力量呢?

当然 2^44 没问题,但 GPU 破解速度很快,而且只会越来越快。Hashcat可以在几天而不是几年内破解该大小的弱哈希 [3]。此外,我还有数百个密码要记住。即使是 xkcd 风格,它也会在几次之后变得困难。

这就是密码管理器的用武之地,我喜欢KeePass,但还有很多其他的基本相同。然后你可以生成一个更长的 xkcd 密码短语,你可以记住(比如 10 个单词)。然后为每个帐户创建一个唯一的 128 位真正随机密码(十六进制或基数 64 都可以)。128 位在很长一段时间内都足够强大。如果您想变得更大,那么生成 256 位十六进制密码无需额外工作。


[1] 这就是记忆的来源,如果你在一个受损的主机上,你已经丢失了。如果攻击者可以键盘记录/读取内存,则键入它或使用 KeePass 之类的程序复制和粘贴它都没关系。

[2] 而不是较弱(但更有可能)假设攻击者刚刚下载了一个名为“Top Passw0rdz 4realz 111!”的字典。

[3] 当然我们都应该使用 PBKDF2 等……但是很多网站仍然使用 SHA1。(他们是好人)

施奈尔写道:

这就是为什么经常引用的用于生成密码的 XKCD 方案——将诸如“correcthorsebatterystaple”之类的单个单词串在一起——不再是好的建议。密码破解者正在使用这个技巧。

但理解他真正追求的关键是在他的文章中更进一步:

仍然有一个可行的方案。早在 2008 年,我描述了“施奈尔方案”

就是这样了。Ole' Bruce 想要断言他的计划是唯一的,最好的,赢家,最终的计划。因此,无论这种说法是否科学合理,他都需要对“竞争对手”说一些贬损的话。

在这种情况下,一直假定攻击者知道密码生成方法。这就是熵计算的重点。分析攻击者“使用这个技巧”根本没有改变(当攻击者知道密码生成方法时,熵计算准确地描述了密码强度;当攻击者无能且不知道密码生成方法时,密码强度为只是更高,几乎无法量化)。

关于“记忆中的密码”的俏皮话只是更加不连贯的胡言乱语。密码必须在某个时候进入 RAM,无论您是键入密码还是从密码保险箱复制粘贴密码,或类似的东西。

我的猜测是布鲁斯喝醉了。

在 2016 年 8 月 2 日举行的 Reddit AMA(通过 archive.org,原始链接)中,特别要求更新Schneier 就他的密码短语谴责发表评论。他继续倡导他的密码创建系统作为随机单词密码短语的更好替代方案。Schneier 确实说过他的方案“比其他方法为每个可记忆的字符提供更多的熵”,与组成单词的字符相比,这是正确的。但是,当系统依赖于记住单词而不是字符时,这也是无关紧要的,并且您可以组合足够的单词来为整个密码短语生成足够的“熵”。

[披露:我为 1Password 的制造商 AgileBits 工作]

早在 2011 年,我就在Toward Better Master Passwords中提倡类似 XKCD 的方案(在它被称为之前)的原因之一正是因为它的强度不依赖于攻击者知道你使用的方案。如果我可以引用自己的话

Diceware 的伟大之处在于,即使假设攻击者知道所使用的系统,我们也确切地知道它的安全性。安全性来自掷骰子的真正随机性。鉴于观察到密码破解者的速度[针对 1Password Master Password] ,使用四五个词应该足以应对未来几年的合理攻击

XKCD 漫画没有有效传达的是,单词的选择必须是(统一的)随机的。如果你让人类随机挑选单词,你会严重偏向具体名词。这种偏见可以而且将会被利用。

你想要多少力量

在一个完美的世界中,我们希望我们的密码强度与我们用它保护的密钥一样强大。说 128 位。但尽管有这些技术,人类仍无法实现这一目标。因此,让我们现实地看待攻击,以及我们可以让我们那微不足道的小大脑做什么。

使用包含 7776 个条目的原始 Diceware 单词列表,您使用的每个单词大约有 12.9 位。因此,如果您想要至少 64 位的密码,那么五个字就可以了。

猜密码比猜密钥慢

在本节中,我得出了一个非常粗略的估计,即对于固定金额的美元,测试密码比测试 AES 密钥慢 2^13 倍。

请注意,测试密码比测试密钥慢得多。如果使用正确类型的密码散列方案,则可以将大多数攻击者的猜测次数控制在每秒 100000 次以下。因此,虽然我们可能永远不想使用 50 位密钥,但使用 50 位密码可能仍然有意义。

如果我们不打算像 Arnold Reinhold 1995 年的原始 Diceware 计划那样仅限于掷骰子,那么我们可以使用更长的单词列表。1Password for Windows 中的强密码生成器使用 17679 个英文单词列表,包含 4 到 8 个字母(去除禁忌词和涉及撇号或连字符的词)。这给出了每个字大约 14 位。所以其中四个给你 56 位,五个给你 70。

同样,您确实需要注意破解速度。早在 1997 年, Deep Crack就能够每秒运行 920 亿次 DES 测试。假设一台高端专用 PC 每秒可以执行 100 万次猜测,而经过合理散列的密码每秒可以执行 100 万次猜测,那么今天的密码比 1997 年的 DES 密钥更难破解 16 位。

因此,让我们看一下Stack Exchange对双核 3.8GHz 处理器的估计:每秒 6.7 亿个键。如果我们假设硬件成本为 5000 美元,我们每秒可以轻松超过 100 亿个密钥。所以在类似的硬件成本下,密钥破解仍然比密码破解快 2^13 倍以上。

修改后的密码强度目标

根据我的估计,测试一个散列良好的密码比测试一个 AES 密钥要贵 2^13 倍,我们应该考虑一个相当好的散列密码比它的实际熵在破解方面强 13 位. 如果我们想达到 90 位的“有效强度”,那么 77 位的密码强度应该可以做到。这是通过原始列表中的六个字 Diceware 密码(77.5 位)和从 17679 个字的列表中抽取六个字的 84.6 位来实现的。

我不希望大多数人使用密码那么久。我希望人们会使用 4 或 5 个单词长的东西。但是,如果您真的担心 NSA 会追踪您的密码,那么假设您使用了一个不错的密码哈希方案,那么六个词就足够了。

仅非常粗略的估计

我没有花很多时间研究成本和基准。在我的估计中有很多事情需要争论。我试图保守(对我提倡的方案持悲观态度)。我也对“散列良好的密码”含糊其辞。同样,我对 1Password 中的密码散列非常保守。(对于我们的新数据格式,攻击者的猜测次数一直保持在每秒 20,000 次以下,而对于我们的旧数据格式,对于多 GPU 机器,攻击者的猜测次数已达到每秒 300,000 次。在我的估计中,我每人选择了 100 万次猜测第二个是“合理散列的密码”。)

还有一些历史记录

“XKCD-like”密码的总体思路至少可以追溯到1980 年代初期的S/Key 一次性密码。这些使用了 2048 个一到四个字母单词的列表。一个六字的 S/Key 密码可以获得 66 位。我不知道这种使用从列表中随机选择的单词作为密码短语的想法是否早于 S/Key。

1995 年,Arnold Reinhold 提出了Diceware我不知道他当时是否知道 S/Key。Diceware 是在为 PGP 开发密码短语的背景下提出的。这也是在大多数计算机拥有适合加密的随机数生成器之前。所以它实际上涉及掷骰子。(虽然我信任我使用的机器上的 CSPRNG,但我仍然喜欢“累积新密码”)。

2011 年 6 月,我在Toward Better Master Passwords中重新对 Diceware 产生了兴趣,并进行了一些额外的修改。这导致了我 15 分钟的成名。在 XKCD 漫画出来后,我制作了一个极客版,通过了一些数学。

2011 年 7 月,兰德尔·梦露(Randall Monroe)接受了类似 Diceware 的计划并出版了他现在著名的漫画由于我不是这个想法的发明者,我完全不介意被漫画抢先一步。确实,正如我在后续文章中所说

兰德尔·梦露(Randall Monroe)用非技术性的术语说了将近 2000 个字,他能够用漫画来概括。这只是显示了数学的力量......

但是有一点关于漫画的解释确实让我担心。我和已经理解该方案的人都清楚,必须通过可靠统一的随机过程来选择单词。从你的脑海中“随机”挑选单词并不是一个可靠的统一过程

XKCD 密码方案与以往一样好。安全性并不是因为它是未知的,而是因为它是一种从大型搜索空间生成令人难忘的密码的好方法。但是,如果您选择要使用的词而不是随机生成它们,那么这种优势就会丧失——人类不擅长随机化。

关于内存的那一点说明得不好,但它一个问题:如果窃取密码的恶意软件曾经进入您的计算机,它将从 RAM 和硬盘驱动器中清除所有文本,如用于对您的帐户进行定向攻击。