密码设置
16 位密码,来自 94 个字符的集合 → 信息熵 104.9 位
已生成的密码
点击"生成"来创建密码。不会保存任何内容 — 请复制你要保留的那个。
一个使用系统级随机源的密码生成器
这个工具使用 `crypto.getRandomValues()` —— Web Crypto API 提供的密码学安全随机数生成器 —— 来生成随机密码,这与操作系统生成密钥、令牌时使用的随机源属于同一类。它绝不使用 `Math.random()`:后者速度快,但并非为抵御预测而设计,不适合任何与安全相关的用途。
把随机字节映射到字符集合,正是很多自制密码生成器悄悄出错的地方:常见的 `随机字节 % 字符集长度` 做法,只要 256 不能被字符集长度整除(几乎总是如此),就会产生偏差。这个工具改用拒绝采样(rejection sampling):落在有偏区间内的字节会被丢弃并重新抽取,因此所选字符集中的每一个字符被选中的概率完全相等。
你可以设置长度(8-64 位)、混合哪些字符集(小写字母、大写字母、数字、符号),以及是否排除容易看错的相似字符(0/O、1/l/I)。如果你启用的某个字符集在结果中恰好一个都没出现,工具会用该字符集中的一个随机字符替换其中一个位置——这样"生成包含数字和符号的密码"就能可靠地同时包含两者,而不是靠运气。
为什么不能轻易信任在线密码生成器
一个密码从生成的那一刻起就是秘密。把它发送到服务器——哪怕只是短暂停留,哪怕对方承诺不会记录——意味着你信任的是一个承诺,而不是一个事实。这里没有什么需要你信任:
- 生成过程完全在你的浏览器内进行,使用浏览器内置的 Web Crypto API。
- 页面以静态文件形式分发,不会发出任何携带生成密码的请求——哪怕是发给统计分析端点的请求也没有。
- 不会写入 localStorage、历史记录列表,或任何其他形式的本地持久化存储:密码只在当次页面加载中显示一次,除非你复制,否则不会留存。
- 没有可以把密码编码进 URL 的分享链接功能。
- 源代码公开,任何人都可以查看(MIT)。
- 可以离线使用——这恰恰是因为没有任何数据离开设备。
如果你想自己确认,可以在生成密码时打开浏览器的网络(Network)面板——没有任何请求携带密码。 查看源代码。
使用方法
-
设置长度和字符集
拖动长度滑块(8-64 位),并选择要包含的字符集:小写字母、大写字母、数字、符号。
-
按需排除易混淆字符
打开"排除易混淆字符",可以去掉容易看错的相似字符(0/O、1/l/I)——适合需要手动输入或读出来的密码。
-
选择生成数量
如果想一次得到多个候选密码,设置数量(最多 20 个),然后点击"生成"。
-
复制你需要的那个
每个生成的密码都有自己的复制按钮。离开或刷新页面后不会保留任何内容,所以请及时复制你要保留的那一个。
常见问题
生成的密码会被发送到某个地方吗?
不会。生成过程完全在你的浏览器内使用 Web Crypto API 完成。没有服务器组件,没有携带密码的统计分析请求,也没有分享链接功能——除非你自己复制粘贴,否则生成的密码没有离开设备的途径。
随机数的来源为什么重要?
`Math.random()` 是一个快速的通用伪随机数生成器,并不保证其输出无法从少量样本中被预测出来——它从设计之初就不是为了让攻击者无法预测。`crypto.getRandomValues()` 是密码学安全的随机数生成器,由浏览器(最终是操作系统)的密码学安全随机数生成器(CSPRNG)支持,与生成加密密钥所用的随机源属于同一类。对密码这类用途而言,这是唯一合适的选择。
什么是"模运算偏差"(modulo bias)?这个工具如何避免它?
如果用 `随机字节 % 字符集长度` 把一个随机字节(0-255)映射到字符集合上,而 256 又不能被该长度整除,字符集中靠前的字符就会被选中得稍多一些——这是真实可测量的偏差,不是理论问题。这个工具改用拒绝采样:先计算出小于 256 的、字符集长度的最大倍数作为阈值,任何达到或超过该阈值的字节都会被丢弃并重新抽取,而不是用取模来"压缩"它。通过这一处理后留下的每个字符,被选中的概率完全相等。
"保证字符类别覆盖"是什么意思?
整个密码首先通过上述无偏的随机抽取生成。之后,如果你启用的某个字符集(比如符号)恰好在结果中一个都没出现——在字符集较多、密码较短时这种情况并不少见——工具会用该字符集中随机抽取的一个字符,覆盖密码中随机选中的一个位置,这一步同样使用相同的密码学随机源。这就是为什么同时启用全部四种字符集,能可靠地得到包含全部四种的密码,而不是偶尔缺一种。
为什么显示信息熵位数,而不是"强度"条?
带颜色的强度条是主观的,往往还会误导人。信息熵位数——长度 × log2(有效字符集大小)——是一个可核实的客观数字:它精确表示,要遍历这个密码所在的随机空间(以 log2 计),需要多少次均匀随机的尝试。至于如何使用这个数字(比如和某个服务的要求做比较、判断是否够用),由你自己决定。
会保存我生成过的密码历史吗?
不会,这是刻意的设计。不会写入 localStorage 或任何其他本地存储。一旦离开页面或刷新,页面上生成过的所有密码都会消失,除非你已经复制——对于这么敏感的内容,这才是正确的默认行为。
什么是"易混淆字符",为什么要排除它们?
有些字符在特定字体下或读出来时很容易看错或输错,比如数字 0 和字母 O,数字 1 与小写字母 l 以及大写字母 I。打开"排除易混淆字符"会从字符池中恰好移除这 5 个字符,代价是相同长度下字符集稍微变小(因而信息熵也略有下降)。
可以离线使用吗?
可以。它是一个 PWA,第一次访问后会被缓存,没有网络连接也能使用——对于一个本来就不需要联网完成实际工作的工具来说,这是很自然的。你也可以把它添加到主屏幕。