密码生成器
生成高强度随机密码,可自定义字符集与长度
—
密码强度怎么算:熵、长度与破解成本
强度的量化单位是"熵",不是"看起来复杂"
一个随机生成的密码,其强度可以用信息熵衡量。公式很简单:
熵(比特) = 长度 × log₂(字符集大小)
常见字符集对应的每字符熵:
| 字符集 | 大小 | 每字符熵 |
|---|---|---|
| 小写字母 | 26 | 4.70 比特 |
| 大小写字母 | 52 | 5.70 比特 |
| 大小写 + 数字 | 62 | 5.95 比特 |
| 大小写 + 数字 + 常用符号 | 94 | 6.55 比特 |
| Diceware 词表(单词) | 7776 | 12.9 比特/词 |
代入公式会得到一个反直觉的结论:
- 16 位纯小写字母:16 × 4.70 = 75 比特
- 10 位全字符集:10 × 6.55 = 66 比特
更长但更简单的密码,强于更短但更复杂的密码。复杂度带来的每字符收益是线性的,而长度本身就是乘数。加上长密码更容易记(可以用词组合),所以长度优先。
破解成本:为什么"够不够强"取决于对面怎么存密码
熵只在给定"猜测速度"后才有意义。猜测速度完全由目标站点怎么存密码决定,而你控制不了它:
| 对方存储方式 | 单卡猜测速度(量级) | 50 比特要多久 | 75 比特要多久 |
|---|---|---|---|
| 明文 / 可逆加密 | 不需要破解 | 立即 | 立即 |
| MD5 / SHA-1 裸哈希 | 1011 次/秒 | 小时级 | 数百万年 |
| bcrypt(cost 12) | 104 次/秒 | 数百年 | 远远超出宇宙年龄 |
| Argon2id(调优参数) | 103 次/秒 | 数千年 | 不可行 |
结论:你无法知道对面用什么存,所以要按最坏情况(对方用快哈希)来选密码。这也是为什么现在推荐的长度下限从十年前的 8 位提到了 12-16 位。同时可以看出,问"我的密码强不强"之前,更重要的是不要复用——一次泄漏会把所有用同一密码的账户一起交出去。
随机数来源:Math.random 不能用
很多生成器用 Math.random(),它不是密码学安全的伪随机数生成器。它的内部状态可以被观察到的输出反推,一旦推出状态,之后生成的所有密码都可预测。
正确做法是 crypto.getRandomValues()(Web Crypto API),由操作系统熵池提供,本工具用的是它。你可以自己验证:打开浏览器开发者工具覆盖 Math.random,本工具的输出不受影响,说明它没走那条路。
生成器的几个实际问题
- 字符集要匹配站点规则。有些网站不接受
< > " '或空格,有些限制最大长度。生成前先确认规则,否则会被拒绝后又改成弱密码。 - 歧义字符。需要手抄或口头转述时,去掉
0 O 1 l I |这几组。代价是字符集略小,对总熵的影响可以忽略(用长度补回来即可)。 - 不要"保证每类字符都出现"就完事。强制包含一个大写、一个符号的做法会略微降低实际熵(因为限制了组合空间),对安全没有实质帮助。真正有用的是长度。
- 口令短语(passphrase)。从 7776 词表里随机取 5 个词,熵约 64.5 比特,而"correct horse battery staple"这样的词串比
X7#kq2!好记得多。适合需要人脑记住的主密码。
不该做的事
- 把密码贴在在线工具里看"强度评分"。任何需要你把明文密码发给服务器的服务,都应该直接放弃。本工具在浏览器本地计算,不发起任何请求,你可以用 Network 面板确认。
- 在同一个密码后面加年份/站点名做变体(
Passw0rd-bank、Passw0rd-mail)。一次泄漏就能猜出规律。 - 用生日、手机号、常见词加符号的"人脑随机"密码。它的实际熵远低于看起来的字符数——攻击者的字典里全是这类模式。
- 把密码写在明文文本文件或截图里。用密码管理器(本地加密库或自托管方案)。
工具支持自定义长度、字符集开关、排除歧义字符与批量生成,全部在本地完成。
常见问题
密码强度够吗?
字符取自 crypto.getRandomValues 加密级随机源,20 位混合字符的搜索空间远超任何暴力破解能力。
会保存我生成的密码吗?
不会。生成过程只在浏览器内存中完成,刷新页面即消失,服务端不接收任何内容。