Diceware 是否比长密码更安全?

信息安全 密码
2021-09-04 14:37:32

我最近调查了有关密码的最佳实践,绝大多数消息来源都建议使用密码管理器。这是一个很好的建议,但并非在所有情况下都可用。某些情况,例如操作系统登录、磁盘解密或密码管理器解锁,不允许我让密码管理器“为我输入密码”。

因此,我研究了第二好的替代方案,它似乎是 Diceware 和 Passphrases。让我难过的是一个相关问题的答案,它暗示 Diceware 更胜一筹。摘自答案:

密码短语非常适合锁定密码管理器Diceware更好) , [...]

强调我的

让我感到困惑的是,为什么有人声称 Diceware 是优越的?我使用zxcvbn比较了下面两个示例密码的强度,似乎密码短语比 Diceware 密码更安全。此外,Passphrase 生成了一个视觉图像,虽然很荒谬,但很容易记住。我能想象的唯一缺点是密码短语需要更长的时间才能输入,考虑到它只需要输入一次密码管理器就可以再次使用,这是一个边际缺点。


例子

骰子

Diceware是掷一组骰子的过程,这将指示预定义列表中的随机单词。根据所需的安全性,选择更多的单词。

Diceware 进程的示例结果可能是密码:

cleft cam synod lacy yr wok

密码短语

密码短语本质上是一个句子,它对用户有意义,希望对其他人没有意义。它可能具有语法意义,但不太可能具有语义意义。

密码短语的一个示例是:

Blue Light shines from the small Bunny onto the Lake.
4个回答

大多数使用密码短语的人使用错误的密码短语。

Diceware 更好的评论可能来自这样一个事实,即当人们使用密码短语时,他们通常会使用一个众所周知的或其他逻辑结构的句子并使用它。“玛丽有一只小羊羔”是一个可怕的密码短语,因为它是计算机可以在短时间内运行的数十亿个众所周知的短语之一。我知道这很好用,因为我试过了

Diceware 只是随机的单词。假设您使用良好的随机性来源,它与任何其他随机生成的单词集一样好:对于 Diceware,您应该使用 dice,这是一个相当好的来源。数字密码生成器通常也很好,尽管自制软件的实现可能会错误地使用不安全的随机生成器。

我们知道任何随机密码都是好的,因为它是基本的数学。密码短语有两个属性:

  • 字典大小
  • 短语中的单词数

密码的“随机性”很容易计算:dictionary_size ^ words_in_phrase,其中^是幂。3 个单词的密码短语和 8000 个单词的字典是8000^3=5120 亿个可能的短语。因此,攻击者在猜测短语时,必须尝试 2560 亿个短语(平均)才能猜对。与类似强度的密码进行比较:使用 7 个字符的随机密码,由 az 和 AZ 组成,“字典大小”为 52 (26 + 26),“单词数”为 7,52^7=大约有 10280 亿个可能密码。众所周知,7 个字符是非常不安全的,即使是随机生成的。

对于随机性,在大约 128 位熵之前,它越多越好。比这多一点有助于缓冲算法的加密弱化,但实际上,无论如何你都不想记住 128 位的熵。假设我们想要获得 80 位的熵,这对于几乎任何事情都是一个很好的折衷方案。

要将“可能值的数量”转换为“熵的位数”,我们需要使用以下公式:log(n)/log(2),其中n是可能值的数量。因此,如果您有 26 个可能的值(1 个字母),那将是log(26)/log(2)=大约 4.7 位的熵。这是有道理的,因为您需要 5 位来存储一个字母:数字 26 是11010二进制的。

8000 个单词的字典需要大约 7 个单词才能超过所需的 80 位:
log(8000^7)/log(2)=约 90.8 位熵。六个词是:
log(8000^6)/log(2)=~77.8 位熵。

与 7776 个单词的相对较小的 Diceware 词典相比,大词典有很大帮助。牛津英语词典有600k 单词有了这么多的单词,一个由四个随机选择的单词组成的短语几乎就足够了:
log(600 000^4)/log(2)=大约 76.8 位的熵。

但是在 60 万字中,这包括非常晦涩和冗长的单词。一本包含您可以合理记住的单词的字典可能有十万左右。从 10 万个单词的字典中随机选择时,我们的短语中需要 5 个单词,而不是 Diceware 需要的 7 个单词:
log(100 000^5)/log(2)=约 83.0 位熵。

在您的短语中添加一个单词比在您的字典中添加一万个单词更有帮助,因此长度胜过复杂性,但一个好的解决方案可以平衡两者。Diceware 对我来说似乎有点小,但也许他们用不同的尺寸进行了测试,发现这是一个很好的平衡。我不是语言学家:)。

只是为了比较,密码(由 az、AZ 和 0-9 组成)需要 14 个字符才能达到相同的强度:log(62^14)/log(2)=约 83.4 位熵。

密码应该易于记忆且难以猜测。正如 AviD 曾经说过的,以牺牲可用性为代价的安全,是以牺牲安全为代价的。密码短语很容易记住,因为它对用户具有某种意义,即使它起初看起来是随机的。看看可用性,密码短语更优越:你不需要骰子和单词列表,你可以自己想一个密码短语并更容易记住它。

但是,使用骰子和随机的单词列表可以得到一个几乎完全随机的密码。没有指向用户的链接,其中大部分时间(除非是真正随机的)密码是由与用户相关的内容组成的。

任何在线密码检查器都只能验证计算机猜测密码的难度,而另一个人可能更容易猜到一个句子(或本例中的密码短语)。在您的示例中,您的 diceware 生成的密码的长度小于密码(但与当今的安全标准相比仍然很长),但正如您自己所说,您可以在需要时创建更长的密码。

