引言:一个反直觉的事实
2017年,美国国家标准与技术研究院(NIST)发布了一份更新版的数字身份指南。在这份长达数百页的文件中,有一个附录专门讨论密码强度。与以往版本不同,这次NIST明确建议:不要强制要求用户使用复杂度规则——那些"必须包含大写字母、小写字母、数字和特殊符号"的规定,正在被悄悄废弃。
更令人震惊的是,这个建议的根源来自一位名叫Bill Burr的退休工程师。2003年,正是他撰写了那份影响全球密码政策的NIST特别出版物800-63附录。十四年后,他在接受《华尔街日报》采访时坦言:“我们当时完全搞错了方向。”
这是一个怎样的故事?为什么那个被全球网站奉为圭臬的密码规则体系,会走到被推翻的今天?这背后涉及密码学、认知心理学、以及一场持续二十年的科学与实践的博弈。
timeline
title 密码强度政策演变时间线
section 2003年
Bill Burr发布NIST SP 800-63
: 提出组合规则理论
: 建议定期更换密码
section 2009年
Weir等人发表PCFG论文
: 密码结构破解方法
section 2011年
CMU大规模实证研究
: 证明长度优于复杂度
: XKCD密码短语漫画
section 2012年
Dropbox开源zxcvbn
: 模式识别强度评估
section 2015年
英国NCSC发布新指南
: 废除强制密码轮换
section 2017年
NIST SP 800-63B修订版
: 废除组合规则要求
: 强调长度优先
section 2024年
NIST进一步强化指南
: 完善黑名单机制
第一章:Bill Burr的后悔——2003年NIST指南的起源与反思
1.1 一份改变世界的文档
2003年,NIST工程师Bill Burr受命撰写一份关于电子认证的指南。在密码强度部分,他借鉴了当时有限的研究资料,提出了一套基于"熵值"估算的计算方法。这套方法的核心假设是:密码中的每种字符类型都会增加猜测难度。
根据这套理论,一个8位纯小写字母密码的熵值约为18比特;如果加入大写字母,熵值会上升到24比特;再加上数字和符号,熵值可以达到30比特。这似乎很合理——更多字符类型意味着更大的搜索空间。
基于这个逻辑,Burr在指南中建议:
- 密码至少8个字符
- 包含大写字母、小写字母、数字和特殊符号
- 定期更换密码(通常建议每90天)
- 避免使用字典词汇
这份指南被命名为NIST SP 800-63附录A,很快就成为全球密码政策的"圣经"。从银行到社交媒体,从政府机构到企业内网,几乎所有要求创建密码的地方都采用了这套规则。
1.2 理论与实践的鸿沟
然而,Burr当时的计算存在一个致命缺陷:他假设用户会随机选择字符。
在信息论中,熵(Entropy)是衡量信息不确定性的指标。香农熵的计算公式是:
E = L × log₂(R)
其中L是密码长度,R是字符集大小(例如,26个小写字母、62个字母数字组合、94个可打印ASCII字符)。对于随机选择的密码,这个公式是准确的。
但人类不是随机数生成器。当被要求"必须包含一个大写字母"时,用户不会均匀地从26个大写字母中选择——他们几乎总是选择首字母大写。当被要求"必须包含一个数字"时,最常见的做法是在密码末尾加上"1"或"123"。
flowchart LR
A[用户想用 password] --> B{加大写要求?}
B -->|是| C[变成 Password]
B -->|否| D{加数字要求?}
C --> E{加数字要求?}
E -->|是| F[变成 Password1]
E -->|否| G[保持 Password]
F --> H{加符号要求?}
H -->|是| I[变成 Password1!]
H -->|否| J[保持 Password1]
D -->|是| K[变成 password1]
D -->|否| L[保持 password]
style A fill:#f9f,stroke:#333
style I fill:#f55,stroke:#333
style J fill:#f55,stroke:#333
style F fill:#fa0,stroke:#333
style K fill:#fa0,stroke:#333
2017年,Burr在接受BBC采访时承认:“我们的很多理论在实践中完全行不通。人们在密码末尾加感叹号,把’password’变成’Password1!’——这根本不会让密码变得更安全。”
1.3 一项关键的实证研究
卡内基梅隆大学的研究团队在2011年进行了一项大规模实验,5,000名参与者被随机分配到五种不同的密码政策下创建密码。研究结果揭示了一个惊人的事实:
xychart-beta
title "CMU研究:不同密码政策的实际熵值对比"
x-axis ["basic8", "basic16", "dictionary8", "comprehensive8"]
y-axis "熵值 (bits)" 0 --> 50
bar [29.43, 44.67, 28.99, 34.30]
line [30, 30, 30, 30]
NIST估算认为,16字符无复杂度要求的密码与8字符完整复杂度要求的密码应该具有相同的熵值(约30比特)。但实际测量显示,前者达到了44.67比特,后者仅为34.30比特——差距超过10比特,意味着破解难度相差约1000倍。
更关键的是,用户满意度调查显示:复杂度要求越高,用户越沮丧。comprehensive8条件(8字符+大小写+数字+符号+字典检查)的参与者中,67%认为这个政策会让他们的账户更安全——但实际上,这些密码的熵值比简单的16字符密码低得多。
第二章:为什么组合规则适得其反——用户行为的可预测性
2.1 用户不是随机数生成器
密码组合规则的核心问题在于:它假设增加字符集大小就能线性增加安全性。但实际上,人类的决策模式高度可预测。
NIST在2024年版的SP 800-63B附录中指出:
“研究显示,用户对组合规则的反应非常可预测。例如,一个原本可能选择’password’的用户,如果被要求包含大写字母和数字,很可能会选择’Password1’;如果还被要求包含符号,则变成’Password1!’。”
这不是个别现象。对泄露密码数据库的分析显示,以下模式极为常见:
| 原始密码 | 加大写要求后 | 加数字要求后 | 加符号要求后 |
|---|---|---|---|
| password | Password | Password1 | Password1! |
| monkey | Monkey | Monkey1 | Monkey1! |
| dragon | Dragon | Dragon1 | Dragon1! |
这种可预测的"升级"模式让密码破解者如获至宝。他们不需要尝试所有可能的组合,只需要针对这些模式进行定向攻击。
2.2 字典检查的悖论
CMU的研究还揭示了一个有趣的现象:字典检查虽然在阻止弱密码方面有效,但它对熵值的贡献远小于预期。
研究中比较了basic8(仅要求8字符)和dictionary8(8字符+禁止字典词)两种政策。理论上,后者应该有更高的熵值。但实际上,两者的熵值几乎相同(约29比特),差异在统计上不显著。
原因在于:当用户被告知不能使用字典词时,他们往往会采用可预测的替代策略:
- 在单词中插入数字:p1a2s3s4w5o6r7d
- 使用l33t speak替换:p@ssw0rd
- 选择非标准拼写或缩写
这些策略虽然绕过了字典检查,但并没有显著增加密码的实际安全性。与此同时,字典检查大大增加了用户的挫败感——CMU研究发现,dictionary8条件的参与者创建密码失败率显著高于basic8条件。
2.3 定期更换密码的反效果
Bill Burr的另一条建议——每90天更换密码——同样被证明适得其反。
英国国家网络安全中心(NCSC)在2015年的指南中明确建议组织放弃强制密码轮换政策。原因很简单:频繁更换密码会导致用户选择更弱、更可预测的密码。
当用户被迫频繁更换密码时,他们倾向于:
- 使用增量式修改:password1 → password2 → password3
- 使用季节或月份:Spring2023! → Summer2023!
- 使用简单的数字序列
2023年的一项研究分析了某大学强制密码轮换政策的效果,发现轮换后的密码更容易被预测和破解。用户在重置密码时表现出的"认知疲劳"导致了更弱的密码选择。
第三章:密码熵——从香农到猜测熵的科学测量
3.1 香农熵的局限性
在讨论密码强度时,“熵"是最常被提及的概念。但这个术语在不同语境下有不同含义,这种混淆导致了大量的误解。
香农熵(Shannon Entropy)源自信息论,衡量的是信息的不确定性。对于完全随机的字符序列,香农熵的计算公式为:
H = -Σ p(x) × log₂ p(x)
对于密码强度评估,简化版本为:
E = L × log₂(R)
例如,一个10位的小写字母密码(R=26)的熵值为:
E = 10 × log₂(26) ≈ 47 bits
这个公式的问题在于:它假设每个字符都是独立、随机选择的。但如前所述,人类的密码选择模式高度可预测。
3.2 猜测熵:更实用的指标
密码学界逐渐认识到,猜测熵(Guessing Entropy)比香农熵更能反映密码的真实安全性。
猜测熵定义为:攻击者平均需要尝试多少次才能猜中密码。它考虑的是密码在实际分布中的排名位置,而非理论上的搜索空间大小。
flowchart TB
subgraph 香农熵
A1[理论搜索空间大小] --> B1[假设随机选择]
B1 --> C1[高估真实安全性]
end
subgraph 猜测熵
A2[密码在分布中的排名] --> B2[考虑实际攻击策略]
B2 --> C2[更准确的强度评估]
end
A1 -.->|问题| A2
对于完全均匀分布的密码空间,猜测熵近似于香农熵。但对于真实用户选择的密码,猜测熵可能远低于香农熵——因为攻击者会优先尝试最常见的密码。
2019年对密码强度计的研究指出:大多数密码强度计使用香农熵估算,这导致它们系统性地高估了密码的真实强度。
3.3 熵值的安全阈值
那么,多少熵值才算"足够安全”?这取决于攻击场景:
在线攻击场景:攻击者受限于登录尝试次数。假设每秒可以尝试100次,系统在10次失败后锁定账户,那么只需要:
10 × 100 = 1,000 次尝试机会
log₂(1000) ≈ 10 bits
约10比特的熵值就可以抵御典型的在线攻击。
离线攻击场景:攻击者获取了密码哈希数据库,可以在本地无限制地尝试。这需要高得多的熵值。
根据Hive Systems 2025年的密码破解基准测试,使用12张NVIDIA RTX 5090显卡对bcrypt(工作因子10)进行破解:
- 8位随机小写字母密码:约几个月
- 10位随机小写字母密码:约几年
- 12位随机小写字母密码:约几百年
- 16位随机小写字母密码:超过宇宙年龄
这就是为什么NIST现在强调长度优先:在离线攻击场景下,每增加一个字符,破解难度呈指数级增长。
第四章:密码破解技术的演进——PCFG与GPU暴力破解
4.1 从字典攻击到智能破解
早期的密码破解主要依赖字典攻击:尝试常见密码列表中的每一个。这种方法简单但有限——它无法处理那些不在字典中的密码。
概率上下文无关文法(PCFG)的出现改变了游戏规则。2009年,Weir等人在IEEE S&P会议上发表的论文提出了一种新方法:不是猜测密码本身,而是猜测密码的结构。
PCFG的核心思想是:用户密码通常遵循可预测的结构模式。例如:
- “Password123!“的结构是:L8 D3 S1(8个字母 + 3个数字 + 1个符号)
- “abc123!@#“的结构是:L3 D3 S3
攻击者可以:
- 分析泄露密码数据库,统计各种结构的出现频率
- 按频率顺序生成候选密码
- 优先尝试最常见的结构组合
这种方法比纯暴力破解快几个数量级,因为它利用了人类选择密码的模式。
flowchart LR
subgraph 传统破解
A1[字典攻击] --> B1[逐个尝试字典词]
B1 --> C1[覆盖有限]
end
subgraph PCFG破解
A2[分析密码结构] --> B2[按频率排序]
B2 --> C2[生成候选密码]
C2 --> D2[高效覆盖]
end
C1 -.->|效率对比| D2
4.2 现代GPU破解能力
GPU的并行计算能力彻底改变了密码破解的格局。2025年,单张RTX 5090显卡可以每秒计算数百万次bcrypt哈希。12张RTX 5090组成的集群,破解能力更是惊人。
Hive Systems的测试数据显示,对于bcrypt(工作因子10):
| 密码类型 | 破解时间(12×RTX 5090) |
|---|---|
| 6位纯数字 | 瞬间 |
| 8位小写字母 | 约1个月 |
| 8位混合字符 | 约5年 |
| 10位小写字母 | 约300年 |
| 12位小写字母 | 约200,000年 |
| 16位小写字母 | 约10¹⁵年 |
注意:这些数据假设密码是随机生成的。对于用户选择的非随机密码,破解时间会大幅缩短。
更令人担忧的是,如果攻击者能获得AI训练级别的硬件(如ChatGPT-4使用的20,000张A100),破解速度可以提高数千倍。在那种情况下,即使是12位随机密码也可能在数年内被破解。
4.3 彩虹表与盐值
除了暴力破解,攻击者还可以使用彩虹表——预先计算好的哈希链表。对于一个给定的哈希值,彩虹表可以在几秒内找到对应的明文密码。
盐值(Salt)是对抗彩虹表的有效手段。盐值是一个随机字符串,在哈希计算前与密码合并。每个用户的盐值不同,意味着相同的密码会产生不同的哈希值,使预计算攻击失效。
现代密码存储方案(如bcrypt、scrypt、Argon2id)都内置了盐值机制。NIST要求所有密码哈希必须使用盐值。
第五章:NIST 2017/2024的重大转向——从组合规则到长度优先
5.1 SP 800-63B的革命性更新
2017年,NIST发布了SP 800-63B的修订版,对密码政策做出了根本性的调整。2024年的版本进一步强化了这些原则:
废除组合规则:
“组合规则通常被用来增加猜测用户选择密码的难度。然而,研究表明,用户对组合规则施加的要求反应非常可预测。”
强调密码长度:
“密码长度是表征密码强度的主要因素。过短的密码容易受到暴力破解和字典攻击。”
引入黑名单机制:
“用户选择的密码应该与不可接受密码的黑名单进行比较。这个列表应该包括以前泄露数据库中的密码、用作密码的字典词汇,以及用户可能选择的特定词汇。”
废除定期更换:
“不应要求用户任意定期更换密码。”
5.2 最小长度建议
NIST建议的密码最小长度取决于攻击场景:
| 场景 | 最小长度 | 说明 |
|---|---|---|
| 在线攻击防护 | 8字符 | 配合速率限制 |
| 离线攻击防护 | 15+字符 | 对抗哈希泄露 |
值得注意的是,NIST建议允许用户选择更长的密码——只要他们愿意:
“应鼓励用户在合理范围内尽可能使用长密码。由于哈希密码的大小与其长度无关,因此没有理由禁止使用长密码。”
5.3 黑名单的实施
NIST明确要求将用户密码与已知泄露密码进行比较。HaveIBeenPwned数据库是目前最全面的泄露密码集合,包含超过10亿个唯一密码。
黑名单检查应该包括:
- 来自以前泄露的密码
- 字典词汇
- 服务名称本身(如"facebook”)
- 用户个人信息(如用户名、邮箱地址)
NIST同时警告:黑名单不应过大。其目的是阻止在线攻击中最可能被猜测的密码,而不是排除所有可能的弱密码。过大的黑名单会过度限制用户选择,增加挫败感。
第六章:现代密码强度评估——zxcvbn算法解密
6.1 传统强度计的问题
大多数密码强度计采用简单的评分规则:检查是否包含大写字母、数字、符号,以及密码长度。这种方法的根本问题是:它评估的是密码的形式特征,而非真实安全性。
Dropbox在2012年开源的zxcvbn算法提供了一种不同的思路。它不检查密码是否满足复杂度规则,而是模拟真实攻击者的破解方式,计算密码被破解需要的时间。
6.2 zxcvbn的三阶段算法
zxcvbn的工作流程分为三个阶段:匹配(Match)、评分(Score)、搜索(Search)。
flowchart TB
subgraph 匹配阶段
A[输入密码] --> B[识别所有模式]
B --> C[字典词汇]
B --> D[键盘模式]
B --> E[重复字符]
B --> F[序列模式]
B --> G[日期年份]
end
subgraph 评分阶段
H[计算每个模式的熵值]
end
subgraph 搜索阶段
I[动态规划找最优组合] --> J[输出总熵值]
end
C --> H
D --> H
E --> H
F --> H
G --> H
H --> I
匹配阶段:识别密码中的所有可能模式,包括:
- 字典词汇(英语单词、姓名、常见密码)
- 键盘模式(qwerty、asdf)
- 重复字符(aaa、111)
- 序列(123、abc)
- 日期和年份
评分阶段:为每个匹配的模式计算熵值。例如,键盘模式"qwerty"的熵值计算考虑:
- 起始位置(47个可能的起点)
- 拐点数量
- 平均每键的邻居数(约4.6个)
搜索阶段:使用动态规划算法找到熵值最低的非重叠模式组合。这代表攻击者最可能的破解路径。
6.3 zxcvbn与传统强度计的对比
zxcvbn与传统强度计的评估结果可能截然不同:
| 密码 | 传统评估 | zxcvbn评估 | 原因 |
|---|---|---|---|
| qwER43@! | 强 | 弱 | 键盘模式 |
| Tr0ub4dour&3 | 强 | 中等 | l33t替换+字典词 |
| correcthorsebatterystaple | 弱(无符号数字) | 强 | 四个随机单词 |
这解释了为什么XKCD漫画中的"correct horse battery staple"虽然不包含数字或符号,却被zxcvbn评为最安全的密码——因为破解它需要遍历巨大的单词组合空间。
6.4 zxcvbn的局限性
zxcvbn并非完美。它:
- 目前只支持英语词汇
- 不能识别拼写错误或缩写
- 不包含常见短语(如"Harry Potter”)
- 需要较大的字典数据(约680KB)
但它的核心理念——模拟攻击者的思维方式——为密码强度评估提供了正确的方向。
第七章:密码黑名单——阻止已知弱密码的第一道防线
7.1 泄露密码数据库的规模
HaveIBeenPwned是目前最大的公开泄露密码数据库。截至2025年,它已收录超过10亿个唯一密码,来自数百次公开披露的数据泄露事件。
这些数据揭示了令人担忧的现实:
- 约99.8%的泄露密码出现在前10,000个最常见密码中
- 约91%出现在前1,000个中
- “password”、“123456”、“qwerty"几乎出现在每一次泄露中
FBI在2025年向HaveIBeenPwned贡献了超过6亿个密码,进一步扩大了这个数据库的覆盖范围。
7.2 黑名单检查的实现
现代系统通常通过以下方式实现黑名单检查:
API检查:将密码的哈希值发送到远程服务(如HaveIBeenPwned API)进行验证。出于隐私考虑,通常使用k-匿名模型:只发送密码哈希的前几个字符,服务返回所有匹配的哈希后缀。
本地检查:在注册系统中维护一个精简的黑名单。虽然无法覆盖所有泄露密码,但可以有效阻止最常见的弱密码。
组合策略:先检查本地黑名单(快速),再进行远程API检查(全面)。
7.3 黑名单与用户体验的平衡
NIST警告黑名单不应过于庞大。原因在于:
-
过度限制用户选择:如果黑名单包含数百万密码,用户可能反复被拒绝,产生强烈挫败感。
-
增加攻击者的信息优势:黑名单本身可能成为攻击者的资源。如果攻击者知道哪些密码被禁止,他们可以推断用户的可能选择范围。
-
边际收益递减:阻止前1000个最常见密码可以阻止大部分在线攻击;阻止第1,000,001个密码的边际收益微乎其微。
最佳实践是使用包含约10,000-100,000个最常见密码的黑名单,这可以在最小化用户干扰的同时提供有效的防护。
第八章:密码短语——长度优于复杂性的实践证据
8.1 XKCD漫画的启示
2011年,Randall Munroe在XKCD漫画中提出了一个经典问题:什么是更好的密码——“Tr0ub4dour&3"还是"correct horse battery staple”?
漫画的结论是:后者更强,因为它由四个随机单词组成,每个单词贡献约11比特熵值(假设从2048个常见单词中选择),总计约44比特。而前者虽然看起来更复杂,但由于使用了可预测的l33t替换和字典词,实际熵值可能只有约28比特。
这个漫画引发了密码学界的广泛讨论。虽然有人批评其假设(用户可能不会随机选择单词),但核心观点得到了研究的支持:长度比复杂度更重要。
xychart-beta
title "密码短语 vs 复杂密码:熵值对比"
x-axis ["Tr0ub4dour&3", "correct horse battery staple"]
y-axis "熵值 (bits)" 0 --> 50
bar [28, 44]
8.2 密码短语的实证研究
2013年,研究者在ResearchGate发表了题为"Correct Horse Battery Staple: Exploring the Usability of System-Assigned Passphrases"的研究,测试了系统分配的密码短语的可用性。
研究发现:
- 用户能够记住由随机单词组成的密码短语
- 四个单词的密码短语比传统复杂密码更容易记忆
- 用户对密码短语的满意度更高
然而,密码短语也有潜在问题:
- 如果用户被要求自己创建密码短语,他们可能选择有意义的词组(如"ILoveMyCat”),这会降低安全性
- 某些网站对密码长度有限制(如最多20字符),可能阻止密码短语的使用
8.3 随机单词选择的熵值
密码短语的安全性取决于单词的选择方式:
| 选择方式 | 单词池大小 | 单词熵值 | 四词总熵值 |
|---|---|---|---|
| 用户自选 | ~1000(常见词汇) | ~10 bits | ~40 bits |
| 系统分配(小词库) | ~2000 | ~11 bits | ~44 bits |
| 系统分配(大词库) | ~10000 | ~13 bits | ~52 bits |
| 系统分配(完整词典) | ~50000 | ~16 bits | ~64 bits |
关键在于:单词必须是随机选择的。如果用户被允许自己选择单词,安全性会大打折扣。
结语:走向科学的密码安全
从Bill Burr 2003年的指南到NIST 2017/2024年的根本性转向,密码安全领域经历了深刻的范式变化。这个变化的本质是:从理论假设走向实证验证。
过去二十年,我们学到了几条关键教训:
复杂度规则无效:强制要求大写字母、数字、符号不仅不能提高安全性,反而导致用户选择可预测的密码模式。
长度是关键:在对抗离线攻击方面,密码长度比复杂度更重要。每增加一个字符,破解难度呈指数级增长。
用户行为可预测:任何密码政策都必须考虑用户的实际反应,而非理想化的随机选择假设。
黑名单有效:阻止已知泄露密码是最直接有效的防护手段。
密码强度计需要进化:传统的复杂度检查应该被基于攻击模拟的评估方法取代。
展望未来,密码安全将继续演进。多因素认证正在成为标准,生物识别技术日益普及,无密码认证方案(如FIDO2/WebAuthn)逐渐推广。但只要密码仍然存在,理解其科学的评估方法就至关重要。
正如NIST在2024年指南中所述:“长度和复杂度要求超出本指南建议范围会显著增加使用密码的难度,增加用户的挫败感。因此,用户往往会以适得其反的方式规避这些限制。其他缓解措施(如黑名单、安全哈希存储、机器生成的随机密码和速率限制)在防止现代暴力破解攻击方面更有效。”
科学的密码安全不是关于制造用户的麻烦,而是关于在安全与可用性之间找到最优平衡。这个平衡点,就在长度优先、黑名单辅助、以及尊重用户认知能力的交汇处。
参考文献
- NIST SP 800-63B Appendix A - Strength of Passwords, 2024 Edition
- Burr, W.E., Dodson, D.F., Polk, W.T. “Electronic Authentication Guideline.” NIST SP 800-63, 2006
- Komanduri, S., et al. “Of Passwords and People: Measuring the Effect of Password-Composition Policies.” CHI 2011
- Weir, M., et al. “Password Cracking Using Probabilistic Context-Free Grammars.” IEEE S&P 2009
- Wheeler, D.L. “zxcvbn: realistic password strength estimation.” Dropbox Tech Blog, 2012
- Hive Systems. “The 2025 Hive Systems Password Table.” 2025
- BBC News. “Password guru regrets past advice.” August 2017
- Shay, R., et al. “Encountering Stronger Password Requirements: User Attitudes and Behaviors.” SOUPS 2010
- Florêncio, D., Herley, C. “A Large-Scale Study of Web Password Habits.” WWW 2007
- Bonneau, J. “The science of guessing: analyzing an anonymized corpus of 70 million passwords.” IEEE S&P 2012
- Zhang, Y., et al. “The Security of Modern Password Expiration.” CCS 2010
- Schechter, S., et al. “Popularity is Everything: A New Approach to Protecting Passwords from Statistical-Guessing Attacks.” HotSec 2010
- HaveIBeenPwned Password Database. https://haveibeenpwned.com/Passwords
- UK NCSC. “Password guidance: simplifying your approach.” 2015
- Munroe, R. “Password Strength.” XKCD Comic #936, 2011