密码生成器

生成安全随机密码

正在加载工具…

关于 安全随机密码生成

安全密码生成器按你启用的字符集逐位抽取密码,随机源使用浏览器的密码学随机数接口,一次最多生成 100 个候选。长度范围 4 到 256,默认 20。

密码的强度取决于它是从多大的空间里抽出来的,而不是它看起来有多复杂。Tr0ub4dor&3 看着复杂却很弱,因为模式是人挑的,而所有破解规则库早就认识这个模式。从 80 个字符里均匀抽 20 位大约 126 比特,与它像不像随机无关,所以值得拨动的杠杆只有两个:由程序生成,以及加长度。

如何使用这个开发者工具

  1. 设定长度。默认 20;只要由密码管理器代为输入,就尽管往长了设。
  2. 按目标服务接受的范围启用字符集。关掉一类字符就缩小了字符集,每位承载的熵也随之下降。
  3. 只要需要有人从屏幕上读取这个值,就保持「排除易混淆」开启,它会去掉 O、0、I、l、1 和竖线。
  4. 选择要生成的候选数量,1 到 100 之间,然后生成。
  5. 直接把某个候选复制进将要保存它的密码管理器字段,然后清空面板;在你清空之前列表一直留在页面上。

实例:把默认设置摊开来看

四类字符全部启用并排除易混淆字符时,字符池恰好是 80 个字符,密码的每一位都是从这个池中独立均匀抽取的。

设置
长度            20
大写            开
小写            开
数字            开
符号            开
排除易混淆      开
字符池与一个候选
ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!@#$%^&*()-_=+[]{};:,.?

W$m-t%4{6uX#!yRDX[re

80 个字符约合每位 6.32 比特,20 位大约 126 比特。同时要看清均匀抽样没有承诺的事:某个候选完全可能纯粹因为运气而一个数字都没有。它会被硬性要求「每类至少一个」的表单拒绝,正确的应对是再生成一个。

按字符集与长度计算的熵

下表是均匀随机抽取时的熵值,同样形态但由人挑选的密码价值要低得多。大约 80 比特就已经让离线破解超出任何现实预算;再往上加,是为「服务端把你的密码存得很糟糕」留余量。

字符集规模每位比特数12 位16 位20 位
仅小写264.7056 比特75 比特94 比特
大小写525.7068 比特91 比特114 比特
字母数字625.9571 比特95 比特119 比特
四类全开,排除易混淆806.3276 比特101 比特126 比特
四类全开,完整字符集856.4177 比特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 比特。多加一位字符就不止补回来。

为什么一次生成好几个候选?

方便你挑一个输入顺手、又能满足服务组合规则的。你留下的那个仍然是从满足条件的子集中均匀抽取的,而这个子集只比全空间小了可以忽略的一点点。

低价值账号之间复用一个生成的密码可以吗?

不可以。复用正是把一个站点的泄露放大成你所有资产失守的机制,而低价值账号恰恰最容易被脱库。密码管理器让「每处都不同」变成零成本。