密码生成器
加密使用 crypto.getRandomValues 生成密码学安全的随机密码。
本页内容
什么是密码生成器?#
密码生成器把真正的随机源变成一段可作凭证的字符串。它的重点不是「弄长一点」——而是从字符池里均匀地抽取,让你所选长度的每一种可能都等概率出现。正是这种均匀性,让你能用数学语言谈论强度:93 个字符的池子下,16 位密码就稳稳携带约 105 比特熵,没有任何可供利用的人为偏差。
本页用的是 crypto.getRandomValues——浏览器内密码学级别的随机源,并采用拒绝采样来抽取。这个细节很关键:最直觉的写法是 randomByte % poolSize,但当池子大小不能整除 256 时,这会引入模偏差。拒绝采样把带偏差的余数丢回去重抽,因此对任意池子(包括尴尬的 93 字符全集)都能做到无偏。
结果下方的强度读数是诚实算出来的:length × log2(poolSize)(香农熵),再归入 weak / fair / good / strong 四档。它反映的是你实际选定的池子,而不是凭感觉的估算。
怎么使用#
- 设置长度。默认 16 是个万用长度;该字段最大可填 4096。
- 勾选要纳入的字符类:lowercase、uppercase、digits、symbols。默认开小写、大写、数字;符号默认关,因为有些登录表单会拒绝它们。
- 可选勾选 Exclude similar,去掉视觉上易混淆的字符(
i l 1 L o 0 O及少数引号类符号)——当密码需要口述或手抄时很有用。 - 点 Generate,再点 Copy。状态栏会按你选的池子和长度,报出熵的比特数和强度档位。
核心特性#
- 无偏随机。 在
crypto.getRandomValues上做拒绝采样,意味着即使池子大小不是 2 的幂,也没有模偏差。 - 诚实的强度计。 熵由实际的池子大小和长度算出,而非看着字符瞎估;weak / fair / good / strong 四档对应固定的比特阈值(28 / 60 / 100)。
- Exclude similar 模式。 剔除最易看错的字符,专为需要人工誊写的密码设计。
- 最长可到 4096。 无论你要 16 位的登录密码还是 64 位的 API key,同一个生成器都能搞定。
- 零上传。 生成全程本地完成,密码绝不经过网络。
实战示例#
长度 16、四个字符类全开(小写 + 大写 + 数字 + 符号)、Exclude similar 关闭时,池子是 93 个字符(26 + 26 + 10 + 31)。熵即为 16 × log2(93) ≈ 16 × 6.54 ≈ 105 比特,落入 strong 档(≥ 100)。生成结果形如:
qM8#fT2$vRkL9@hZ
打开 Exclude similar,池子降到 85(剔除了 8 个易混字符),熵变为 16 × log2(85) ≈ 103 比特——仍是 strong,且现在可以放心在电话里念出来。
作为对比:把长度降到 12、只保留小写 + 数字(池子 36),熵就掉到 12 × log2(36) ≈ 62 比特,只剩 good。从 105 到 62 这一下,可不是四舍五入的误差——它意味着爆破速度大约快了 2^43 倍,这正是「池子」和「长度」两者都重要的根本原因。
常见问题#
多长才算「够长」?#
有速率限制保护的服务背后的登录密码,12–16 位、池子宽一点就很从容。对于 API key,或存在密码管理器里、身后没有在线速率限制兜底的密码,建议 25 位以上。强度计会以比特说真话——凡达到或超过 100 比特,就被视为能扛住当今硬件的离线爆破。
为什么同样的设置每次出来的密码都不一样?#
因为底层的随机字节每次都是新抽取的。这正是目的——如果输出可预测,攻击者也能预测。按设计,这里没有任何你可以固定的种子。
该不该包含符号?#
除非目标系统拒绝,否则都该包含。符号会加宽池子(默认集合下从 62 扩到 93),直接抬高每位字符的熵。常见的关掉理由是登录表单禁用了某些标点,而不是安全上的取舍。
生成的密码比我自创的更安全吗?#
几乎总是更安全。人类在随机性上极差——我们偏爱常见词、重复模式、键盘走位,而这些恰恰是字典攻击的养料。从确定池子里均匀抽取的生成器没有这些习惯,所以一段 16 位的生成密码,可靠地强于一段「自觉得很聪明」的 12 位人创密码。