超越“Correct Horse Battery Staple”:屈折语言中的密码短语
Source: Dev.to
TL;DR
我为一种屈折语言构建了一个密码短语生成器。你可以在 niezgadniesz.pl 上尝试(这个名字在波兰语中意为“你猜不到”,非常符合密码短语生成器的承诺)。继续阅读,了解为什么这比预期要困难得多。
密码短语的承诺
你可能已经看过著名的 XKCD 漫画:
correct horse battery staple
比
Tr0ub4dor&3
更强大且更易记忆。
数学计算是成立的。使用 7,776 词的 Diceware 列表随机抽取四个单词,可提供约 51 位熵——足以抵御严肃的攻击,同时对人类友好。
于是我决定为波兰语使用者构建一个密码短语生成器。会有多难?
事实证明,非常难。而其中的原因揭示了一个关于密码安全的重要点——大多数以英语为中心的讨论根本没有涉及。
密码安全中的英语特权
English is what linguists call an analytic language. Words don’t change much based on their grammatical role. “Horse” is “horse” whether it’s the subject, object, or part of a prepositional phrase.
Polish, by contrast, is a synthetic language with a fusional morphology. This means:
- 7 grammatical cases(主格、属格、与格、宾格、工具格、地点格、呼格)
- 3 grammatical genders(阳性、阴性、中性——其中阳性进一步分为人称、动物性和无生命)
- Adjectives must agree 与名词在格、性和数上保持一致
- Verbs conjugate 根据人称、数、性和体进行变化
一个看似简单的例子却并不简单
Take the English phrase “correct horse.”
Polish translation: “correct” → poprawny, “horse” → koń.
但是我们应该使用哪种格?
| Case | Polish phrase |
|---|---|
| Nominative | poprawny koń |
| Genitive | poprawnego konia |
| Dative | poprawnemu koniowi |
| Accusative | poprawnego konia |
| Instrumental | poprawnym koniem |
| Locative | poprawnym koniu |
| Vocative | poprawny koniu! |
那是同一个两词短语的七种不同形式。而且我甚至还没有涉及复数形式(另外七种变化)。
熵问题
如果你的生成器只输出词的词典形态(主格单数),母语者会立刻注意到不连贯:
zielony pies szybki drzewo
(green dog fast tree)
波兰语使用者阅读后会立即注意到语法不匹配。每个词都独立以词典形态出现,缺乏格的配合或自然的连贯性。
这对安全性有影响吗?
不。密码短语的强度来源于词语选择的随机性,而不是其自然程度。尝试所有可能的四词组合的攻击者并不在乎你的短语是否符合语法——他们会尝试每一种组合。
这对记忆性有影响吗?
可能是的。我们的脑是擅长匹配模式的机器,进化来处理语言。一些研究表明,我们更容易记住语法连贯的短语,因为它们形成单一的认知单元,而不是四个独立的项目。
然而,形象性成为关键因素。即使是语法尴尬的短语,只要每个词都能唤起生动的心理图像,也会变得容易记忆。
giraffe keyboard ocean sock
违背了波兰语的所有语法规则,但你现在可能已经能想象出——一只长颈鹿在海洋中漂浮的键盘上打字,穿着袜子。这个心理图像才是你的记忆锚,而不是语法。
Source: …
实现噩梦
假设你仍然想生成语法上合理的波兰语短句。你需要以下内容:
1. Part‑of‑Speech Tagging
不能随意把词拼在一起。必须知道哪些词是名词、形容词、动词、分词等。
- 名词:dom(房子),kawa(咖啡)
- 形容词:duży(大的),gorąca(热的)
- 动词:biegnie(跑),śpi(睡)
- 分词:biegnący(跑步的),śpiący(睡觉的)
2. Gender Assignment
每个名词都有固有性别,形容词必须与之匹配:
| Gender | 示例 |
|---|---|
| Masculine | duży dom(大的房子) |
| Feminine | duża kawa(大的咖啡) |
| Neuter | duże dziecko(大的孩子) |
使用错误的词尾会立刻被识别为机器生成。
3. Case Declension Tables
对于每一对形容词‑名词,你需要完整的格变表。单个形容词如 duży(大)在单数中就有 14 种形式:
| Case | Masculine | Feminine | Neuter |
|---|---|---|---|
| Nom. | duży | duża | duże |
| Gen. | dużego | dużej | dużego |
| Dat. | dużemu | dużej | dużemu |
| Acc. | dużego / duży* | dużą | duże |
| Ins. | dużym | dużą | dużym |
| Loc. | dużym | dużej | dużym |
| Voc. | duży | duża | duże |
*宾格阳性形式取决于名词是有生命的还是无生命的。
4. Verb Conjugation
如果加入动词,它们必须在人称和数上与主语一致——在过去时,还要在性别上保持一致:
On biegł – 他在跑(阳性)
Ona biegła – 她在跑(阴性)
Ono biegło – 它在跑(中性)
两种方法(及其权衡)
经过大量实验,我确定了两种可行的策略:
方法 1:仅使用词典形式
只使用主格单数形式,并接受短语听起来像是分散的单词列表。这是最简单的实现方式,并且保持了清晰的熵计算。
żyrafa klawisz morze skarpeta
(giraffe key sea sock)
方法 2:语法上合理的短语
生成完整的变格表,强制性别和格的匹配,并可选地包含动词变位。这会产生自然听感的短语,但需要更大的语言资源和更复杂的代码。
要点
- 熵与语言无关。 无论短语是否符合语法,都不会影响原始的随机位数。
- 可记忆性受形象性影响,并且在可能的情况下,语法连贯性也有帮助。
- 实现一个合成语言生成器是一项非平凡的语言工程任务。
如果你想尝试该生成器或深入研究源代码,请前往 niezgadniesz.pl。祝你(安全地)创建密码!
两种方法的优缺点
方法 1 – 仅使用词典形式
优点: 实现简单,熵的计算直接。
缺点: 对部分用户来说,短语可能稍微难以记忆;对母语者而言听起来不自然。
方法 2 – 基于模板的生成
创建定义句子结构的语法模板,然后构建匹配每个槽位的词表。词语必须在模板中在性、格、数上保持一致。
Template: [Adjective‑NOM] [Noun‑NOM] [Verb‑3SG] [Adverb]
Example: "Zielony pies biega szybko"
(Green dog runs quickly)
优点: 输出自然,母语者更容易记忆;语法正确。
缺点: 需要大量语言学工作来构建分类词表;每个词的熵可能低于简单列表;在安全性计算时必须考虑结构约束。
我实际构建的
我选择了 方法 2:基于模板的生成。实现过程需要构建按词性和语法性别分类的单词列表,然后定义确保正确一致性的模板。
语言学基础来自于利用一个全面的波兰语形态词典——一个开源资源,包含超过 300 万个词形及完整的语法标注。通过编程方式,我可以按性别提取名词,按变位模式筛选动词,并确保每个词形都带有完整的语法元数据,而无需手动分类单词。
有趣的事实: 我的生成器目前使用了 197 个语法类别——这还不到波兰语所有可能类别的 10 %。这语言真的如此复杂。
结果是:听起来自然的波兰语短语,例如:
"Wysoki słoń biega cicho"
(Tall elephant runs quietly)
当短语听起来像真实的波兰语句子时,用户会调动他们的自然语言记忆,而不是把每个单词当作需要单独记忆的项目。语法结构成为把单词粘合在一起的支架。
为构建多语言安全工具的开发者提供的经验教训
- 语言复杂性差异巨大 – 对英语有效的方法未必适用于波兰语、芬兰语、匈牙利语、阿拉伯语或日语。每个语系都有其独特的挑战。
- “简单”功能隐藏语言深度 – “只翻译词表”从来不只是翻译。你需要处理形态学、句法、音系以及文化关联。
- 熵计算必须考虑结构 – 如果你的生成方法使用模板或语法模式,你的有效熵取决于词汇选择 以及 结构选择。请在安全计算中明确说明这一点。
- 用户测试不可或缺 – 本族语使用者会立刻发现不自然之处。在假设方案可行之前,务必进行真实用户测试。
- 投入语言基础设施 – 构建合适的语法模板和分类词表需要大量前期工作,但能显著提升用户体验。本族语使用者会注意到并欣赏生成内容对其语言结构的尊重。
更广泛的观点
密码安全讨论主要由英语视角主导。但大多数互联网用户并非以英语为母语,我们构建的工具应当适用于所有人。
了解不同语言如何处理词形构成不仅在学术上有趣——在全球范围内构建安全、可用的身份验证系统时,这实际上是必不可少的。
如果你在开发安全工具,请花时间了解用户的语言环境。你语言中看似“显而易见”的解决方案,在另一种语言中可能完全错误。
你是否构建过多语言安全工具?我很想听听你遇到的语言挑战。请在下方留言!