关于 安全随机密码生成
安全密码生成器按你启用的字符集逐位抽取密码,随机源使用浏览器的密码学随机数接口,一次最多生成 100 个候选。长度范围 4 到 256,默认 20。
密码的强度取决于它是从多大的空间里抽出来的,而不是它看起来有多复杂。Tr0ub4dor&3 看着复杂却很弱,因为模式是人挑的,而所有破解规则库早就认识这个模式。从 80 个字符里均匀抽 20 位大约 126 比特,与它像不像随机无关,所以值得拨动的杠杆只有两个:由程序生成,以及加长度。
如何使用这个开发者工具
- 设定长度。默认 20;只要由密码管理器代为输入,就尽管往长了设。
- 按目标服务接受的范围启用字符集。关掉一类字符就缩小了字符集,每位承载的熵也随之下降。
- 只要需要有人从屏幕上读取这个值,就保持「排除易混淆」开启,它会去掉 O、0、I、l、1 和竖线。
- 选择要生成的候选数量,1 到 100 之间,然后生成。
- 直接把某个候选复制进将要保存它的密码管理器字段,然后清空面板;在你清空之前列表一直留在页面上。
实例:把默认设置摊开来看
四类字符全部启用并排除易混淆字符时,字符池恰好是 80 个字符,密码的每一位都是从这个池中独立均匀抽取的。
长度 20
大写 开
小写 开
数字 开
符号 开
排除易混淆 开ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*()-_=+[]{};:,.?
W$m-t%4{6uX#!yRDX[re80 个字符约合每位 6.32 比特,20 位大约 126 比特。同时要看清均匀抽样没有承诺的事:某个候选完全可能纯粹因为运气而一个数字都没有。它会被硬性要求「每类至少一个」的表单拒绝,正确的应对是再生成一个。
按字符集与长度计算的熵
下表是均匀随机抽取时的熵值,同样形态但由人挑选的密码价值要低得多。大约 80 比特就已经让离线破解超出任何现实预算;再往上加,是为「服务端把你的密码存得很糟糕」留余量。
| 字符集 | 规模 | 每位比特数 | 12 位 | 16 位 | 20 位 |
|---|---|---|---|---|---|
| 仅小写 | 26 | 4.70 | 56 比特 | 75 比特 | 94 比特 |
| 大小写 | 52 | 5.70 | 68 比特 | 91 比特 | 114 比特 |
| 字母数字 | 62 | 5.95 | 71 比特 | 95 比特 | 119 比特 |
| 四类全开,排除易混淆 | 80 | 6.32 | 76 比特 | 101 比特 | 126 比特 |
| 四类全开,完整字符集 | 85 | 6.41 | 77 比特 | 103 比特 | 128 比特 |
常见问题排查
注册表单提示密码复杂度不够。
成因 均匀抽样并不保证每个已启用的字符类都至少出现一次。从 80 个字符里抽 12 位,抽出一个完全不含符号的候选并不常见,但完全可能。
解决办法 一次生成十个,挑一个符合规则的,或者直接加长度。不要手工塞符号进去,重新生成不花钱,而且能保持抽样的均匀性。
密码第一次能用,下次登录就失败。
成因 输入框按最大长度悄悄做了截断,或剥掉了它不接受的字符,于是服务端存下的和你粘贴过去的不是同一个值。
解决办法 生成前先确认字段声明的长度上限,并用较短的纯字母数字值重置。静默截断本身就是一个信号:这个服务对密码的处理不值得信任。
口头念出或照纸打出的密码总是输错。
成因 大写 O 和数字 0、大写 I 和小写 l 和数字 1,在大多数界面字体和手写体里都难以区分。
解决办法 先打开「排除易混淆」。20 位密码为此付出约 1.8 比特,加一位字符就不止补回来了。
密码把 Shell 命令、YAML 文件或连接串搞坏了。
成因 美元符、感叹号、与号、分号等符号对 Shell、模板系统和 URL 解析都有特殊含义。
解决办法 在 Shell 中用单引号包住,或用 URL 编解码工具做百分号编码;也可以关掉符号类改用加长度:多两位字母数字就足以抵掉符号贡献的熵。
适合用这个工具的场景
- 为某个服务创建一个由密码管理器保存的唯一密码。
- 为种子测试账号或夹具批量生成一组互不相同的凭据。
- 生成需要同事从屏幕上读取的值,同时排除易混淆字符。
- 生成非机密用途的随机串,例如测试租户名或临时后缀。
应该换用别的工具的场景
- 派生加密密钥。请使用协议指定的密钥派生函数——PBKDF2、scrypt、Argon2 或 HKDF——或平台的密钥接口。
- 选一个需要你自己背下来的主密码。20 位随机串记不住,等熵值的多词口令短语才是这个位置该有的形态。
- 服务端的密码存储。这里产出的是候选口令而不是校验值;面向基本认证,请用 htpasswd 条目生成器产出真正写进文件的哈希。
隐私与数据处理
每个候选都在当前标签页内由 crypto.getRandomValues 生成,这是浏览器的密码学安全随机源;没有任何内容被发送或保存。输出框做了标记,浏览器不会提示保存它。几条界限值得直说:这个值是可以被截图的明文,任何有页面访问权限的扩展都能读到它,一按复制它就进了剪贴板。
相关开发者工具
常见问题
浏览器的随机数用来生成真实密码够吗?
够。crypto.getRandomValues 由操作系统熵池播种,和原生工具同源。它还采用拒绝采样而非简单取模,因此没有任何字符的概率哪怕高出一丝——取模偏差正是手写密码生成代码最经典的那个坑。
把真正要用的密码交给一个网站生成,靠谱吗?
这里的生成在本地完成、不发送任何内容,但从外部你无法验证任何网站的这类声明,而把密钥粘进网页这个习惯本身就是风险。真正依赖的密码请在密码管理器里生成。
密码应该设多长?
如果由管理器保存和填写,20 位以上对你毫无成本。如果必须自己手敲,长度仍然比符号种类更划算:每增加一位字符换来的熵,比多开一类字符要多。
排除易混淆字符会削弱密码吗?
影响很小。字符集从 85 降到 80,即每位从 6.41 比特降到 6.32 比特,20 位合计约 1.8 比特。多加一位字符就不止补回来。
为什么一次生成好几个候选?
方便你挑一个输入顺手、又能满足服务组合规则的。你留下的那个仍然是从满足条件的子集中均匀抽取的,而这个子集只比全空间小了可以忽略的一点点。
低价值账号之间复用一个生成的密码可以吗?
不可以。复用正是把一个站点的泄露放大成你所有资产失守的机制,而低价值账号恰恰最容易被脱库。密码管理器让「每处都不同」变成零成本。