使用方法
- 「密码长度」填 16(默认示例值),允许 8~64 的整数;「生成条数」填 20(默认示例值),允许 1~500 条。
- 勾选参与抽取的字符类别:默认勾 大写字母、小写字母、数字 三类,不勾「常用符号」。很多批量下发口令的系统(考勤机、门禁、旧版进销存)都会拒收符号。
- 「批次内去重」默认开启:同一次生成里不会出现两条完全相同的口令,撞上了就丢弃重抽,最多重试 8 次。
- 「统一前缀」可选,最多 16 个字符,会原样加在每条口令最前面(例如门禁卡编号
POS-)。前缀不计入随机长度,只是方便你按设备对号入座。 - 点「批量生成」,或者在长度、条数、前缀任一输入框里直接按 Enter。结果表首屏显示 12 条,剩下的点「加载更多」逐屏展开。
- 点「导出 CSV」拿到带 BOM 的表格文件,双击用 Excel 打开中文表头不乱码;点「复制全部」则按行取走纯文本口令。
这个随机密码生成器能解决什么问题
一是批量开户的初始口令。给一个班的学生、一批新员工、一批测试机同时开账号时,最难的不是"生成一条好口令",而是"生成 300 条互不相同、又能直接进表格的口令"。手工编 300 条既慢又必然重复,这个随机密码生成器把条数、去重、导出三步合成一次点击。
二是绕开旧系统的字符限制。有些终端只认数字,有些只认字母数字,有些长度上限只有 8 位。本页把字符类别和长度都做成开关,先按目标系统的限制配好,再一次性出全批,不用生成一批再回头删掉不合规的。
三是让导出结果能被 Excel 正确识别。Windows 版 Excel 打开无 BOM 的 UTF-8 文件时,会按本机代码页(简体环境是 GBK)解码,中文表头直接变成乱码。本页导出的 CSV 在文件头写入 3 字节 BOM(EF BB BF),Excel 会据此判定编码,中文列名保持原样。
四是保留前缀做映射。批量口令最常见的后续操作是"哪条属于哪台设备",用统一前缀把批次信息编进去(A-、B-…分批生成),比事后拿 Excel 手工对应省事得多,也不会因为前缀不同而破坏随机部分——这也是这个随机密码生成器把前缀做成可选项的原因。
本页不做这些事:不给你评估一条口令被猜中的难易(那不是批量页的职责,见下方相关工具),不检查口令是否出现在历史泄露库中,也不把结果写进浏览器存储或发送到服务器。关掉标签页,这一批口令就不在任何地方留下副本——请自己在导出后立刻存进可信的密码管理器或受控表格。
生成原理:crypto.getRandomValues、拒绝采样与批次内去重
随机的来源只有一句:crypto.getRandomValues(new Uint32Array(1))。它是 W3C Web Cryptography API 定义的加密随机数接口,由浏览器直接向操作系统熵池取数,不引入任何第三方随机库。相比之下 Math.random() 是为速度设计的伪随机,内部状态有限且可从连续输出反推,不适合生成凭据。
关键一步是拒绝采样。拿到一个 32 位无符号整数后,不能直接写 n % 62 去取字符下标:因为 232 = 4294967296 不能被 62 整除,余数 0~3 会比余数 4~61 多出现一次,分布出现真实存在的偏斜。本页的实际做法是先算接受上限 Math.floor(4294967296 / 62) * 62 = 4294967292,随机数落在 4294967292~4294967295 这 4 个取值上就丢弃重抽,接受率约 99.9999999%(丢弃比例 9.3×10-8%),代价可忽略,换来严格均匀的分布。
洗牌用 Fisher–Yates。先给每个已勾选的类别各抽一个字符(保证"每类至少出现一次"),再用剩余长度从合并字符池里补齐,最后整体洗牌。洗牌是从末位往前遍历(for (i = a.length - 1; i > 0; i--) 再与 rand(i + 1) 交换),而不是常见的 sort(() => Math.random() - 0.5)——后者在多个引擎里会退化成偏差明显的伪洗牌,位置分布并不均匀。
批次内去重靠 Set。每造出一条口令就放进一个 Set,下一条先查表,命中就整条重抽(最多 8 次)。这不是"提高强度"的手段,而是保证同一批结果互不相同:默认条件(16 位、62 字符池)下,20 条口令两两相撞的概率约 1 - exp(-20×19 / (2×4.77×1028)),也就是 4.0×10-27 量级,重抽几乎不会发生;只有把长度压到 8 位、只勾数字、又要 500 条时,撞车概率才升到约 0.12%,此时去重才真正干活。
长度和组成的依据。NIST SP 800-63B 对口令长度的最低要求是 8 位,并明确不建议强制"必须含大小写数字符号"这类组成规则;本页把组成做成开关,是为了兼容那些仍在校验组成的旧系统,而不是说组成规则本身能提升安全性。CSV 的字段与转义规则遵循 RFC 4180(逗号分隔、CRLF 换行、含逗号或引号时用双引号包裹并把引号翻倍),前缀里若带逗号也会被正确转义。
完整示例(默认 20 条 × 16 位)
页面打开时的默认条件:长度 16 位、条数 20 条、勾选大写字母 + 小写字母 + 数字、开启批次内去重、前缀为空,此时字符池 = 26 + 26 + 10 = 62 个字符。
- 单条理想取值空间
6216≈ 4.77×1028 种; - 20 条两两相同的概率 ≈ 4.0×10-27,实际上不可能撞上,去重开关只作兜底;
- 导出的 CSV 恰好 429 字节(3 字节 BOM + 15 字节表头 + 9 行各 20 字节 + 11 行各 21 字节);
- 同一批内容存成纯文本是 340 字节,CSV 多出来的是表头、序号和 CRLF 换行;
- 结果表首屏渲染 12 行,剩下的 8 行 要点一次「加载更多」。
下面这 12 条就是默认条件下真机生成的结果,仅作排版演示——你再点一次「批量生成」会得到完全不同的一批:
Kt7mQw2ZnRpd9FhB Xc4vBn8MJs3WqYtE Rf9dHk2Lp6ZaVxNc Qm3sJw7Tb1YuGdKe Zd8nFp4Xr2MhCvLs Bv6tKy9Nw3QjRmHa Sn2gXm5Pd7KcLzTq Wj4rCv8Bm1FsNhYd Lp7zQn3Xt9WdKbVg Hd5kMr2Yv8JsCxPw Tv1bWq6Zn4RfLmGk Nc9jYd3Px7VtHsBm
条数档位、CSV 体积与首屏渲染对照表
下表固定长度 16 位、字符池 62 个,逐档实测导出体积与渲染行为。「CSV 字节」含 3 字节 BOM 与表头,「纯文本字节」是「复制全部」拿到的内容大小。
| 生成条数 | CSV 字节 | 纯文本字节 | 首屏行数 | 是否需加载更多 |
|---|---|---|---|---|
| 1 条 | 38 | 17 | 1 | 否 |
| 5 条 | 118 | 85 | 5 | 否 |
| 10 条 | 219 | 170 | 10 | 否 |
| 20 条(默认) | 429 | 340 | 12 | 是,余 8 行 |
| 50 条 | 1059 | 850 | 12 | 是,余 38 行 |
| 100 条 | 2110 | 1700 | 12 | 是,余 88 行 |
| 200 条 | 4310 | 3400 | 12 | 是,余 188 行 |
| 500 条(上限) | 10910 | 8500 | 12 | 是,余 488 行 |
规律很直白:CSV 体积 ≈ 16 + 条数 × 21.8 字节(16 位口令、序号最多三位数时),来源就是"每行一条纪录"——19 字节的固定占用(逗号、引号、CRLF 与 16 位口令)加上序号本身的位数。即便拉到 500 条,导出文件也只有 10.9 KB,轻松塞进任何邮箱和表格。
输入范围、边界与精度说明
下面这些是刻意设定的边界,知道它们能避免你把这个随机密码生成器当万能工具用:
- 长度 8~64 的整数。低于 8 位会被拒绝:8 位纯数字只有 108 种组合,按每秒 1012 次穷举不到 1 秒就能跑完。上限 64 位是多数业务系统口令字段能存下的长度。
- 条数 1~500。条数只决定一次出多少条,不改变任何一条的随机性——第 500 条和第 1 条同样均匀。上限 500 是防止一次把表格撑到上万行拖慢浏览器。
- 字符池默认 62 个字符(26 大写 + 26 小写 + 10 数字);勾上「常用符号」后变成 74 个。符号集只取
! @ # $ % ^ & * _ - + =这 12 个,剔除了在 URL、Shell 和 CSV 里需要转义的引号、反斜杠、尖括号等字符。 - 去重上限是每条重试 8 次。默认条件下重试几乎不会触发;只有"长度 8 + 仅数字 + 500 条"这种极端组合才有约 0.12% 的概率撞车。
- 统一前缀最多 16 个字符,且不计入随机长度。设了 4 字符前缀、长度 16,你拿到的字符串总长是 20 位,但只有后 16 位是随机的——目标系统若限制总长度,记得把前缀算进去。
- CSV 用 CRLF 换行并带 3 字节 BOM,纯文本复制不带。BOM 是给 Excel 认编码用的;如果拿这份 CSV 去喂程序解析,请先剥掉开头那 3 个字节,否则第一个字段名会带上不可见字符。
- 结果区前 12 行是 HTML 里的演示值,不是随机的。点一次「批量生成」之后出现的才是真正来自
crypto.getRandomValues的内容。
常见问题
批量生成 500 条,会不会有几条是重复的?
默认条件下不会。16 位、62 字符池时 500 条里出现任意一对重复的概率约 1 - exp(-500×499 / (2×4.77×1028)),小到可以当作 0。真正需要担心的是"长度 8 位 + 只勾数字 + 500 条":这时总空间只有 108 种,撞车概率约 0.12%,去重会在最多 8 次重抽内补齐绝大多数。
「批次内去重」是不是让口令更难被猜到?
不是。去重只改变"这一批里有没有两条一样",不改变任何单条口令的随机性。去掉去重开关后,每条口令的取值空间完全不变。它解决的是统计和分配问题,不是安全问题。
导出的 CSV 用 Excel 打开是乱码怎么办?
本页导出的文件已经带 3 字节 BOM(EF BB BF),用 Excel 双击打开应当正常。若仍然乱码,多半是这个文件被别的程序重存过、BOM 被剥掉了。此时改用「数据 → 从文本/CSV」导入,并手动把编码选成 UTF-8 即可。
为什么符号里没有引号、反斜杠和尖括号?
因为它们在 CSV、URL、Shell 和 HTML 里都是特殊字符:双引号在 RFC 4180 里需要翻倍转义,反斜杠在 Shell 和 JSON 里要转义,尖括号在 HTML 里会被当成标签。批量口令经常要经过复制粘贴和脚本处理,剔除这几个字符能省掉一整类转义事故,同时仍保留 12 个可用符号。
生成 500 条上限够用吗?不够怎么办?
单次上限 500 条。更多需求分几次生成即可:每次点「批量生成」都是一次全新的抽取,批次之间同样不会重复。若确实需要成千上万条,建议直接用脚本调用浏览器接口,而不是在页面上堆 DOM。
前缀里带逗号或引号会破坏 CSV 吗?
不会。导出时每个字段都按 RFC 4180 做转义:含逗号、双引号或换行的字段会用双引号整体包裹,字段内部的双引号翻倍成两个。所以 A,B 这样的前缀在表格里仍是一个完整单元格,不会被拆成两列。
结果会上传或保存在服务器吗?
不会。随机数来自浏览器接口,拼接、洗牌、去重和 CSV 拼装全在当前页面完成,导出用的是本地 Blob 加 URL.createObjectURL,没有任何网络请求。想自己验证,打开开发者工具的 Network 面板,点几次「批量生成」和「导出 CSV」,可以看到没有新请求发出。
和「密码生成器」那一页有什么区别?
那一页面向"生成一条自己用的口令",讲的是字符池取舍和易混淆字符排除;本页面向"生产一批要分配出去的口令",讲条数、批次内去重和 CSV 导出。要评估某一条口令的强弱,请用页面底部的「高强度密码生成器」。