← Back to Blog

密码熵详解:如何真正计算密码强度

2025-12-26

"使用强密码"是常见的建议,但"强"这个词很模糊。熵是这个建议背后真正的度量标准——一个以比特为单位的数字,告诉你攻击者在最坏情况下需要猜测多少次。本文解释这个数字的含义,以及如何为你实际选择的密码计算它。

太长不看版

  • 熵(以比特为单位)衡量攻击者必须暴力破解的搜索空间大小:熵 = log2(字符集大小 ^ 长度)
  • 每增加一个字符都会使搜索空间倍增;每增加一种字符类型只会使其增加一个固定的、相对较小的倍数。
  • 一个只用小写字母的 12 位密码,熵比混合四种字符类型的 8 位密码还低——但一个 20 位的纯小写密语,又会超过两者。
  • CSPRNG 生成的密码能精确达到理论熵值;人为选择的密码几乎从不能,因为人类不是随机的。

简短回答

以比特为单位的熵是 log2(N),其中 N 是该长度和字符集下所有等可能密码的总数。实际计算:熵 = 长度 × log2(字符集大小)。一个从 95 个可打印 ASCII 字符中均匀抽取的 16 位密码,熵约为 16 × log2(95) ≈ 105 比特——相比之下 256 位 AES 密钥的实际抗暴力破解能力显得过剩,但 105 比特已经远超任何现有或可预见硬件能够穷举的范围。PassGenerate 正是这样生成密码的——使用 Web Crypto API 的 CSPRNG,所以这个熵值是真实的,不只是理论上的。

熵公式,逐步推导

熵计算假设每个字符都是从固定字符集中独立、均匀随机选取的。给定大小为 C 的字符集和长度为 L 的密码,可能的密码总数是 C^L,以比特为单位的熵是:

熵 = L × log2(C)
字符集集合大小 (C)每字符比特数 (log2 C)
仅数字 (0-9)103.32
小写字母 (a-z)264.70
小写字母 + 数字365.17
大小写混合 + 数字625.95
大小写混合 + 数字 + 符号(约33个常见符号)956.57

长度 vs 字符集大小:为什么长度更重要

下表说明了为什么 NIST SP 800-63B 弱化强制复杂度规则、转而强调长度:

长度仅数字小写字母大小写字母+数字+符号混合
827 比特38 比特52 比特
1240 比特56 比特79 比特
1653 比特75 比特105 比特
2066 比特94 比特131 比特
2480 比特113 比特157 比特
32106 比特150 比特210 比特

注意,一个使用全部四种字符类型的 8 位密码(52 比特)的熵,低于一个 12 位全小写密码(56 比特)。这就是一个广为人知结论的数学基础:多加四个随机字符,比在短密码里强制加符号和数字更能提升安全性。这也是为什么由若干随机词组成的长密语,既可能比一串短符号更强,又更容易输入——如果从一个几千词的词表中抽取,每多一个词通常能增加 11-13 比特,四到六个词累积起来相当可观。

为什么"看起来随机"不等于真的随机

熵的计算假设真正的均匀随机性。人为设置的密码即使看起来很复杂,也系统性地违背这个假设:键盘走位(Qwerty123!)、火星文替换(P@ssw0rd)、加符号的日期或姓名,这些都会让实际熵远低于字符数所暗示的水平,因为攻击者的破解工具正是围绕这些模式构建的。一个密码在人眼看来可能很随机,实际却可能落在定向字典攻击的前几百万次猜测之内。

这就是为什么应该优先使用基于密码学安全伪随机数生成器(CSPRNG)的生成器,而不是自己发明密码的实际原因。JavaScript 中的 Math.random() 不具备密码学安全性,不适合用于密码生成——它由一种算法生成和播种,在某些引擎中可预测到能从少量输出反推出来。Web Crypto API 的 crypto.getRandomValues() 则取自操作系统的密码学随机源,所以每个字符都是真正独立随机的,上面的熵计算才真正适用。

你实际需要多少比特?

没有一个放之四海而皆准的数字,因为这取决于你在防御什么:

  • 约 40-60 比特:能抵御随意猜测和小规模自动化攻击,但在资源充足的攻击者对弱哈希数据库进行离线破解时可能不够用。仅适用于真正低价值、低后果的账户。
  • 约 70-90 比特:即使面对经过优化的破解硬件,在任何现实的攻击时间范围内都能稳妥地超出暴力破解范围。对大多数个人账户来说是合理目标。
  • 100+ 比特:以目前或可预见的计算能力,暴力破解基本无法触及,其密码学意义相当于一把强加密密钥。适用于你的密码管理器主密码或其他单点故障环节。

用真实硬件跑一遍是什么样

上面的比特数字方便比较,但没有告诉你实际攻击需要多久——这取决于用来猜测的硬件,而硬件每年都在变快。Hive Systems 每年都会发布一份基准测试,用一批租用的消费级 GPU 实测暴力破解速度。他们 2026 年的表格显示,一个使用全混合字符集(大小写、数字、符号)随机生成的 8 位密码,破解大约需要 132 年——相比 2025 年的 164 年和 2024 年的 225 年有所下降,随着 GPU 硬件进步,每年下降幅度约 20-25%。一个仅用小写字母的 8 位密码破解速度下降得更快:从 2025 年的三周缩短到 2026 年的约两周。

这份基准测试里有两点值得注意。第一,这个趋势是单向的——今天看起来"安全"的东西,仅仅因为硬件进步,每年都会变得更弱,这从现实角度支持了"宁可选更长的密码,也不要卡在当前最低标准"的做法。第二,一个有点反直觉的发现:为训练语言模型打造的专用 AI 加速芯片,在暴力破解密码上其实并不比同等的游戏 GPU 更快,在部分测试中甚至更慢——密码破解是一个纯粹的暴力数字问题,享受不到 AI 硬件针对矩阵乘法优化带来的好处。

关键要点

  • 熵 = 长度 × log2(字符集大小)——长度是线性影响,字符集大小是对数影响,这就是为什么长度占主导地位。
  • 一个使用所有字符类型的短密码,熵可能比一个只用一种字符类型的长密码还低。
  • 只有当字符真正均匀随机时,实际熵才等于理论熵——这正是 CSPRNG 能保证、而人为选择通常做不到的事。
  • 日常账户建议目标 70+ 比特,主密码或其他单点故障环节建议 100+ 比特。

为什么可以信任 PassGenerate

  • 密码使用 Web Crypto API 在你的浏览器本地生成。
  • 不会向服务器传输任何密码。
  • 使用密码学安全伪随机数生成器(CSPRNG)。
  • 遵循 NIST 和 OWASP 推荐的现代安全最佳实践。

参考资料

  • Hive Systems 2026 密码破解时间表(暴力破解基准数据)
  • NIST SP 800-63B – 数字身份指南
  • OWASP 身份验证速查表

结论

熵是一个精确的、可计算的密码强度度量标准,而不是"复杂度"这种模糊概念。长度比强制字符类型混合更重要,因为长度会线性扩大搜索空间,而字符集大小只会对数级地扩大它——而且如果字符不是真正随机的,这些数学关系全部不成立,这就是为什么像 PassGenerate 这样基于 CSPRNG 的生成器生成的密码能精确达到理论熵值,而人为选择的密码几乎永远做不到这一点。