用真实数字讲清楚密码熵
发布于 2026-07-20
密码强度指示条靠的是感觉,而熵靠的是算术。这里是「密码强度」背后真正的数学原理,基于真实硬件数据算出的破解时间,以及一次诚实的审视:那些你被迫遵守的规则,到底有没有用。
什么是一比特的熵
熵衡量的是一个密码是从多少个等可能的选项中抽取出来的,以 2 为底的对数来表示。从 1,024 种可能中均匀选取的密码具有 10 比特的熵,因为 210 = 1,024。每增加一比特,攻击者在最坏情况下所需的猜测次数就会翻倍。对于随机生成的密码,公式很简单:熵 = 长度 × log2(字符集大小)。
这句话里「随机」这个词承担了全部的重量。这个公式只有在每个字符都由一个合格的随机生成器选取时才成立。人类想出来的密码不符合这个条件:人类选取的往往是一个很小、且严重偏斜的集合——名字、日期、键盘上相邻的按键序列,以及末尾加个 1 的单词——而破解软件正是围绕这些模式构建的。
按字符计算的数字
仅小写字母:26 个符号,每字符 4.70 比特。加上大写字母:52 个符号,5.70 比特。加上数字:62 个符号,5.95 比特。加上所有可打印的 ASCII 符号:95 个符号,6.57 比特。请注意这个递进有多弱。从纯小写一路加到完整的 95 符号大杂烩,每字符增加的熵还不到 2 比特,而给密码多加一个字符,就能增加 4.7 到 6.6 比特。长度每次都完胜字符集复杂度,而且完全不是一个量级。
具体的破解时间
假设最坏但现实的情况:你的密码哈希在一次数据泄露中流出,网站使用的是 MD5 或 NTLM 这类快速算法(也就是你在我们的哈希生成器中可以瞬间算出的那种哈希,而这正是问题所在),攻击者使用一台现代多 GPU 设备,每秒大约进行 1000 亿次猜测。穷举所有组合所需的时间:
| 密码 | 熵 | 穷举所需时间 |
|---|---|---|
| 8 个随机小写字母 | 37.6 比特 | 约 2 秒 |
| 8 个随机字符,完整 95 符号集 | 52.6 比特 | 约 18 小时 |
| 12 个随机小写字母 | 56.4 比特 | 约 11 天 |
| 5 个随机 diceware 单词 | 64.6 比特 | 约 9 年 |
| 16 个随机小写字母 | 75.2 比特 | 约 14,000 年 |
| 6 个随机 diceware 单词 | 77.5 比特 | 约 70,000 年 |
| 12 个随机字符,完整 95 符号集 | 78.8 比特 | 约 170,000 年 |
对于平均情况,把这些数字减半,因为攻击者通常在遍历完一半的可能性空间时就会找到密码。如果网站使用的是 bcrypt 或 Argon2 这类慢哈希算法,猜测速率会骤降大约一百万倍,表中每一行的时间也会随之延长一百万倍。但你几乎永远不知道某个网站具体用的是什么算法,所以要按快速情况来规划。
为什么密码短语更胜一筹
从标准的 7,776 个单词的 diceware 词表中随机选取一个单词,其价值为 log2(7776) = 12.9 比特。五个单词能达到 64.6 比特;六个单词能达到 77.5 比特,大致相当于从完整符号集中抽取的 12 个真正随机字符的强度。区别在于,「maple-thunder-oboe-crisp-vandal」可以在手机键盘上打出来,用过几次后也能记住,而「xX9#qL!2mFp$」做不到。不过同样的前提依然适用:这些单词必须来自一个随机生成器。如果你自己去挑,你会挑出常见的、彼此相关的单词,真实的熵就会大幅下降。
真正的随机性从何而来
每个现代浏览器都提供了一个密码学安全的随机数生成器 crypto.getRandomValues,它的种子来自操作系统的熵池。基于它构建的生成器,只要在把随机字节映射到字符集时小心避免采样偏差,生成出的密码的熵就能真正符合公式的预期。这就是「生成的密码」和「自己想出来的密码」之间的全部区别:生成的密码,其熵是真实且可计算的;而自己想出来的密码,其熵只是一个猜测,而且通常是一个过于乐观的猜测。
三个该淘汰的误区
强制要求符号。 正如上面每字符的数字所示,「至少一个大写字母、一个数字、一个符号」这类组成规则对数学上的强度几乎没有影响,而在实践中,它们反而会把人们推向可预测的模板:首字母大写,末尾加感叹号,用 @ 代替 a。破解规则集早已把这些替换方式编码进去几十年了,所以无论强度指示条怎么显示,P@ssw0rd! 都会在毫秒级被破解。NIST 的指南(SP 800-63B)自 2017 年起就建议不要使用组成规则。
每 90 天强制轮换。 可预见的结果就是 Summer2025! 变成 Autumn2025!。NIST 再次给出建议:只有在有证据表明密码已泄露时才更换密码,而不是按日历更换。
仅凭字符串外观判断熵。 熵是生成密码这一过程的属性,而不是输出结果本身的属性。你脑子里想出来的「xK4pQ9vT」,比来自密码学随机生成器的八个字符要弱得多,尽管两者看起来一模一样。这也是为什么强度指示条会误导人:它们只能看到输出结果。
实用的目标
对于攻击者只能通过在线方式、面对限速机制来猜测的账户,40 比特就绰绰有余:以每小时 100 次的猜测速率,即使遍历 230 种可能性也需要超过一千年。而对于任何在数据泄露后可能被离线攻击的场景——对于你在意的账户,这应该是稳妥的默认假设——建议目标定在 75 比特以上:大约 14 个随机混合字符,或者六个 diceware 单词。并且要让每个网站使用的密码各不相同,这样一个被攻破的论坛账户就不会连带解锁你的邮箱,实际上这意味着你需要一个密码管理器加一个生成器。
如果你想看看这套数学原理在实际中的运作,norito 的密码生成器提供两种模式——随机字符串和基于单词的密码短语,并带有实时熵值显示。和本站的每一个工具一样,它完全在你的浏览器中运行,而这恰恰是密码工具最该做到的事。