密码强度完整解析:暴力破解、彩虹表与 Entropy 是什么?

「8 个字符,包含大小写字母和数字」——这是很多系统对密码强度的基本要求。但这样的密码真的安全吗?一台现代电脑到底能多快破解密码?为什么安全专家说「密码越长越好」,而不是「越复杂越好」?本文不从「怎么保护密码」出发,而是站在攻击者的角度,解释密码是如何被破解的——理解攻击方式,才能设计出真正难以破解的密码。

1. 密码存储的真相:你的密码从来不是明文

在解释攻击方式之前,先厘清一个重要前提:设计良好的系统不会直接存储你的密码,而是存储密码的哈希值(Hash)

你输入密码后,系统对密码执行哈希函数(如 bcrypt、SHA-256),得到一串固定长度的乱码,然后存储这串乱码。下次登录时,系统对你输入的密码重新计算哈希值,与存储的值比对——如果相符就通过。

这意味着即使数据库被黑客窃取,他们拿到的也只是哈希值,而不是你的密码明文。问题在于:攻击者有办法从哈希值反推出原始密码吗?

为什么还是会有「密码泄露」?
当新闻说「某网站密码泄露」,通常指两种情况:一是网站设计太差,直接以明文存储密码;二是数据库的哈希值被窃取后,攻击者用各种技术尝试破解哈希——这正是本文要说明的内容。

2. 三种主要的密码破解方式

2.1 暴力破解(Brute-Force Attack)

暴力破解是最直观的方法:把所有可能的密码组合逐一尝试,直到找到正确的为止。

现代 GPU 每秒可以计算数十亿次哈希,所以短密码在计算能力面前几乎没有抵抗力:

密码长度字符集(仅小写字母)字符集(大小写 + 数字)估计破解时间
6 字符26⁶ ≈ 3 亿62⁶ ≈ 570 亿数秒到数分钟
8 字符26⁸ ≈ 2,090 亿62⁸ ≈ 218 万亿数小时到数天
12 字符26¹² ≈ 9.5×10¹⁶62¹² ≈ 3.2×10²¹数百年(现实上不可行)

关键结论:密码长度对安全性的影响远大于字符复杂度。从 8 个字符增加到 12 个字符,可能的组合数增加了超过百万倍。

2.2 字典攻击(Dictionary Attack)

暴力破解假设密码是完全随机的,但现实中人类喜欢用有意义的词汇当密码。字典攻击利用这个弱点:用预先准备好的词汇表(字典)逐一尝试,而不是穷举所有组合。

常见的字典包含:

  • 全球最常用的密码(password、123456、qwerty…)
  • 常见英文单词及其变体(love → l0ve、lov3)
  • 人名、地名、品牌名(michael、beijing、google)
  • 历次大规模密码泄露数据库(数十亿条真实密码)

字典攻击的效率远高于纯暴力破解——大多数人的密码都能在几秒钟内从字典中找到。

2.3 彩虹表(Rainbow Table)

彩虹表是一种提前计算好的攻击工具:预先计算出数百亿个密码的哈希值,建成一张对照表,攻击时直接查表而不需要即时计算。

如果攻击者手上有一个未加盐(Salting,见下节)的 MD5 哈希数据库,他只需要在彩虹表中查找对应的哈希值,就能几乎瞬间找到原始密码。

加盐(Salting)如何防御彩虹表
现代密码系统在计算哈希时会加入一个随机字符串(「盐」),让每个账号的哈希值都不同,即使两个人使用完全相同的密码。这样一来,彩虹表就失效了——因为针对特定「盐」的对照表根本不存在。这也是为什么使用 bcrypt、Argon2 等现代哈希算法比 MD5 安全得多。

3. 密码 Entropy:衡量密码强度的数学方法

Entropy(熵)是信息论中的概念,在密码学中用来量化密码的「不可预测性」。Entropy 越高,密码越难猜测。

计算公式:Entropy = log₂(字符集大小密码长度)

以位(bit)为单位:

  • 仅小写字母(26 种),8 字符:log₂(26⁸) ≈ 37.6 bits
  • 大小写 + 数字(62 种),8 字符:log₂(62⁸) ≈ 47.6 bits
  • 大小写 + 数字 + 特殊符号(94 种),12 字符:log₂(94¹²) ≈ 78.7 bits
  • 随机 4 个英文单词(passphrase,约 7,776 个词中选取):log₂(7776⁴) ≈ 51.7 bits

一般建议:网络账号至少 50 bits,高安全性账号(银行、邮箱)建议 80 bits 以上。

4. 常见密码误区

误区一:「我把字母替换成数字(a→@、e→3),密码就更安全了」

不尽然。字典攻击的词汇表早已包含这类「1337 speak」变体。p@ssw0rd 已经被列在各大密码字典中,不比 password 安全多少。

误区二:「定期更换密码可以提高安全性」

这个观念已过时。现代安全研究发现,强制定期换密码反而导致用户使用可预测的模式(Password1Password2)。更重要的是:设定一个足够强的密码,而不是频繁换弱密码。

误区三:「密码里要有大小写、数字、特殊符号才安全」

复杂度有帮助,但效果不如增加长度。correct-horse-battery-staple(4 个随机英文词)的 Entropy 超过 50 bits,比大多数「复杂」的 8 字符密码更安全,而且好记。

5. 设计强密码的原则

5.1 足够长永远是第一优先

至少 12 个字符。16 个字符更好。长度是破解时间的指数级倍增器——每多一个字符,可能的组合就乘以整个字符集的大小。

5.2 随机性比复杂度更重要

Tr0ub4dor&3」不如「xkz7!qPm2vLn」安全——前者符合人类可预测的替换规律,后者才是真正的随机。更好的方法是使用密码生成器,让电脑决定随机性,不要让人脑设计密码。

5.3 每个账号用独立密码

密码复用(Password Reuse)是最常见的安全漏洞之一。一个网站被黑,攻击者会立即用同样的账号密码尝试其他网站(「撞库攻击」)。各账号使用不同密码可以隔离风险。

5.4 使用密码管理器

唯一能同时做到「每个账号独立密码 + 密码足够长足够随机」的方法,就是使用密码管理器。你只需记住一个强主密码,其余由软件管理。

6. 常见问题

如果我的密码没有被暴力破解,怎么还是会泄露?

泄露渠道不只是破解。最常见的还有:网络钓鱼(假网站骗你输入密码)、数据库明文泄露(网站设计太差)、设备被植入键盘记录程序。强密码只能防止「猜测」类攻击,无法防止社会工程学或恶意软件。

开启两步验证(2FA)之后,密码强度还重要吗?

仍然重要。2FA 增加了一道防线,但不是万能的——SIM 卡劫持、一次性代码钓鱼等攻击仍可绕过 2FA。强密码 + 2FA 才是最佳组合,不能只靠其中一个。

7. 小结

密码安全的本质是「让攻击者找到正确密码所需的时间超过其耐心或利益」。从这个角度理解:

  • 长度是最有效的防御:每多一个字符,破解时间呈指数级增长
  • 随机性胜过复杂规则:让电脑决定密码,不让人脑设计密码
  • 每个账号独立密码:一旦某处泄露,不牵连其他账号
  • 强密码 + 2FA 双重保护:两道防线比任何一道都强

使用随机密码生成器可以一次解决「足够长」「足够随机」两个问题,是设计强密码最省力的起点。