使用方法
口令短语生成器用「从词表里随机抽词、再用分隔符拼接」的方式造口令,参数决定强度,按下面的步骤操作:
- 设「每句词数」,示例 6;词数越多越长也越难猜,每多一个词就多 8 bit。
- 设「生成条数」,示例 3;一次生成多条方便挑一条顺口的。
- 选分隔符,示例连字符「-」;分隔符只影响可读性,不改变熵值。
- 选「附加数字」,示例末位 2 位数字;纯数字末位可绕过「必须是纯字母」这类旧规则。
- 点「生成口令短语」,结果区立即出现多条;在任意输入框直接按 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 位数字。下方数值仅作演示,词是随机抽的,每次生成都不同。
- 生成的 3 条演示口令:第 1 条
cobalt-copper-coral-cotton-cradle-crayon-42,第 2、3 条见结果区。 - 熵值:6 × 8.00 + log₂(100) = 48.00 + 6.64 = 54.64 bit。
- 等价随机字符位数:54.64 ÷ log₂(62) = 54.64 ÷ 5.95 = 9.18 位(62 = 大小写字母加数字)。
- 离线爆破估算(每秒 1e12 次、取一半搜索空间):253.64 ÷ 1e12 ≈ 1.41e4 秒 ≈ 3.91 小时。
把词数改成 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~12 | 1 | 6 | 少于 3 词熵值低于 24 bit,本页按安全下限拒绝 |
| 生成条数 | 1~20 | 1 | 3 | 超过 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 位「大小写字母加数字」的随机串,数量级上便于横向比较。
相关工具
- 密码熵值计算器:输入任意密码,反算它的 log₂ 熵值与字符空间。
- 密码力量检测:从规则与泄露库角度评估一条口令的强弱。
- 高强度密码生成器:需要纯随机字符而非单词时用它。
- 随机字符串生成器:生成定长的随机字母数字串。
- UUID生成器:给设备或会话分配的随机唯一标识。
- 用户名生成器:注册时同步准备一个随机用户名。
更多实用工具见分类页。