为什么不能用 Math.random() 生成密码
Math.random() 用起来顺手,但它不是为安全场景设计的:它给的是「看起来随机」的伪随机数,
由初始种子按固定公式推出来,种子一样,后面的序列就一样。它追求的是分布均匀、跑得快,
而不是让人猜不到下一个数是什么。
密码是钥匙,钥匙必须不可预测。用可预测的随机源生成密码,等于把「猜密码」降级成「按顺序试」,
所以本页生成密码时一个 Math.random() 都没有用,
用的是浏览器内置的 crypto.getRandomValues():它从操作系统取熵,输出不可预测、不可反推,
是专为密码学用途准备的接口。浏览器不支持它时,本页直接拒绝生成,而不会退回弱随机源。
长度比复杂度更重要
衡量强度最实用的指标是熵(单位 bit):熵 = log2(字符池大小) × 长度。
字符池就是允许出现的所有字符:只勾小写字母是 26 个,加上大写字母和数字是 62 个。代入看看:
- 16 位纯小写:
log2(26) × 16 ≈ 4.70 × 16 ≈ 75 bits - 8 位大小写字母加数字:
log2(62) × 8 ≈ 5.95 × 8 ≈ 48 bits
看着更复杂的 8 位,熵反而低了近 30 bits——每多 1 bit,要试的组合就翻一倍。 原因是加长度是乘法,加字符类型只是加法:长度从 8 翻到 16,熵直接翻倍; 字符池从 26 扩到 62,熵只涨不到三成。只能改一处的话,先改长度。
所以:先加长度,再谈字符类型。
多长算够?日常账号 16 位起步,邮箱、网盘这类丢不起的账号给到 20 位以上。
不要一码多用
密码的安全性不只取决于它多难猜,还取决于它被多少个地方同时信任。 同一个密码在论坛、购物、邮箱、办公系统里反复用,等于把所有账号的安全等级拉平到最弱的那一个: 任何一家被拖库,对方拿到的就是一把能开你所有门的总钥匙。而且这类尝试是自动化的,不需要人盯着。 每个网站一个独立密码,最坏情况就被关在那一家里。
实际该怎么做
- 用密码管理器:几十个网站各配一个 16 位以上的随机密码,全交给它保管。
- 只记一个主密码:够长、好记、绝不在别处使用,最好再配上两步验证。
- 需要人工抄写的场合(设备默认口令、要念给别人的一次性口令):勾上「排除易混淆字符」,把
0 O o 1 l I |剔出去,抄错念错的概率会低很多。 - 要粘进命令行或配置文件时:优先用「常见符号」那一档,引号、反斜杠、反引号很容易被转义或截断。
关于这个页面
密码都在你的浏览器里现算,不联网、不上传、不写 localStorage 或 Cookie,刷新即清空, 服务器端查不到任何记录——你可以开着开发者工具边生成边看,全程不会产生请求。 也正因如此,本站没办法帮你找回密码:请当场把它存进密码管理器,关掉页面就真的没了。
在公用电脑上,屏幕本身也是一种泄露途径,生成后记得清掉剪贴板再关页面。
本工具完全在你的浏览器里运行,不保存任何生成结果。