正确的语法如何影响密码安全?

信息安全 密码 密码破解 密码
2021-08-30 12:04:45

当使用XKCD 密码方法时,熵仅基于单个单词计算,假设单个单词是独立的。当然,这不一定是一个有效的假设,除非您在生成密码时特别确保它;由四个随机且独立的单词组成的密码仍然比语法正确的短语更难记住。zxcvbn类似地仅根据找到的单个单词报告熵,而没有明显地执行任何相对频率的计算。

据推测,使用足够大的 N-gram 数据库,您可以生成一个相当复杂的正确英语单词用法的统计模型,并相应地对 XKCD 形式的密码猜测进行排序。所以,问题是:与独立选择的相同数量的单词相比,如果使用一个令人难忘的语法短语作为密码,会损失多少熵?语法密码必须多长时间才能提供等效的熵/安全性?密码破解者真的使用这种方法吗?

3个回答

通常,任何可以缩小密码搜索空间的信息都会降低该密码的强度。因此,从理论上讲,假设语法正确的密码可能比不相关单词的集合或有故意的语法错误的密码弱,这是有道理的。但是,准确计算差异是非常困难的。

许多密码破解程序将允许您定义复杂的模式。例如,据观察,人们经常使用日期作为在密码中包含数字的一种方式,即密码 1961 甚至密码 171067(或美国日期的密码 101767),因此一些密码破解者会搜索 [ditonary-word][year ] 和 [dictionary-word][date],其中年份/日期中的数字将被限制为有效且在“预期”范围内的数字(即假设年份/日期与当前/最近时期或用户有关出生日期等)。同样,对密码的研究表明,人们倾向于将“特殊”字符放在密码组件的边界处,例如密码:1972。这可能表明最好不要使用这种格式的数字并考虑使用 3、5、

作为一个破解者,使用语法的挑战在于如何对其进行建模。例如,英语的语法非常复杂。这就是自然语言处理如此具有挑战性的部分原因。从理论上讲,如果您可以足够准确地定义语法并拥有足够大的字典,则可以生成一个可以生成 /valid/ 句子字典的系统。然而,这仍将代表一个非常大的搜索空间。如果您确切知道密码中有多少个字符,这将有助于减少搜索空间,但它会非常大。需要确定的是,与仅由连接在一起的随机单词组成的类似字典相比,这样的字典要小多少。它会更小,但它是否足够小以产生任何实际差异是未知的。

而不是基于语法的字典,我可能会根据引用、著名的诗歌和歌词编写字典。我的理论是,当人们使用短语作为密码时,该短语将很容易记住,因此很可能基于歌曲、诗歌或最喜欢的名言。这将是一个更小的字典。挑战在于建立数据库并确保其足够全面。考虑到所有引用、歌曲、诗歌等的数字存储库,这可能会变得越来越容易。

就个人而言,我不会担心太多。显然,最好不要使用众所周知的短语,并且不要使用某人可能能够通过社会工程技术识别的短语是非常重要的。如果您是军人,请不要使用著名的军事名言/演讲,如果您是基督徒,请避免使用圣经中的名言,如果您是某个歌手/演员/其他人的狂热粉丝,请避免使用该人的名言。从本质上讲,避免使用任何对您进行研究的人可能会用来缩小搜索空间的任何东西。我还建议使用尽可能长的短语。一个很长的已知引用可能比一组较短的随机词更强,这仅仅是因为搜索空间更大。

如果你能记住一组随机的单词,那么就这样做。但是,如果不能,请使用语法正确的短语,但要尽可能长。记住密码可能与确保密码强度一样重要。我经常发现许多系统中最薄弱的部分是他们的密码恢复过程,我认为你应该尽可能多地避免使用这样的过程。以相反的顺序输入短语(或您能记住的其他模式),在单词中插入特殊字符和数字,而不是在它们之间,避免使用数字模式,例如 2、4 和 6 位数字,并远离别人可以使用的引号/短语与你交往。

研究论文Effect of Grammar on Security of Long Passwords回答了您的问题。以下是论文的摘要。

“abiggerbetterpassword”和“thecommunistfairy”等长句式或短语式密码的使用正在增加。在本文中,我们研究了此类密码背后的语法结构在降低密码安全性方面的作用。我们表明,研究结果与安全密码策略的设计以及用于加强密码安全的密码破解者有直接关系。使用基于词性标记的分析模型,我们表明由于语法结构的存在而导致的搜索空间减少可能超过 50%。我们工作的一个重要结果是长密码的强度不会随长度均匀增加。我们表明,使用更好的字典,例如谷歌网络语料库,我们可以破解比之前显示的更长的密码(20.5% 对 6%)。我们开发了一种概念验证的语法感知破解算法,以提高长密码的破解效率。在对长密码数据集的性能评估中,总数据集的 10% 是由我们的算法独家破解的,而不是由最先进的密码破解者破解的。

首先:如果您非随机选择单词(例如,遵循语法规则),那么这根本不是 XKCD 风格的密码据我了解,“XKCD 风格”只是指单词列表较小的diceware

语法正确的句子的一个问题是,除非它们是毫无意义的废话,否则它们可能是完全可以预测的。我不知道确切的可预测性,但我知道基本上任何地方打印的任何东西作为密码的基础都是不安全的因此,您需要以某种方式生成一个以前没有人说过的独特短语。

也就是说,您仍然应该能够通过制作像 Mad-Lib 这样的随机无意义短语来制作一个(松散地)遵循语法规则的安全密码短语。只需为每个单词使用不同的单词表来做 diceware。例如,您的密码生成器可以生成以下形式的密码:

{article} {adjective} {noun} {adverb} {verb} {article} {adjective} {noun}, {exclamation}{punctuation}

例如,“时尚的土豚愚蠢地扔出一个笨拙的飞艇,哎呀!”

我认为这样的“句子”比 6 个完全随机的单词都混在一起更容易记住,但显然你的总单词列表必须更大才能实现类似的安全性。

您可以拥有一个包含 4096 个名词、副词、动词和形容词的列表(即总共 16384 个单词)。我们会简单地说,你有 2 个标点符号(. 或 !)和 32 个常见的感叹号(“oh my”、“uh-oh”、“rats”等)。因此,您可以将熵计算为:

1 + 12 + 12 + 12 + 12 + 1 + 12 + 12 + 5 + 1 = 80

请注意,完全确定熵的是每个单词位置的单词列表的大小。攻击者可以确切地知道你是如何生成密码的,除非你真的很不幸并且你设法生成了一个普通的歌词,否则你仍然可以预测密码的安全性,就像 XKCD 风格的规则一样。

关键是每个单词必须是真正随机的,或者每个单词列表必须很大,或者你必须制作很长的短语。

获得不按词性分解单词的大型单词列表可能更容易,分发一个单词列表和一个易于理解的规则更容易,但数学应该完全相同。

免责声明:我不是安全专家,但我我理解这里涉及的数学和概念。