密码生成器
选长度、选包含哪些字符,然后复制。强度那一栏给的是信息熵的比特数 —— 是一个真实的数字,而不是一根彩色进度条;页面下面也写清楚了它说明了什么、说明不了什么。
这个浏览器没有提供 Web Crypto 接口,拿不到安全的随机源。生成器因此停用,而不是退回一个可预测的随机数。
这是信息熵(单位是比特),前提是密码在所选的字符集里均匀随机。它衡量的只是暴力破解的难度,别的什么都说明不了。
密码在这个标签页里用浏览器的密码学随机源现场生成,不记录、不上传,页面也不保存生成过的历史。
使用方法
先定长度
除非有别的限制,直接从 20 位起步。长度是决定密码有多难破解的最大一个杠杆,而它的代价只是往密码管理器里多存一个字符。
再选字符类型
小写、大写、数字、符号。「排除容易看错的字符」如果留着,适合那种需要人对着屏幕抄到别处去的场合 —— 它去掉 0 O o 1 l I,而抄错基本都出在这几个字符上。
不满意就重新生成
每按一次都用浏览器的密码学随机源重新生成一个。页面不留历史,所以生成完又忘了的密码就是真的没了 —— 请先复制再走。
直接复制进密码管理器
不要复制到便签里,也不要发到聊天窗口里。多数系统的剪贴板对上面运行的每个程序都是可读的,所以合理的去处是密码管理器,粘贴一次就好。
长度压倒字符复杂度,而且差距很大
可能的密码总数,是字符池大小的「长度次方」。长度在指数上,所以增加长度是成倍地加大攻击者的工作量;而扩大字符池只是把它乘上一个不大的常数。这就是为什么一个只用小写字母的 20 位密码(约 94 比特),强度远高于一个用满键盘符号的 10 位密码(约 65 比特)。
实际差距比这个还大,因为真正的攻击者不会去穷举整个空间。他们跑泄露密码字典,然后套变换规则 —— 首字母大写、后缀年份、a 换成 @。像 `Summer2024!` 这样的密码正好落在这套规则的正中央,看起来花样不少,实际上几乎瞬间就被拿下。一长串随机字符没有结构可套,这才是应该选它的真正理由。
所以实话是:先挑系统允许的最长长度,再考虑要不要加各种字符类型。如果某个网站只让你用 12 位 —— 现在仍有这样的 —— 那是对你在这家网站安全性的真实限制,值得知道,而不是默认自己设的长密码真的生效了。
随机数从哪来,以及为什么这件事要紧
这个工具用的是 `crypto.getRandomValues`,也就是浏览器访问操作系统密码学随机数发生器的接口。它的种子来自系统认定不可预测的硬件事件,即使你知道这台机器的一切,也无法复现它的输出。
另一种选择是 `Math.random`。它是为「快」和「统计上均匀」设计的通用发生器,不是为「猜不出来」设计的。只要拿到几个输出,就能反推出它的内部状态,进而预测之后每一个值。用它在后台生成的密码,在浏览器里看起来完全随机,而对见过几次输出的人来说是可以轻易预测的。这不是理论担忧 —— 这类生成器真的上线过。
还有第二个更隐蔽的问题,即使随机源本身没问题,实现粗心也会踩到。如果你取一个随机字节、再对字符池大小取模,那么只要池子大小不整除 256,池子靠前的那些字符就会略微更常出现。对 62 个字符的池子来说,前 8 个字符每个多出 256 分之一次机会。偏差很小,损失的是零点几比特,但避开它不需要任何代价:取一个字节,如果落在不完整的那一段就丢掉重取。这个页面就是这么做的。
一个必须说清的局限:信息熵是**生成过程**的属性,不是结果字符串的属性。它没法告诉你自己想的密码弱不弱 —— 那种弱来自「它在字典里」。一个给 `Tr0ub4dor&3` 亮绿灯的工具,衡量的是字符种类,不是强度。
「每类至少一个」并不像看起来那样是安全功能
很多网站要求密码里必须有大写字母、数字和符号各至少一个。这条规则存在,这个生成器也默认遵守它,但值得搞清楚它到底买到了什么、又付出了什么。
买到的是:几乎为零。强制每类至少一个,会把「恰好只用了一类字符」的那些密码从空间里剔除 —— 但对一个足够长的密码来说,这部分本来就是极小的一撮。对信息熵的影响小到可以忽略,这个工具也没有假装它有多了不起。
付出的则是:一个可预测的结构。攻击者知道这条规则存在,所以他们的破解规则默认每个密码里都有符号和数字。强制混用,等于排除了「误打误撞写出一段全小写长口令」的可能 —— 而那恰恰是任何规则集都没为它准备过的那种密码。
这条规则之所以还在这里,是因为网站会强制它,而一个提交不上去的密码不算密码。用它可以,但请把信心放在长度和「不重复」上。如果一个服务允许你设一个 24 位的纯小写密码,而你又愿意输,那就用它。
多长、用在哪儿,以及「重复使用」这件事
一个粗略的标尺:40 比特左右,是面对有限速的在线登录攻击时开始不现实的位置;60 比特左右,能扛住针对保护尚可的哈希做的离线攻击;80 比特以上,以现有算力基本无从暴力穷举。这个工具就是按这三个数字给出「弱/一般/强/很强」的,没有另发明一套刻度。
能用来重置你其他账号的东西 —— 邮箱、网银、密码管理器的主密码 —— 请瞄准 80 比特以上;按 90 个字符的池子算,就是 13 位起步。一年用两次的购物网站账号,60 比特足够了。至于 Wi-Fi 密码,长度在这里是因为另一个理由:一长串随机字符在手机上没法输,更别说电视遥控器 —— 所以才说设一次长密码,然后用二维码让别人加入。
一个不太好听的事实是:和「重复使用」相比,上面这些全是次要的。绝大多数账号被盗根本不是有人破解了谁的密码,而是拿 A 站泄露出来的密码去挨个试 B 站、C 站。一个 12 位的、每个站都不同的密码,安全性远高于一个在五个地方共用的 30 位密码。如果这一页只带走一句话,请带走这句,剩下的交给密码管理器。
最后一个实际陷阱:有少数系统对密码长度的上限远低于你会选的数值,或者在 20 位、64 位处悄悄截断。一些较老的哈希实现会在 72 字节处截断。如果某个网站拒绝你的长密码,别默认你的长密码真的生效了 —— 它可能被截掉过。而如果两个不同的长密码在登录时表现完全一样,那就是网站在悄悄截断的信号。
密码、口令,以及这个工具不做的事
一长串随机字符对机器来说是最优的存储形式,对人来说则是灾难 —— 密码管理器就是为这个而存在的。对多数人来说实际可行的安排是:一个自己背下来的长主口令,加上由它保管的、每个站点各不相同的随机密码。在这个页面生成的东西不需要好记,也不应该好记。
如果真的需要一个能记住的,口令短语是更好的形状:从一个大词表里随机取四到五个互不相关的词。从 7777 个词的词表里取五个词,大约是 64 比特,而且它比 `x7#Kq2!vLm9` 更扛得住「写在便利贴上」这种现实检验。前提是这些词必须随机抽取,不能自己编 —— 你自己想出来的生动画面,来自一个比词典小得多的空间;「correct horse battery staple」之所以成立,是因为那几个词是生成器抽的。
这个页面刻意不做的一件事,是给你**自己输入**的密码打分。要判断人写的密码强不强,需要一份包含数百万条真实泄露密码的清单,外加攻击者使用的变换规则 —— 那是 zxcvbn 这类库携带的、几百 KB 的数据。没有它,任何评分都是把猜测包装成分析。想给自己想的密码一个结论,请用自带这些数据的检测工具,并且默认真实结果比看上去更糟。
它也不留历史。没有「最近生成」列表,因为一个躺在浏览器标签页里的密码清单只有风险、没有任何好处。离开这个页面,在这里生成过的东西就没了。
最后更新:
常见问题
在网站上生成密码安全吗?
在这里是安全的:生成过程跑在页面里,用的是浏览器自己的随机源,内容不发往任何地方。但一般的提醒仍然成立 —— 任何人都能照抄一个页面的外观。请看清地址栏;如果要保护的东西很重要,优先用密码管理器自带的生成器,那样需要信任的对象少一个。
到底需要多少比特?
普通账号 60 比特左右,邮箱、网银和密码管理器的主密码 80 比特以上。这两个数字来自:多少能让有限速的在线攻击变得不现实,多少能让针对尚可的哈希做的离线攻击不可行。超过 100 比特之后,再加长度只会增加麻烦。
要不要加符号?
只在网站强制要求时加。符号带来的强度有限,带来的麻烦不少 —— 有些系统会把它转义得乱七八糟,有些干脆拒绝,而且它们是人们最常打错的字符。如果一个网站允许 24 位纯小写密码,那比 12 位的混合密码更强。
为什么不用一个好记的密码?
因为「你好记」就意味着「规则能猜到」。破解者不是穷举所有字符串,他们跑的是字典加变换规则,而任何由词、日期或规律拼出来的东西都在这套规则覆盖的范围里。好记的密码只有在「从一个大词表里随机抽出的口令短语」这个前提下才成立。
密码越长就一定越强吗?
只有在它确实随机、而且系统真的按全长处理时才是。有些网站在 20 位或 64 位处悄悄截断,较老的 bcrypt 实现在 72 字节处截断,超出的部分不贡献任何强度。遇到上限很低的网站,就把那个上限当作你在这家网站真实的安全上限。
同一个密码能用在多个网站上吗?
不能 —— 这一条比本页其他所有内容加起来都重要。多数账号被盗,都来自「A 站泄露的密码被拿去撞 B 站」。一个普通的、每个站都不同的密码,安全性远远高于一个很棒的、五处共用的密码。
为什么这个工具判断不了我自己输的密码弱不弱?
因为那需要一份真实泄露密码的数据库,加上攻击者使用的变换规则 —— 几百 KB 的数据。没有这些,评分衡量的是字符种类而不是强度,`Password1!` 就是这么被评为「强」的。这里给的数字只关于随机性,而且只适用于在本页生成的密码。