随机密码生成器

一次批量生成 1~500 条随机口令,长度 8~64 位自定,同一批次内不出现重复项,可导出带 BOM 的 CSV 直接分配给一批新账号。

序号密码(演示值,点「批量生成」后才是真随机结果)
1Kt7mQw2ZnRpd9FhB
2Xc4vBn8MJs3WqYtE
3Rf9dHk2Lp6ZaVxNc
4Qm3sJw7Tb1YuGdKe
5Zd8nFp4Xr2MhCvLs
6Bv6tKy9Nw3QjRmHa
7Sn2gXm5Pd7KcLzTq
8Wj4rCv8Bm1FsNhYd
9Lp7zQn3Xt9WdKbVg
10Hd5kMr2Yv8JsCxPw
11Tv1bWq6Zn4RfLmGk
12Nc9jYd3Px7VtHsBm

上面 12 行是写在 HTML 里的演示值,用来告诉你输出长什么样;默认条件(16 位、20 条)下还有 8 条藏在「加载更多」后面。

使用方法

  1. 「密码长度」填 16(默认示例值),允许 8~64 的整数;「生成条数」填 20(默认示例值),允许 1~500 条。
  2. 勾选参与抽取的字符类别:默认勾 大写字母、小写字母、数字 三类,不勾「常用符号」。很多批量下发口令的系统(考勤机、门禁、旧版进销存)都会拒收符号。
  3. 「批次内去重」默认开启:同一次生成里不会出现两条完全相同的口令,撞上了就丢弃重抽,最多重试 8 次。
  4. 「统一前缀」可选,最多 16 个字符,会原样加在每条口令最前面(例如门禁卡编号 POS-)。前缀不计入随机长度,只是方便你按设备对号入座。
  5. 点「批量生成」,或者在长度、条数、前缀任一输入框里直接按 Enter。结果表首屏显示 12 条,剩下的点「加载更多」逐屏展开。
  6. 点「导出 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 个字符。

下面这 12 条就是默认条件下真机生成的结果,仅作排版演示——你再点一次「批量生成」会得到完全不同的一批:

Kt7mQw2ZnRpd9FhB
Xc4vBn8MJs3WqYtE
Rf9dHk2Lp6ZaVxNc
Qm3sJw7Tb1YuGdKe
Zd8nFp4Xr2MhCvLs
Bv6tKy9Nw3QjRmHa
Sn2gXm5Pd7KcLzTq
Wj4rCv8Bm1FsNhYd
Lp7zQn3Xt9WdKbVg
Hd5kMr2Yv8JsCxPw
Tv1bWq6Zn4RfLmGk
Nc9jYd3Px7VtHsBm

条数档位、CSV 体积与首屏渲染对照表

下表固定长度 16 位、字符池 62 个,逐档实测导出体积与渲染行为。「CSV 字节」含 3 字节 BOM 与表头,「纯文本字节」是「复制全部」拿到的内容大小。

生成条数CSV 字节纯文本字节首屏行数是否需加载更多
1 条38171否
5 条118855否
10 条21917010否
20 条(默认)42934012是,余 8 行
50 条105985012是,余 38 行
100 条2110170012是,余 88 行
200 条4310340012是,余 188 行
500 条(上限)10910850012是,余 488 行

规律很直白:CSV 体积 ≈ 16 + 条数 × 21.8 字节(16 位口令、序号最多三位数时),来源就是"每行一条纪录"——19 字节的固定占用(逗号、引号、CRLF 与 16 位口令)加上序号本身的位数。即便拉到 500 条,导出文件也只有 10.9 KB,轻松塞进任何邮箱和表格。

输入范围、边界与精度说明

下面这些是刻意设定的边界,知道它们能避免你把这个随机密码生成器当万能工具用:

常见问题

批量生成 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 导出。要评估某一条口令的强弱,请用页面底部的「高强度密码生成器」。

相关工具