发音密码的安全性

信息安全 密码 验证 安全剧院
2021-08-20 05:01:02

一些随机密码生成器支持生成任何给定长度 n 的可发音单词。假设单词是使用 26 个小写字母导出的,那么长度为 n 的可能单词的数量为 26^n。并非所有这些词都是可发音的。我的问题是任何给定长度 n 可能有多少个可发音的单词?

长度为 n 的可发音词的计数明显小于 26^n,因此攻击者的搜索空间小于 26^n。如果没有确切的答案,计数是否有上限?将可发音的单词设置为密码是安全的还是只是密码生成器的一个奇特功能?最小长度应该是多少?

在密码短语的上下文中,我认为它是由多个常见英语单词连接形成的可发音单词的特殊情况。假设 n len 个单词是使用 26 个小写字母导出的。

n len 个单词的数量 (26^n) > n len 可发音单词的数量 > n len 密码短语的数量 > n len 英语单词的数量。

我对么?

注意:我已经阅读了将长密码短语“horsecorrectbatterstaple”设置为密码的论点,并且不想再次启动它:)

3个回答

很难准确回答的问题。我将在这里专门参考Theodore T'sopwgen (v2.07) 实现 ( pwgen -A0)

这些可发音的密码使用“音素”作为“符号”,而不是单个字符,在(英语偏向)pwgen中,音素可以是 1 或 2 个字符。定义了 40 个(in pw_phonemes.c),25 个是单个字符(az ,除了“q”),15 个是对(双元音),每个音素的平均字符是 1.375(由于辅音/元音交替,使用中接近 1.425)。

音素不是随机组合的,这当然是诀窍,有一些规则可以使最终结果发音,因为pwgen我们(大致)有:

  1. 某些音素不能以单词开头(不包括 2 个音素)
  2. 一些音素不能跟在元音后面(对于 13 个元音音素,不包括 8 个音素)
  3. 选了一个辅音之后再选一个元音
  4. 选择了一个元音:在前一个元音之后,或在双元音上,或随机(60%)选择下一个辅音
  5. 否则允许下一个元音
  6. 不能选择双元音(2 个字符)作为最后一个字符(最明显的副作用是密码永远不会以“q”结尾,因为 q 仅显示为双元音“qu”。)

(如果您可以基于此制定确切的排列数,那就太好了!)

[az] 密码的“符号”是单个字符,对于可发音的密码,它是 1 或 2 个字符的音素。

对于长度为 N 的 [az] 密码,每个符号有 4.7 位 ( lg2(26)),它的估计熵是26^N2^(4.7*N)每个符号(每个字符 4.7 位)。

对于音素,每个符号有 5.3 位 ( lg2(40)),长度为n 个符号的密码的估计熵是40^n2^(5.3*n)(每个字符 3.9 位)。m个符号的音素密码(忽略上述规则引起的任何偏差)平均为 1.375m 个字符。

估计两种密码的最大熵(平均长度相同 n=1.375m)可以近似为26^(1.375m)40^m前者增长得更快 *,并证明了你的断言(长度为 n 的可发音单词的计数显然更少比 26^n )

至少,以这种方式创建的可发音密码应比直接 [az] 随机密码长约 20%,以便具有可比较的熵。假定的优势是发音可能意味着更容易记住,因此对于人类来说,更长的密码实际上可能更容易记住。

由于发音能力的限制进一步限制了这一点。

估计数值差异比较棘手......希望这是一个“数量级”的近似值。pwgen的 40 个音素分解为:

20 CONSONANT
 5 CONSONANT DIPTHONG
 2 CONSONANT DIPTHONG NOT_FIRST
 5 VOWEL
 8 VOWEL DIPTHONG

(无论如何,双元音在来源中拼写错误。)

