口令短语生成器

把常见的英文单词随机串成「词-词-词」式的长口令,好记又难猜。页面同时算出这条口令的熵值(bit),让你看清它相当于多少位随机字符。

cobalt-copper-coral-cotton-cradle-crayon-42
amber-badger-camel-dragon-donut-duplex-07
cocoa-daisy-dimple-donkey-drill-drumstick-15
词表大小256 词
总熵值54.64 bit
等价随机字符位数9.18 位
离线爆破(1e12 次/秒)3.91 小时

打开页面即已生成 3 条演示口令(6 词 + 2 位数字)。它们只用于演示,请勿直接当真实账号口令。

词数与熵值对照表(词表每词 bit × 词数;默认显示 12 行本页词表,共 24 行含 Diceware)
词表词数每词 bit总熵 bit等价随机字符位数
本页 256 词28.0016.002.69
本页 256 词38.0024.004.03
本页 256 词48.0032.005.37
本页 256 词58.0040.006.72
本页 256 词68.0048.008.06
本页 256 词78.0056.009.41
本页 256 词88.0064.0010.75
本页 256 词98.0072.0012.09
本页 256 词108.0080.0013.44
本页 256 词118.0088.0014.78
本页 256 词128.0096.0016.12
本页 256 词138.00104.0017.47

使用方法

口令短语生成器用「从词表里随机抽词、再用分隔符拼接」的方式造口令,参数决定强度,按下面的步骤操作:

  1. 设「每句词数」,示例 6;词数越多越长也越难猜,每多一个词就多 8 bit。
  2. 设「生成条数」,示例 3;一次生成多条方便挑一条顺口的。
  3. 选分隔符,示例连字符「-」;分隔符只影响可读性,不改变熵值。
  4. 选「附加数字」,示例末位 2 位数字;纯数字末位可绕过「必须是纯字母」这类旧规则。
  5. 点「生成口令短语」,结果区立即出现多条;在任意输入框直接按 Enter 也会生成,「复制结果」整段带走全部条目。

这个口令短语生成器能解决什么问题

随机字符密码的痛点是记不住:kJ8#fQ2!zR 这类 10 位串熵值虽高,但没人能背下来,最后只能写在便签上。口令短语生成器的思路相反——用几个真实单词换回可记忆性,靠「长度」而不是「怪字符」堆熵值。

场景一,给主密码挑词:6 个随机词加 2 位数字约 54.64 bit,等价于 9.18 位随机字符,但你能在脑子里复述「copper coral cotton cradle crayon」。

场景二,给设备加密盘设恢复短语:把词数调到 8,熵值升到 70.64 bit,等价 11.86 位随机字符,比多数人自创密码强得多。

场景三,给团队发初始口令:一次生成 20 条,每条自带熵值读数,方便按安全等级分组发放。

本页不做的事:不做单词拼音化或中文口令(词表是英文,见下节说明);不检测这条口令是否已出现在泄露库;不保存、不上传任何生成结果。

原理与规则说明

熵值是「猜测难度」的度量,单位是比特:从一个有 N 个等概率选项的池子里独立抽 n 次,总熵 = n × log₂(N)。本页词表 N = 256,log₂(256) = 8.00,所以每词恰好贡献 8 bit;6 词 = 48 bit,再加 2 位数字的 log₂(100) = 6.64 bit,合计 54.64 bit。

抽词必须用密码学安全的随机源。页面调用 crypto.getRandomValues(new Uint32Array(1)) 取一个 32 位无符号整数,再对词表大小取模;Math.random() 是可预测的伪随机,绝不能用它生成口令。

取模会不会引入偏差?关键看池子大小能否整除 2³²。本页词表 256 是 2 的整数次幂,2³² ÷ 256 = 16777216 是整数,所以 u32 % 256 每个词的命中概率完全相同,不需要拒绝采样。但如果换成 Diceware 的 7776 词表,2³² % 7776 = 2560 ≠ 0,直接取模会让前 2560 个词略占优势;正确做法是拒绝采样——先算出 limit = ⌊2³² ÷ 7776⌋ × 7776,丢弃所有 ≥ limit 的随机数再取模。末位数字的 100 个选项同样存在 2³² % 100 = 96 的余数,本页对它做了同样的拒绝处理。

与 Diceware 的关系:Diceware(Arnold Reinhold,1995)用 5 个骰子投出 1~6 共 7776 种组合,对应 7776 词的官方词表,log₂(7776) = 12.92 bit/词,6 词 = 77.55 bit。本页内置词表为 256 词(8 bit/词),比 Diceware 每词少 4.92 bit,要追平强度就多加词:词数 10 时 80 bit,已超过 Diceware 的 6 词。

