跳转到主内容
指南

密码熵:为什么长度胜过复杂度的真实数学原理

· 12 分钟阅读

二十年来,密码建议一直停留在”要用大写、小写、数字加符号”的某个版本上。数学告诉我们这基本上是错的——或者至少是优先级严重错位。随机生成的密码,其强度由一条公式决定,而这条公式对长度的奖励远比对扩大字符集的奖励激进。这也并非巧合——这正是 NIST 自 SP 800-63B(2017 年发布,2024 年修订)以来一直在说的。

本文将走完真实的数学推导,计算真实的熵值,在明确声明假设的前提下给出暴力破解估算,然后把它翻译成你可以实际应用的规则。

熵公式

对于一个从大小为 P 的字符池中均匀随机抽取、长度为 L 的密码,可能的密码总数为 P^L,以比特为单位的熵是:

H = log2(P^L) = L × log2(P)

这就是整个模型。熵衡量的是攻击者必须枚举的搜索空间大小。每多一个比特,工作量就翻倍。

两个杠杆是 P(池大小)和 L(长度),它们并不对等。每增加一个字符,搜索空间乘以 P;扩大池子,则只是乘以一个比值。以下是重要的字符池及其每字符熵贡献:

字符池大小 (P)每字符比特数 log2(P)
仅数字(0–9103.32
小写字母(a–z264.70
小写 + 大写(a–zA–Z525.70
字母数字(a–zA–Z0–9625.95
全部可打印 ASCII(94 个字符,含符号)946.55

注意池扩张的收益递减:从仅小写(26)到全部可打印字符(94),池子几乎翻了四倍,但每字符熵只从 4.70 升到 6.55 比特——每字符仅提升 39%。而在任何池大小下,从 8 个字符增加到 16 个都恰好让熵翻倍。长度线性增长、没有上限;池大小在标准键盘上被限制在约 94。

真实熵值,算给你看

应用 H = L × log2(P)

全部可打印 ASCII 池(94 个字符):

长度熵(比特)搜索空间
852.4~6.1 × 10^15
1065.5~4.4 × 10^19
1278.7~4.8 × 10^23
1491.8~5.1 × 10^27
16104.9~3.7 × 10^31
20131.1~2.9 × 10^39

仅小写字母池(26 个字符):

长度熵(比特)
837.6
1256.4
1675.2
2094.0

字母数字池(62 个字符):

长度熵(比特)
847.6
1271.5
1695.3
20119.1

现在来看说明问题的对比。看这三个密码,都是不同策略下合理的产出:

  • xQ9#mK2! — 8 个字符,完整 94 字符池:52.4 比特
  • hkbwvztdpqrm — 12 个字符,仅小写:56.4 比特
  • hkbwvztdpqrmjfyc — 16 个字符,仅小写:75.2 比特

那个”简单”的 12 字符小写密码已经击败了”复杂”的 8 字符密码,而 16 字符的小写密码比它高出 23 比特——搜索空间约 800 万倍——同时还好打、好记得多。多出来的四个字符,价值超过整个符号集。

这就是长度胜过复杂度的含义:并不是说复杂度一文不值(固定长度下,更宽的池总是有帮助的),而是人类极不擅长随机地产出复杂度,而且对任何现实的字符池来说,每增加一个字符带来的边际熵都超过扩大池子带来的边际熵。

巨大的前提:这只对随机密码成立

公式 H = L × log2(P) 假设的是均匀随机抽取。人类自己选的密码完全不是这么回事。Summer2026! 是 11 个字符、来自约 90 字符池——名义上约 71 比特——但任何破解工具都会在最初几千次尝试内命中它,因为它就是一个词典单词、一个年份和最常见的符号,按最常见的排列组合在一起。

人类密码的熵由可预测性主导,而不是由公式主导。对泄露密码库的实证分析一致发现:一个小型常用密码词典加上变形规则(首字母大写、追加数字、追加 !)就能覆盖真实密码的很大一部分。这就是为什么:

  1. 熵的数学适用于生成的密码、词表生成的密码短语,以及密码管理器创建的密钥——不适用于任何人凭空想出来的东西。
  2. 对于人类选择的密码,防御手段不是估算熵,而是对照已知泄露和常用密码列表进行筛查——这正是 NIST 强制要求的。

密码短语与 Diceware

Diceware 方法让好记密钥的数学变得具体:掷骰子从一个 7,776 词的词表(6^5)中均匀选词。每个词携带 log2(7776) ≈ 12.9 比特:

  • 5 个词:64.6 比特
  • 6 个词:77.5 比特
  • 7 个词:90.4 比特

一个 correct horse battery staple 风格的 6 词密码短语(著名的 XKCD 例子说明的是同一套数学)提供约 77 比特,可记忆性远好于 78.7 比特的随机 12 字符字符串。同一安全级别,可用性天差地别。

暴力破解时间估算——假设写清楚

任何”破解时间”数字,如果没有攻击模型,都毫无意义。下面是一个明确声明的模型:

假设: 针对快速、无盐哈希(如裸 MD5/SHA-1)的离线攻击,速度为每秒 10^10(100 亿)次猜测——一台 modest 的多 GPU 设备就能达到。对整个空间做穷举搜索;找到密码的期望时间是其一半。无限速、无泄露列表捷径(因为我们假设随机密码,这是成立的)。

密码类别搜索空间穷举时间 @ 10^10/s
8 字符,小写(26)2.1 × 10^11约 21 秒
8 字符,完整池(94)6.1 × 10^15约 7 天
12 字符,小写(26)9.5 × 10^16约 110 天
12 字符,完整池(94)4.8 × 10^23约 150 万年
16 字符,小写(26)4.4 × 10^22约 14 万年
16 字符,完整池(94)3.7 × 10^31约 1.2 × 10^14 年

把这些当作说明性的数量级,而不是保证。它们会朝两个方向偏移:

  • 实践中会更慢,如果网站使用了合适的密码哈希函数。参数合理的 bcrypt、scrypt 或 Argon2 可以把猜测吞吐相对裸 MD5 降低 4–7 个数量级,把”约 7 天”变成”比任何人在乎的宇宙热寂时间表还长”。这就是为什么哈希算法的选择比用户做的几乎任何事都重要。
  • 会更快,如果密码不是随机的(词典攻击)、攻击者拥有国家级硬件,或者在被盗哈希仍有价值的那些年里摩尔定律式的进步不断复利。
  • 在线攻击(对着在线登录接口猜)是完全不同的模型:限速和锁定把攻击者限制在或许几百次猜测,所以连约 20 比特的密钥都能存活——这就是为什么 NIST 要求限速,也是为什么你的密码管理器里每个网站独立的密码比任何单个密码的强度更重要。

从表格得到的实用结论:对于任何会被快速哈希的场景,8 个字符就是不够,没有例外;12+ 个随机字符很从容;16 个是好的意义上的过度杀。 再说一次,16 字符的小写字符串比 12 字符的完整池字符串撑得更久——长度获胜。

NIST SP 800-63B 到底说了什么

NIST 的数字身份指南(SP 800-63B,最初 2017 年;2024 年发布第 4 修订版)把其中很多内容写进了美国联邦政策。对密码(“记忆型密钥”)验证方而言,承重的建议是:

  1. 要求长度,而不是复杂度。 用户自选密码至少 8 个字符(第 4 修订版把单因素密码提高到 15,存在第二因素时为 8)。至少允许 64 个字符。不要强加组成规则(没有”必须包含大写、数字、符号”)——它们把用户推向可预测的模式(Password1!),反而削弱真实世界的安全性。
  2. 不强制定期更换。 2017 年修订版已经抛弃了旧的”每 90 天轮换”教条;第 4 修订版再次确认。只有在有泄露证据时才更换密码。强制轮换必然产生 Summer2026!Autumn2026!——这种递增量,一条破解规则就能轻松覆盖。
  3. 对照泄露和常用密码列表筛查。 验证方应将候选密码与已知泄露密码词典、词典单词、重复/连续字符串以及上下文相关词(服务名、用户名)比对。这取代组成规则,成为人类自选密钥真正的防线。
  4. 允许粘贴和密码管理器。 验证方必须允许粘贴输入——这是对密码管理器的明确背书,因为生成的 20 字符随机字符串正是指南希望用户拥有的东西。
  5. 禁止知识型提示或安全问题。 密码提示和 KBA(“母亲的娘家姓”)被禁止,因为它们会泄露或轻易暴露密钥。
  6. 存储使用加盐、内存困难型哈希。 验证方必须用合适的单向函数存储密码哈希——指南指向 Argon2、bcrypt 或 PBKDF2 等具备足够工作因子的方案——并使用至少 32 比特的每用户盐。

注意这些建议如何与熵的数学相呼应:组成规则对人类增加不了真实的熵,长度可以;轮换通过把用户推向模式而摧毁他们本有的熵;而泄露列表筛查处理了人类熵不可测这个事实。这个标准就是被制度化的数学。

你真正能用的规则

  1. 让生成器来造密码。 随机生成是让熵公式适用于你的唯一方式。我们的 密码生成器 在你的浏览器中创建密码学安全的随机密码——不会传输到任何地方。设为 16+ 个字符,然后别再想它了。
  2. 重要的东西默认用 16 个字符。 即使仅小写也有 95+ 比特,面对正确哈希的存储,已超出任何可想象的暴力破解预算。
  3. 必须记住的东西,用 6 词密码短语。 约 77 比特,能打字、能记住。如果同一工具的密码短语/词表模式可用,就用它生成候选,或者用 Diceware。
  4. 每个网站独立,永远如此。 熵保护的是一个网站;复用会把一次泄露变成所有网站的泄露。这正是密码管理器的意义。
  5. 能开第二因素就开。 NIST 的长度要求在有 MFA 时明确放宽,因为第二因素让攻击者工作量成倍增加,成本远低于堆更多密码熵。
  6. 无视复杂度表演。 一个网站要求”一个大写、一个数字、一个符号”却把长度限制在 12,它的策略是本末倒置的。机械地照做,但别把它误认为强度。

总结

  • 随机密码的熵是 H = L × log2(P):每个字符增加的比特数是固定的,只取决于池大小。
  • 扩大池子(26 → 94 字符)每字符多赚约 1.85 比特;每增加一个字符多赚 4.7–6.6 比特。长度决定性获胜。
  • 8 个随机字符 ≈ 52 比特 ≈ 面对快速离线哈希几天可破;12 个随机字符 ≈ 78+ 比特 ≈ 在该模型下实际不可破。
  • 公式只适用于随机生成。人类自选的密码会被词典击败,这就是为什么 NIST 强制泄露列表筛查,并禁止组成规则和强制轮换。
  • 密码生成器 生成 16 字符随机密码,存进密码管理器,开启 MFA。这套组合就是数学给出的建议。