密码生成器
在线生成强密码:自定义长度(4-128)与字符集(小写 / 大写 / 数字 / 符号), 可排除易混字符(0O1lI)便于人工抄写。基于浏览器原生 crypto.getRandomValues(CSPRNG) 与拒绝采样算法,消除模偏差,所有随机数在本地生成。
- 点击"重新生成"开始创建密码
常见问题
什么才算"强密码"?长度和字符集哪个更重要?
密码强度由熵(entropy)决定,公式为
熵 = 长度 × log₂(字符集大小)。字符集越大、长度越长,熵越高,破解越难。
- 4 类字符集(小写 26 + 大写 26 + 数字 10 + 符号 28 ≈ 90 个字符),单个字符约 6.49 bits
- 仅小写字母(26 个),单个字符约 4.70 bits
- 仅数字(10 个),单个字符约 3.32 bits
结论:长度比字符集更重要。12 位仅小写字母的熵(56.4 bits) 高于 8 位四类字符集的密码(51.9 bits)。建议优先保证长度 ≥ 16,再追求字符集多样性。 NIST SP 800-63B 建议用户密码至少 8 位,但现代暴力破解速度下 12-16 位更稳妥。
为什么不能用 Math.random 生成密码?
Math.random 是基于伪随机数生成器(PRNG)的,输出可被预测,
不适合安全敏感场景。攻击者若能收集足够输出,可重建内部状态并预测后续随机数。
本工具使用浏览器原生 crypto.getRandomValues,
基于加密安全的伪随机数生成器(CSPRNG),其随机性满足密码学要求,
适用于会话令牌、API 密钥、密码等安全场景。
什么是"模偏差"?为什么需要拒绝采样?
简单实现 charset[random % charsetSize] 在 charsetSize 不整除 256 时
会导致字符出现概率不均。例如 charsetSize = 90,则前 36 个字符的概率比后 54 个高约 1.4%。
本工具采用拒绝采样(rejection sampling)消除模偏差:
先取一个随机字节(0-255),若其值 ≥ floor(256/charsetSize) × charsetSize
则丢弃重新取,直到落入均匀分布区间。最坏情况重试概率仅约 1-3%,平均 1.01 次。
强度评估的等级是怎么划分的?
本工具基于熵值(bits)划分 5 个等级,参考 NIST SP 800-63 与常见实践:
- 极弱(<28 bits):可被秒级破解,不建议使用
- 弱(28-36 bits):分钟级破解,仅用于低敏感场景
- 一般(36-60 bits):本地暴力需数小时-数天
- 强(60-100 bits):在线破解不可行,离线暴力需数年
- 很强(≥100 bits):离线暴力也不可行,适用于加密密钥
参考阈值:在线攻击可破解约 30 bits 的密码;离线 GPU 暴力可破解约 60 bits; 要抵御国家级攻击需 ≥ 128 bits。
排除易混字符是什么意思?什么时候用?
部分字符在常见字体下视觉相近,人工抄写或口头告知时易混淆:
- 数字
0与字母O/o - 数字
1与字母l(小写 L)/I(大写 i) - 符号
|与字母l/ 数字1 - 引号
'与"在终端字体下难以区分
建议:需打印、手抄、口头传达的密码(如 WiFi 密码、会议口令)勾选此项; 纯数字存储的密码(如密码管理器自动填充)无需勾选。
生成的密码会被记录或上传吗?
不会。本工具完全在浏览器内运行,使用 crypto.getRandomValues 在本地生成密码,
所有数据不离开你的设备,不会上传到任何服务器,也不会被记录。
生成后建议立即复制到密码管理器(如 Bitwarden、1Password)保存。
如需配套生成 UUID(用于 API 令牌、会话 ID),可使用 UUID 生成器;如需对密码进行哈希摘要,可使用 Hash 计算工具。
密码应该多久更换一次?
现代安全实践(包括 NIST SP 800-63B)不再建议定期强制更换密码, 除非怀疑已被泄露。频繁强制更换反而促使用户选择弱密码或仅做最小变更(如 password1 → password2)。
更有效的做法:
- 每个网站使用独立密码(用密码管理器管理)
- 密码长度 ≥ 16 位,熵 ≥ 60 bits
- 开启两步验证(2FA / MFA)
- 关注 Have I Been Pwned 等泄露通知服务
符号集包含哪些字符?为什么避开空格和引号?
本工具符号集为 !@#$%^&*()-_=+[];:,.?/,共 22 个字符。
避开以下字符以提升兼容性:
- 空格:粘贴到表单时易被截断或前后丢失
- 双引号
"与单引号':在 SQL、Shell、HTML 中需转义,易引发注入或解析错误 - 反斜杠
\:在 Shell、JSON、正则中是转义字符 - 尖括号
<>:在 HTML 中是标签边界
如需更严格的符号集,可在使用前手动筛选。