密码生成器
生成强密码,自定义长度和字符类型
排除容易混淆的字符,如 0O、1lI
什么是密码生成器?
密码生成器会根据指定长度和字符规则创建随机、难以猜测的强密码。可靠的生成方式应使用加密安全随机数,并在目标系统确实支持时才组合大写字母、小写字母、数字和特殊符号。强密码能降低字典攻击、暴力猜测和撞库风险,但不能替代密码管理器、每个账户使用唯一密码和启用多因素认证等安全习惯。过于复杂的密码不应靠记忆或重复使用,而应安全保存。对于团队或共享系统,还需要明确轮换周期、负责人和访问权限。
使用方法
生成步骤
- 选择密码长度(建议至少 12 位)
- 勾选字符类型:大写字母、小写字母、数字、符号
- 可选择排除易混淆字符,如 0O、1lI
- 点击生成按钮,不满意可重新生成
密码强度
- 弱:少于 8 位或仅单一字符类型
- 一般:8-11 位,混合字母和数字
- 良好:12-15 位,包含多种字符类型
- 强:16 位以上,包含全部字符类型
安全提示
- 所有密码均在本地生成,不会上传至服务器
- 不同网站使用不同密码
- 使用密码管理器安全存储密码
- 定期更换重要账户的密码
- 避免在密码中使用个人信息
使用场景
技术原理
密码生成器从 crypto.getRandomValues(new Uint32Array(n)) 获取随机性,该函数用操作系统熵源(Linux 的 getrandom、Windows 的 BCryptGenRandom、macOS/iOS 的 SecRandomCopyBytes)填充类型化数组,产生密码学安全的伪随机值。这是 W3C Web Cryptography API 定义的 CSPRNG——不同于 Math.random(),后者在 V8 中使用 xorshift128+ 算法,官方文档明确说明它是非密码学的、可从少量输出样本预测。 字符池由用户选择的字符类组成:大写字母(26 个 A-Z)、小写字母(26 个 a-z)、数字(10 个 0-9)和特殊符号(32 个 !@#$%^&*()_+-=[]{}|;:,.<>?),最大池容量为 94 个字符。自定义字符集或排除列表(包括过滤 i、I、l、L、1、o、O、0 等易混淆字符)可进一步精简字符池。每个密码字符通过 array[i] % pool.length 选取,由于 CSPRNG 输出在 32 位上均匀分布,且池长度不超过 256 时取模偏差极小(偏差低于 0.00000006%),远低于实际可感知范围。 密码强度由搜索空间大小衡量:对于大小为 C 的字符池和长度为 L 的密码,可能的密码数量为 C^L。以比特为单位的熵值为 log2(C^L) = L × log2(C)。启用全部四类字符(C=94)的 16 位密码,产生 94^16 ≈ 4.4 × 10^31 种组合,约 105 比特熵。假设攻击速度为每秒 10^12 次猜测(大致相当于大型 GPU 集群对 NTLM 等快速哈希的吞吐量),穷举搜索需要约 4.4 × 10^19 秒——远超宇宙年龄。该模型假设攻击者必须逐一测试所有组合(无字典或模式捷径),且密码使用 bcrypt 或 Argon2id 等慢速加盐哈希算法而非明文存储。 NIST SP 800-63B 建议用户自选密码最少 8 个字符,机器生成凭据最少 6 个随机字符,并记录字符集。生成器的 4-64 位长度范围覆盖从 PIN 码到高熵机器凭据的各种场景。「以字母开头」选项确保首字符从 [A-Za-z] 中选取,满足要求密码以字母开头的遗留系统。
- CSPRNG 来源:crypto.getRandomValues() 从操作系统内核的 CSPRNG(getrandom/BCryptGenRandom/SecRandomCopyBytes)获取熵——不同于 Math.random()(xorshift128+),它不可预测、不由页面设定种子,适合凭据生成。
- 字符空间数学:启用全部四类时池大小为 94;每个字符的熵为 log2(94) ≈ 6.55 比特。16 位密码携带约 105 比特熵;长度翻倍到 32 位则提升至约 210 比特。
- 取模选取:array[i] % pool.length 将 32 位 CSPRNG 输出映射到字符索引——池长 256 以下时偏差低于 6 × 10^-8%,在密码学上可忽略。
- 暴力破解抵抗模型:以每秒 10^12 次猜测(GPU 集群规模),16 位、94 符号的密码穷举需要约 10^19 秒——但这假设使用快速哈希;bcrypt 以 cost factor 12 运算时攻击者降至每秒约 10^4 次猜测,即使是 8 位密码也有较强韧性。
- 易混淆字符排除:过滤器移除 {i, I, l, L, 1, o, O, 0}(8 个字符)——这将池从 94 缩减到 86,每个字符损失约 0.6 比特熵,在手动抄写场景中为可用性带来的收益可以接受。
- NIST SP 800-63B 对齐:该标准要求机器生成密钥最少 6 个随机字符,并建议记录字符空间——生成器的预设(简单 8 位、高强度 20 位)对应不同的保证级别。
- localStorage 历史:最近 10 个生成的密码保存在 window.localStorage 中,其作用域为源和浏览器配置文件——清除历史会从存储中删除,但磁盘级取证工具可能恢复它们,因为 localStorage 在浏览器配置文件目录中以明文 SQLite 数据库存储。
示例
强密码(混合字符类型)
Kx9#mP2$vL7@nQ4! - 16 位,包含全部四类字符(大写/小写/数字/符号)
强度:极高;即使每秒尝试 100 亿次,暴力破解也需要数百年PIN 码(4 位数字)
8527 - 4 位纯数字
强度:1 万种组合;只适合配合限频和锁定的设备解锁,不适合在线账户密码强度对比
8 位,仅小写 :26^8 ≈ 2.08e11 种组合
8 位,混合字符类型 :94^8 ≈ 6.10e15 种组合
16 位,混合字符类型 :94^16 ≈ 3.7e31 种组合
说明:每多一位字符,密钥空间扩大 94 倍,而不是 8 倍——长度比字符种类更关键常见问题
密码是在我的浏览器里生成的吗?
是的。页面使用 Web Crypto API 的 crypto.getRandomValues,提供加密强度的随机字节。密码不会离开你的设备,不会被记录,也不是从确定性种子派生的。如果想确保万无一失,可以刷新页面以启动新的熵序列。
应该选择多长的密码、包含哪些字符?
对于在线账户,16 位以上、包含大小写字母、数字和符号是当下的最低标准。对于主密码(密码管理器、加密密钥),20 位以上或 6-7 个单词的口令短语更安全。超过一定长度后,长度比字符集复杂度更重要。
为什么有些网站拒绝我刚生成的密码?
一些网站仍在执行令人意外的限制:最长长度(通常 12-20 位)、不允许符号、只允许特定符号或不允许空格。页面提供了字符开关,方便你匹配规则。请举报这些网站——这类策略实际上削弱了安全性。
是否会有意避开某些字符?
如果开启「避免相似字符」选项,生成器会排除 0/O、1/l/I 等抄写在纸张或便利贴时容易看错的字符对。如果只在数字环境下使用密码,可以关闭此选项以获得最大熵。
长随机密码比口令短语更安全吗?
在熵相同的情况下,两者抵御暴力破解的难度相当。一个 16 位的混合密码大致等同于一个从 2000 词表中随机选 6 个词的口令短语。口令短语更易输入和记忆;纯随机字符串则更适合从密码管理器粘贴。按使用场景选择即可。
可以放心用它生成密码管理器主密钥吗?
可以——随机源与浏览器生成 HTTPS 密钥所用的 Web Crypto API 完全相同。话虽如此,对于极高价值的秘密(主密钥、恢复码),人们往往更倾向于掷骰子(diceware)或使用离线工具,单纯为了把浏览器从信任链中移除。
我应该把生成的密码保存在这里吗?
不应该。页面不保存密码;请立即将其复制到密码管理器(1Password、Bitwarden、KeePass 或浏览器内置管理器)。关闭页面或刷新会永久丢弃密码。