随机密码生成器

在浏览器内生成高强度随机密码,显示真实的熵值,并对破解耗时给出诚实的估计。

所有处理均在你的浏览器内完成,数据不会上传。

去掉 0 O o 1 l I 这类容易看混的字符——如果密码需要念出来或手工输入,值得勾上。

130熵 (位)
89字符池大小
很强强度

平均破解耗时

若以快速哈希存储(MD5、SHA-256)远超人类文明的时间尺度
若以 bcrypt 或 Argon2 存储远超人类文明的时间尺度

同一个密码,这两个数字相差八个数量级。真正决定难度的不是密码看起来多复杂,而是网站怎么存的——而这一点你无从得知。请按其中更差的那个来判断。

在你的浏览器内用 crypto.getRandomValues 生成,取自操作系统的密码学随机源——不是 Math.random,后者的输出可以由先前的值推算出来。

使用方法

  1. 拖动滑块设置长度,16 位以上是合理的默认值。
  2. 勾选要包含的字符类型。
  3. 如果密码需要念出来或手工输入,打开 排除形近字符
  4. 任何改动都会立即重新生成——也可以点 重新生成 换一个。

关于密码强度

密码强度只有一个诚实的尺度:,也就是攻击者需要穷举的可能性数量。它等于长度乘以 字符池大小的以 2 为底的对数,每多一位,工作量翻一倍。本工具展示的就是这个数字,而不是 一根你无从查验其规则的彩色进度条。

熵揭示的最有用的一件事是:长度完胜复杂度,而且不是勉强胜出。给一个 12 位密码加上 符号,字符池从 62 扩到约 88,大约值 5 位熵;而给同一个密码多加 4 个字符,大约值 24 位—— 接近五倍。那些要求必须含符号、却把长度上限定在 16 的策略,把取舍做反了。更糟的是,它们 把人推向 P@ssw0rd! 这类可预测的替换,而攻击者对这些模式已经建模了几十年。

第二件值得记住的事是:网站怎么存你的密码,比密码本身更重要。面对 SHA-256 这类快速 哈希,现代 GPU 集群每秒可以尝试上万亿次;面对刻意放慢的 bcrypt 或 Argon2,同样的硬件 每秒只能试几千次。这是八个数量级的差距,远远盖过「一个好密码」与「一个更好一点的密码」 之间的任何现实差异。你无从知道某个网站用的是哪种,所以应当按更悲观的那个数字来规划。

最后是任何生成器都修不好的那个漏洞:复用。每个网站用不同的密码,才能让一家公司的泄露 只变成一个问题、而不是所有问题。这需要密码管理器——因为 20 个随机字符天然记不住, 而这恰恰是它们值得被生成出来的原因。

常见问题

生成的密码会被发送到别处吗?

不会。密码由你标签页里的 JavaScript 生成,从不传输——这里根本没有能接收它的服务器。这一点对密码生成器比对其他任何工具都更重要:一个经网络到过别人服务器的密码,就是一个已经被别人看到过的密码。

随机性到底可靠吗?

取自 crypto.getRandomValues,它来自操作系统的密码学熵池。关键的对照是 Math.random:它很快,但可预测——攒够足够多的历史输出,攻击者就能推算出后续的值。Math.random 用来打乱一个列表没问题,但不适合任何「被猜中会让攻击者获利」的场合。

熵这个数字是什么意思?

它是「在当前设置下可能生成多少种密码」的以 2 为底的对数——60 位意味着有 2^60 种可能。每多一位,搜索空间翻一倍。这是衡量密码强度唯一诚实的尺度;不像多数网站那种彩色强度条,它不取决于密码里是否恰好在某个位置出现了启发式规则喜欢的符号。

为什么两个破解耗时差这么多?

因为网站的存储方式盖过了其他一切因素。SHA-256 这类快速哈希的设计目标就是快,GPU 集群每秒可以尝试上万亿次;而 bcrypt 与 Argon2 是刻意做慢的,同样的硬件每秒只能试几千次。同一个密码,可能不堪一击也可能坚不可摧,取决于一个你完全看不到的决定——所以应该按更悲观的那个数字来规划。

密码是更长好,还是更复杂好?

长度胜出,而且差距悬殊。给一个 12 位密码加上符号,字符池从 62 扩到约 88,大约多 5 位熵;而给同一个密码多加 4 个字符,大约多 24 位。这正是那些「必须含标点、但长度上限 16」的密码策略适得其反的原因——它们逼人做出把 a 换成 @ 这类可预测的替换(攻击者已经建模几十年了),却堵死了真正管用的那个改动。

是不是该用密码管理器,而不是记住这些密码?

是的。一个生成出来的 20 位密码天然记不住,而这正是重点——你不该复用任何记得住的东西。密码管理器还能解决本工具无能为力的那个现实问题:多个网站用同一个密码,于是一次泄露就等于全部失守。