单词通过 crypto.getRandomValues 与拒绝采样抽取,每次选取都在 7,776 词的 EFF long 词表上均匀分布——无模偏差、无统计特征。本地生成,不发送任何数据。 词表: EFF Diceware (CC BY 3.0 US)。
功能说明
使用 EFF diceware 长词表生成好记且高熵的密码短语 —— 7,776 个常用英文单词(6⁵,五颗六面骰子掷出的每一种组合对应一个词条)。每个单词都通过浏览器的加密随机数生成器(crypto.getRandomValues)加上**拒绝采样(rejection sampling)**来选取,因此每个单词的索引在词表上的分布完全均匀。直接用 random % 7776 会让前 ~2,048 个单词更容易被抽中;先拒绝 ≥ 62,208 的抽样值再取模,即可彻底消除这种偏差。
工具会为每条密码短语实时显示熵(位数) —— words × log₂(7776),即每个单词 12.9 位 —— 以及在每秒 1 万亿次猜测(一次认真的离线攻击)下的平均破解时间,按 2^(bits−1) / rate 计算,即穷举一半密钥空间所需的期望时间。六个单词 ≈ 77.5 位 ≈ 让这种攻击者跑上约 3,500 年。所有内容都在你的浏览器中本地生成,不会被发送到任何地方。
为什么密码短语胜过“聪明”的密码:P@55w0rd! 只是字典词的几次变形 —— 攻击者会最先尝试这些变换,所以它撑不了几毫秒。像 correct horse battery staple(XKCD 936 的点子)这样的随机六词短语,携带的不可预测性相当于一个 13 字符的随机字符串,而且一个你真正记得住的故事让你更容易把它敲对。
使用方法
- 设置单词数量(3–10)。每个单词增加约 12.9 位;对大多数账户 6 个是最佳点,关键账户用 7 个以上。
- 选择分隔符 —— 空格、短横线、点、下划线或无。任选其一都可以;选你的键盘(以及网站的密码规则)喜欢的。
- 切换 Capitalize(每个单词首字母大写)和 + Digit(末尾追加一个随机数字)—— 两者都有助于满足“必须包含……“之类的策略,而不会实质改变强度。
- 读取密码短语,复制它,或点 Regenerate(Shuffle)重新抽取。
URL 保持可分享:你的选项被编码为查询参数(?words=8&sep=dash&cap=1),因此一个书签就能还原你的确切配置。密码短语本身绝不会出现在 URL 中。
示例
| 设置 | 输出形态 | 熵 | 破解时间 @ 10¹² 次/秒 |
|---|---|---|---|
| 6 个单词,空格 | rebuffer marrow paprika rivalry backfield unmask |
77.5 bits | ~3,500 年 |
| 4 个单词,短横线,首字母大写 | Puzzle-Overfeed-Correctly-Grotto |
51.7 bits | ~30 分钟 |
| 8 个单词,点,+ 数字 | lurch.zealot.stomp.vixen.prow.tufted.madam.chili7 |
103.4 bits | ~21 亿个世纪 |
| 10 个单词,下划线 | mutate_versa_biceps_unlit_spraying_proviso… |
129.2 bits | ~1.28 × 10¹⁷ 个世纪 |
经验法则:显示的熵只统计单词本身(N × log₂ 7776)。可选的数字额外增加约 3.3 位 —— 在这个量级上只是舍入误差。
补充说明
- 词表就是安全性的来源。 Diceware 的强度来自均匀随机选取,而不是生僻单词。绝不要自己挑词 —— 人类的随机性很差,而攻击者会建模人类的选择。
- 7,776 个单词,无需排除重复。 允许重复而且没有问题:每次抽取相互独立,所以无论是否重复,熵都精确等于
N × 12.925位。 - 攻击模型。 10¹² 次/秒 的猜测速率假设攻击者已经偷走了哈希后的数据库并正在发动高速离线攻击。在线攻击受速率限制,速度远远慢于此。
- 不要复用。 每个网站一条密码短语。配合密码管理器使用,让“好记”成为加分项而不是必需品。
- 致谢。 词表:EFF Diceware large list(2016),采用 CC BY 3.0 US 授权。密码短语的概念由 XKCD 936 普及。
- 本工具的 Go CLI 孪生实现和各语言源码片段已在路线图上 ——
src/lib/passphrase-generator.ts中的纯逻辑就是它们要遵循的契约。