toolfree

密码产生器

在浏览器里用平台的密码学乱数产生器产生强密码,强度以比特为单位呈现,而不是一根彩色长条。

在你的浏览器中运行

长度: 20

如果这组密码要从屏幕上读出来再打到别的地方,这个选项就值得开。

长度胜过复杂度:20 个小写字母的熵,比 8 个混用所有类别的字符还高。

在这个页面里生成与计算。没有任何传输、存储或记录。

乱数是从哪里来的

这里的密码取自 crypto.getRandomValues,也就是浏览器的密码学安全乱数产生器,绝不使用 Math.random

这个区别不是学术性的。Math.random 的设计目标是快,而且是可预测的:只要看到够多输出,就能 还原出它接下来的值。用它做的密码产生器会产出看起来随机、实际上不是的密码,这比没有产生器 更糟,因为它让人有安全感。

字元的选取也采用拒绝采样,而不是取余数。用 byte % 62 会把 256 个值不平均地对应到 62 个 字元,让前八个字元出现的机率高出大约 8%。这个偏差不大、完全可以避免,而且避免它不花任何代价 ——所以落在可用范围外的字节会被丢弃重抽。

用比特表示的熵,不是彩色长条

强度以熵的比特数呈现,那是一个你可以拿来推理的数字:它等于 长度 × log2(字元集大小), 每多一个比特,猜测的工作量就加倍。

一根写着「强」的长条什么都没告诉你。60 比特大致是「对杂凑做得不好的密码发动离线攻击」不再 轻松的门槛;80 比特很充裕;超过 128 之后这个数字就不太有意义了,因为系统里其他环节都没那么强。

这个数字假设攻击者知道产生器与字元集,只有「选了哪些字元」是秘密。那是正确的假设——真实世界的 攻击都是这样进行的。

长度胜过复杂度

这是这一页最有用的一件事,也是大多数密码规则搞反的那一件。

**20 个小写字母大约是 94 比特。8 个混用所有类别的字元大约是 52 比特。**又长又单纯的那个强得 多,而且在手机上好打得多。

要求「一个大写、一个数字、一个符号」的规则,多半只是把人推向 Password1!——一个字典单字加上 可预测的装饰,而那会很早就被猜到。如果表单允许你用长密码,就用长密码。

易混淆的字元

Il1O0o 在许多字体下难以分辨。排除它们会损失一点熵,但能避免抄写错误, 所以当这组密码要从屏幕上读出来、再打到别的地方时(例如 Wi-Fi 密码、设备设定)就值得;如果它 是直接进密码管理器的,就不必。

没有任何上传

在这个页面里产生,也不会存到任何地方。关掉分页就等于彻底清除了。