我不会说 diceware 总是优越的,但它绝对是更随机的,并且仍然可以具有与密码相同的长度,这使得它在某些情况下更优越。

您引用 Diceware 比密码“更好”的声明没有附加理论上的理由,这使得评估变得棘手。但我可以提出一个这样的理由:Diceware 带有一个用骰子随机生成密码短语的程序,这保证了生成的输出至少有一些最小量的熵(猜测的难度)。由于 log 2 (6) 约为 2.6,因此 Diceware 每次掷骰子时至少为您提供 2.6 位的熵。

另一方面,没有明显的方法可以估计像“Blue Light 从小兔子照到湖上”这样的长自然语言密码短语对于密码破解者来说到底有多难。人们通常认为,因为它很长,所以它会自动变得强大,但事实并非如此。 这篇关于破解很长密码短语的Ars Technica文章在这方面很有指导意义:

[Kevin Young] 与安全研究员 Josh Dustin 联手,这对破解二人组很快决定尝试在网上找到更长的单词串。他们从小做起。他们从《今日美国》中获取了一篇文章,分离出选定的短语,并将它们输入到他们的密码破解器中。在几周之内,他们扩大了他们的来源,包括维基百科的全部内容和古腾堡计划的前 15,000 部作品,该计划自称是最大的免费电子书单一集合。几乎立即,来自 Stratfor 和其他几个月仍未破解的漏洞的哈希值下降了。一个这样的密码是“crotalus atrox”。这是西方菱纹背响尾蛇的学名,它最终出现在他们的单词列表中,由这篇维基百科文章提供. 对杨和达斯汀来说,成功是一种顿悟。

“与其尝试一种对计算机有意义但对人没有意义的蛮力,不如让我们使用人类,因为人们通常会根据人类使用的东西来制作这些长密码,”达斯汀回忆起当时的想法。“我基本上是利用在维基百科上写这篇文章的人为我们拼词。”

几乎立即,大量曾经顽固的密码暴露了自己。其中包括:“我还能再见到你的脸吗?” (36 个字符)、“一开始就是这个词”(29 个字符)、“从创世纪到启示”(26 个)、“我什么都不记得”(24 个)、“thereisnofatebutwhatwemake”(26 个)、“givemelibertyorgivemedeath”(26 个) ) 和“日东月西” (25)。

如果您只是无辜地选择长密码短语,而没有任何合理的理论来说明您的程序为什么会提供强密码短语,那么它们可能容易受到您没有想到的一些攻击。而 Diceware 除了蛮力之外是无懈可击的,因为破解 Diceware 至少与猜测 25 次以上的骰子一样难。


我使用 zxcvbn 比较了下面两个示例密码的强度,似乎密码短语比 Diceware 密码更安全。

在这里,我应该重复我在另一个问题的答案中详细阐述的一点:

  • 密码强度计可以最终证明密码短语很弱;
  • 但是没有这样的仪表可以证明密码是强大的,因为密码可能容易受到仪表无法模拟的某些攻击。

例如,zxcvbn——总体来说是一个优秀的工具,但不是为你的使用而设计的——估计这个密码的世纪:

password:   Am i ever gonna see your face again?
guesses_log10:  31.35342
score:  4 / 4
function runtime (ms):  5
guess times:
100 / hour:   centuries (throttled online attack)
10  / second: centuries (unthrottled online attack)
10k / second: centuries (offline attack, slow hash, many cores)
10B / second: centuries (offline attack, fast hash, many cores)

但这是我从上面引用的Ars Technica文章中摘录的,所以我们知道它在现实生活中已经被破解了。我们有独立的证据证明zxcvbn 的估计是错误的。

zxcvbn 的分析给出cleft cam synod lacy yr wokguesses_log10值为 26.22025,这在技术上比它对Am i ever gonna see your face again?. 但是,如果它是我们通过掷 25 次骰子生成的 5 字 Diceware 密码,我们有独立的证据证明它至少有 log 2 (6) × 25 = 64.5 位熵(其对应的guesses_log10值更像是 19.4,所以zxcvbn 可以说是高估了它的强度)。

对于您的 passphrase Blue Light shines from the small Bunny onto the Lake.,除了您的预感之外,我们没有任何独立的论据来说明它为何强大,因为您已将其发布到 Stack Exchange 的事实破坏了这一点(因此现在可以用作攻击的输入,例如Ars文章解释了什么)。也许它很强大,但像 Diceware 这样的系统所体现的理念是,您不应该将密码强度建立在预感上,而是建立在为您提供最小熵保证的实际随机程序上。

Diceware(tm) 旨在满足几个目标:

安全可用性规范

安全性是通过随机词选择来实现的。正如其他人指出的那样,从一个列表或单词中随机选择的任何密码短语的熵很容易计算:(密码短语中的单词数)* log2(列表中的单词数)。使用骰子消除了对计算机随机数生成器质量的担忧。

通过保持单词简短来增强可用性。Diceware 字的最大长度为 5 个字符。这使得 Diceware 密码更容易准确输入,尤其是在移动设备上。许多受密码保护的系统也限制了允许密码的长度。NIST 的新版密码指南特别出版物 800-63B 建议最多允许 64 个字符,但许多系统允许的字符更少。从更大的列表(例如完整的英语词典)生成的长密码甚至可能超过 NIST 限制。

规定性。如果您正在阅读 StackExcange,您可能在技术上足够聪明,可以组成一个实际上安全的密码短语。或许。但是,如果您依赖许多其他用户来创建安全密码,那么他们都会使用典型的指导来发明安全密码的可能性很小。Diceware 是完全规范的。任何人都可以按照说明创建一个强大的密码。