根据上述规则(并有一些经验证据),我将(大量)近似计算 3-4 个音素(约 5 个字符)的密码。约 80% 的密码是辅音/元音交替的形式,即or ,其余约 20% 有元音对,例如(辅音音素对是被禁止的;它们可能出现在输出字符中,特别是由于到音素“ng”)。(这里的一个问题是,从音素中计算出字符的长度会使问题变得棘手。这不仅仅是一个排列问题,你必须计算出我怀疑的排列的排列以获得准确的答案)。C V C [V ...]V C V [C ...]C V V C

通过计算最频繁的安排来获得合理的估计:

c v c v = 25*13*27*13   = 114075
v c v   = 13*27*13      =   4563
c v c   = 25*13*27      =   8775
v c v c = 13*27*13*27   = 123201
c v v c = 25*13*5*27    =  43875
v c v v = 13*27*13*5    =  22815
v v c v = 13*5*27*13    =  22815
                         -------
                          340119

这里的神奇数字是:25 个没有 NOT_FIRST 的辅音(包括双元音),27 个辅音(包括双元音),13 个元音(包括双元音),5 个可以跟随元音的非双元音

经验数据表明真实数字大约高出 15%,但如果包含更多排列,它们开始超过 5 个字符的长度,给出一个夸大的答案。

一个随机的 5 个字母 [az] 密码有大约 1190 万个排列,这不到其中的 3%。

然后粗略的近似,忽略边缘情况并一次考虑成对的符号,对于pwgen长度为n 个字符的可发音密码,

P = 767 ^ (n/(2*1.4))

其中 767 是,符号对, ,超过 2 的( 27*13 + 13*27 + 13*5 )符号对的排列,而 1.4 将字符长度 n 减少到音素的数量。(在幂中估计数字 1.4 会使公式对微小的变化有些敏感。)c vv cv v

767(有效符号对)消耗大约 2.8 个字符,log2(767)有效熵为 9.6 位( ),每个字符 3.4 位。与 [az] 的 4.7 位相比,我们需要大约 1.35 的整体系数才能使这些密码达到相当的强度,即长三分之一。

为了比较,在pwgen输出中允许随机混合大小写和数字可以让您恢复到每个字符约 4 位,因此pwgen长度为 n(不带-A0)的密码仍然小于相同长度的 [az] 密码(约 4.7)。

(对于经验证明,请注意pwgen仅在长度 >=5 时使用可发音的音素。)

要用作密码,您可能需要至少50 位熵(例如,相当于 [a-zA-Z0-9] 中的 8 个字符 + ASCII 标点符号,每个字符 6.5 位。)这可以通过pwgen -A0密码长度来实现15-16 个字符(每个字符约 3.4 位)。这是具有可比较强度密码的长度的两倍。

n len 个单词的数量 (26^n) > n len 可发音单词的数量 > n len 密码短语的数量 > n len 英语单词的数量。

全部正确(我假设“n len 英语单词”意味着使用单个单词作为密码)。密码短语需要相当长才能有效,可能每个字符 2 位(例如 40k 字,平均长度 8,与不相关的词 - 相关的词较低)。RFC2289中使用的固定短词字典样式方案实现每个字符约 3 位。


* Wolframgraph 26^(1.375n) versus 40^n或者也可以试试这里log plot 26^(1.375n) versus 40^n for n [0,16]缓存的

可发音的词或多或少是音节序列。什么构成音节取决于语言,包括语言变体(英国、苏格兰、美国、印度......英语的版本并不完全相同)。所以我们会做一些近似。

假设我们想要两个字母的音节,总是一个辅音后面跟着一个元音。我们还想避免模棱两可的音节:应该有一个从发音音节到字母的单射映射;因此,我们不会使用“c”或“q”,只依赖“k”和“s”。我们最终得到:

  • 18 个辅音:b、d、f、g、h、j、k、l、m、n、p、r、s、t、v、w、x、z
  • 6 个元音:a、e、i、o、u、y

并不是说这需要像hit 中那样发音“hi” ,而不是high"ge" 在get 中,而不是gel 中等等。