可记忆性为什么更好:48 bit 的随机字符密码若用小写字母表,需要 48 ÷ 4.70 ≈ 10.2 个字符的纯随机串,几乎无法背诵;而 6 个词组成的口令可以编成一句荒诞小故事记住。NIST SP 800-63B 也因此建议用「长且好记的口令短语」替代「短而复杂的字符密码」。

完整示例(数值仅作演示)

示例条件:词数 6、分隔符连字符、末位 2 位数字。下方数值仅作演示,词是随机抽的,每次生成都不同。

把词数改成 8,熵值升到 8 × 8.00 + 6.64 = 70.64 bit,爆破时间从 3.91 小时涨到约 29.1 年。这就是「多加两个词」的收益。

三处咬合:控件默认值(6 词、2 位数字)、本节熵值 54.64 bit 与 3.91 小时、对照表第 5 行(词数 6 → 48.00 bit)来自同一次实算。

输入范围与对照表

字段范围步进默认边界含义
每句词数3~1216少于 3 词熵值低于 24 bit,本页按安全下限拒绝
生成条数1~2013超过 20 条一次铺满结果区,无实际收益
分隔符4 种—连字符只影响可读性,不改变熵值
附加数字0 / 2 / 4 位—2 位2 位 +6.64 bit,4 位 +13.29 bit

熵值对照:6 词 = 48.00 bit、8 词 = 64.00 bit、10 词 = 80.00 bit;同样词数下 Diceware 表为 77.55 / 103.40 / 129.25 bit。要跨过「80 bit 强口令」这条线,本页词表需要 10 个词,Diceware 只需 7 个。

输入范围、边界与精度说明

词数上限为什么是 12:12 个词约 30 个字符,已接近多数系统对单条口令的长度限制,再长会被截断反而降低安全。下限 3 是因为 3 词仅 24 bit,等价 4 位随机字符,不足以作为密码使用。

熵值为理论值,前提是「对攻击者而言每个词等概率」:这要求随机源真正均匀。本页因词表 256 = 2⁸ 而无取模偏差;若你改用非 2 的幂的词表,必须走拒绝采样,否则理论熵值高于实际强度。

熵值不等于真实破解时间:爆破估算假设攻击者只做离线穷举且已知词表与格式。真实攻击还会尝试字典变形、键盘模式、已泄露口令复用等,这些都不会被「熵值」解释,所以不要把 54 bit 当成绝对安全。

常见误用的正确解释:一,把词全大写或首字母大写只是书写风格,不增加熵值(本页不做无条件大写);二,分隔符换成「!」并不能显著增加熵值,真正的强度来自词数;三,用 Math.random() 生成的口令即使熵值公式算出来是 54 bit,实际也可能被预测,公式的前提已被破坏。

常见问题

为什么每词是 8 bit,不是 12.9 bit?

熵 = log₂(词表大小)。本页词表 256 词 → log₂(256) = 8.00 bit/词。Diceware 官方词表 7776 词 → log₂(7776) = 12.92 bit/词,那是另一张词表。

6 词只有 54 bit,安全吗?

作为日常账号口令够用,但不适合加密盘或主密码。加密场景建议 8 词以上(70.64 bit 起)或改用 Diceware 表。熵值越高越安全,长度是唯一可靠的杠杆。

为什么要拒绝采样?

取模会把 2³² 的均匀分布映射到非整除的池子上,余数区间的选项被多算一次。本页词表 256 整除 2³² 无需处理;末位 100 个数字和 7776 词表则需要丢弃余数部分,否则理论熵值会虚高。

生成的口令会上传到服务器吗?

不会。页面只调用浏览器原生的 crypto.getRandomValues,全程不发任何网络请求,可在开发者工具的 Network 面板自查。

口令短语和随机密码怎么选?

需要手输的场合(主密码、恢复短语)选口令短语,靠长度换安全且能背;纯机器保存的密钥槽位里直接存随机 20 位以上字符串更省事。两者目标不同,不必二选一。

可以加中文词吗?

本页词表是英文,因为英文单词长度稳定、歧义少。加中文需要为每个词标拼音或注音,且中文输入法联想会削弱随机性,本页不含此功能。

为什么默认 6 个词?

6 词加 2 位数字约 54.64 bit,是「能背下来」和「够安全」的折中点。要更强的口令把词数加到 8 或 10 即可,每加一个词就多 8 bit。

对照表里的「等价随机字符位数」怎么理解?

它是把词口令的熵值除以单个随机字符的熵 log₂(62) ≈ 5.95 得到的。54.64 bit 等价于 9.18 位「大小写字母加数字」的随机串,数量级上便于横向比较。

相关工具

更多实用工具见分类页。