怎么用
- 选密码会得到一串随机字符;选口令短语会得到几个随机英文单词,更容易输入和记忆。
- 生成密码时,用滑块设置长度,并勾选字符类型。如果密码需要念给别人听,或者要照着纸条输入,建议勾选避开易混淆字符。
- 生成口令短语时,选择单词个数和分隔符。
- 每次同时给出五个候选,复制你喜欢的那个即可。点重新生成再换五个。
- 看一下强度这一行:熵有多少 bit,以及在写明的假设下平均要多久能被破解。
生成的密码不会保存在任何地方,既不在服务器上,也不在你的浏览器里。没复制就关掉页面,它就消失了。请把实际使用的密码存进密码管理器。
密码是怎么生成的
密码学安全的随机源
每个字符都用 crypto.getRandomValues 选出。这是浏览器提供的密码学安全随机数生成器,种子来自操作系统。大家更熟悉的 Math.random 并不是为「不可预测」设计的,绝不能用来生成任何秘密。
没有取模偏差
生成器先取一个 32 位随机数,再把它变成比如 94 个字符里的一个。最直接的做法是除以 94 取余数,但这并不公平:2^32 不是 94 的整数倍,排在前面的几个字符出现的概率会略高一点点。本工具改用拒绝采样:落在取值范围顶端、凑不满一整轮的那部分随机数直接丢弃重抽,这样每个字符出现的概率都完全相等。
熵
强度用熵来衡量,也就是按当前设置一共可能生成多少种等概率的结果,用 bit 表示。长度为 L、字符集大小为 N 的密码,熵是 L × log2(N)。四类字符全选时 N = 94(26 个小写、26 个大写、10 个数字、32 个符号),16 位密码的熵是 16 × log2(94) ≈ 104.9 bit。口令短语同理:从 1296 个词的 EFF 短词表里每选一个词,增加 log2(1296) ≈ 10.3 bit。
每多 1 bit,攻击者的工作量就翻一倍,所以长度比奇怪的符号重要得多。12 位字母数字密码再加 4 位,熵增加约 24 bit,破解工作量变成原来的 1600 多万倍;而在同样长度下勾选符号,只增加大约 7 bit。
破解时间
破解时间的估算假设攻击者已经偷到了密码哈希数据库,可以离线每秒尝试 100 亿次。对于快速、无盐的哈希,用现代显卡做到这个速度是现实的。平均来说,攻击者要试完一半的可能性才能猜中。如果网站用 bcrypt、Argon2 这类慢哈希算法保存密码,或者限制登录次数,攻击难度会再高几千到几百万倍,所以请把这个数字当作最坏情况来看。
示例
| 设置 | 熵 | 每秒 10¹⁰ 次猜测下的平均破解时间 |
|---|---|---|
| 8 位小写字母 | 37.6 bit | 约 10 秒 |
| 8 位字母和数字 | 47.6 bit | 约 3 小时 |
| 12 位字母和数字 | 71.5 bit | 约 5112 年 |
| 16 位,四类字符全选 | 104.9 bit | 约 5.9 × 10¹³ 年 |
| 6 个词的口令短语 | 62.0 bit | 约 8 年 |
| 7 个词的口令短语 | 72.4 bit | 约 9730 年 |
像「ruby-otter-spend-cloth-tidy-sulk」这样 6 个词的口令短语,强度不如 12 位随机密码,但在手机上输入、以及记住它都要容易得多。用来保护其他账号的密码,比如密码管理器的主密码,建议用 7 个词以上。
常见的「8 位、字母加数字」的规则,在上述离线攻击假设下只能撑大约 3 小时。这也是为什么现在的安全建议普遍把长度放在复杂度之前。
局限与建议
- 熵只在原样使用时才成立。 把其中一个词换成宠物的名字,或者在末尾加上「2026!」,都会让密码比显示的数字更容易被猜中。
- 有些网站不接受某些符号,或者限制了最大长度。网站拒绝时,取消勾选符号或缩短长度,不要手动改字符。
- 「每种类型至少一个」会排除少量缺某一类字符的组合,影响远小于 1 bit,显示的熵没有扣除这部分。
- EFF 词表里有一个词带连字符(yo-yo)。用连字符作分隔符时,它看起来像两个词;强度不受影响,但如果容易让你混淆,可以改用空格分隔。
- 口令短语用的是英文词表。 中文用户输入英文单词同样方便,而把中文词语转成拼音再用,并不会增加强度。
- 请使用密码管理器。 每个网站都用不同的随机密码,比任何一个密码本身有多长更重要,而没有人能记住几十个随机密码。
常见问题
生成的密码会被保存或上传吗?
不会。密码在你的浏览器里生成,只存在于当前页面,关闭就消失。不会被记录、传输,也不会写入浏览器存储。
密码多长才够?
字母加数字的随机密码至少 12 位,重要账号 16 位以上。口令短语至少 6 个词,主密码建议 7 个词以上。
口令短语安全吗?
只要单词是随机选出的(本工具就是这样),就是安全的。它的强度来自单词的个数,而不是单词有多生僻。
为什么不用 Math.random?
Math.random 为速度而设计,不保证不可预测,它的输出有时可以被推算出来。crypto.getRandomValues 才是浏览器为安全用途提供的接口。
「熵多少 bit」是什么意思?
它是可能生成的等概率密码总数取以 2 为底的对数。每多 1 bit,攻击者需要尝试的次数就翻一倍。