然后我们最终得到 18×6=108 个明确的两个字母音节。那么长度为n的可能密码的数量为108 n /2,即大约 10.39 n如果您想要 10 个字母的密码:

  • 10 个随机字母的序列:141167095653376 个选择
  • 5 个随机音节的序列:14693280768 个选择

将此与可能的英语单词总数进行比较,估计约为 470000(仅)。对于密码短语,给定长度或最大给定长度的密码短语的数量必然大于相同长度的单词数量,因为单个单词是一种密码短语。但是,您的推断是正确的:对于给定的字符长度,独立的随机字母为熵提供了最大的空间,其次是随机音节,然后是随机单词序列(“密码短语”),然后是单个单词。


然而,故事并不止于此。密码的整个概念都围绕着稀缺资源即:

  • 必须记住密码
  • 必须输入密码。

关于“字母数量”的思考主要与第二个资源有关:更多的字母意味着更多的打字工作。并不是说字符类型很重要:如果用户必须使用他的智能手机,那么他会更喜欢小写字母序列,而不是混合字母和数字或不同大小写的密码。

使用“可发音的”密码是一种权衡:我们接受使用更多字母,以便我们可以使用更适合我们回声记忆的密码。请注意,长度为 n 的可能“音节密码”的数量10.39 n,非常接近长度为n(10 n)的纯数字密码的数量;但是很多人会发现记住一个随机音节比记住一个随机的两位整数要容易得多。

回声记忆是否是最好的折衷方案取决于主题。有些人使用图片比使用声音更好(这被称为标志性记忆)。甚至有些人对数字最自在,他们更喜欢n 个随机数字而不是n /2 个随机音节。著名漫画的要点之一是大多数人都记得故事,而有意义的单词序列是构成故事的实质内容。我们可以补充以下几点:

  • 最适合给定用户的不一定是另一个用户的最佳权衡。因此需要几种密码生成方法,以便每个用户都可以使用最适合他的大脑和手指的方法。

  • 用户自己不擅长做出这样的决定,因为他们倾向于认为“看起来很复杂”的密码更安全。事实上,诸如要求字母、数字、混合大小写和标点符号之类的“密码复杂性规则”会吸走稀缺的内存资源,并且打字速度非常快,并且不会提供那么多的熵。这些规则通常很划算,但许多安全专业人士都喜欢它们,并且重复接受的教条关于它们的必要性,因为这些规则提供了可见的安全性(它们给人的安全感比实际的安全感要多得多)。

  • 所有此类分析都依赖于密码组件的独立、随机和统一选择。密码短语中的字母、音节、单词……必须用计算机(或骰子或其他物理设备)生成,而不是用人脑生成。人类无法做好随机性。必须生成密码,然后故事建立在结果之上,而不是相反。必须有用户接受的随机生成。这是最棘手的一点。


最后但并非最不重要的一点是,可发音的密码有一个缺点:它们可能发音为必须让用户清楚地知道,尽管可以说出密码,但不能实际说出密码,因为它可能会落入恶意的耳朵。可发音密码的整个想法是用户在脑海中说出它们。如果密码很容易发音,那么口头分享也很容易(例如与一些同事),总的来说,这是一件相当糟糕的事情。

像往常一样,用户教育是最重要的。无论密码是如何生成的,如果不告知用户应该如何使用密码以及他们不应该使用密码做什么,就无法实现安全性。

将自己限制为仅使用可发音的密码确实会降低熵,从而降低强度。所以理论上密码会弱一些

但是密码强度是一个复杂的野兽。特别是,如果选择可发音的密码意味着您可以记住比平时更长的密码,那么您的熵就会上升,您的密码也会变得更强。

我对密码的看法是:

  1. 尽可能使用两个因素
  2. 使用一个好的密码管理器,在你能记住的地方使用长随机且不可能记住的密码
  3. 对其他所有内容使用 Diceware 密码短语