引言:一个反直觉的事实

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

攻击者可以:

  1. 分析泄露密码数据库,统计各种结构的出现频率
  2. 按频率顺序生成候选密码
  3. 优先尝试最常见的结构组合

这种方法比纯暴力破解快几个数量级,因为它利用了人类选择密码的模式。

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警告黑名单不应过于庞大。原因在于:

  1. 过度限制用户选择:如果黑名单包含数百万密码,用户可能反复被拒绝,产生强烈挫败感。

  2. 增加攻击者的信息优势:黑名单本身可能成为攻击者的资源。如果攻击者知道哪些密码被禁止,他们可以推断用户的可能选择范围。

  3. 边际收益递减:阻止前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年指南中所述:“长度和复杂度要求超出本指南建议范围会显著增加使用密码的难度,增加用户的挫败感。因此,用户往往会以适得其反的方式规避这些限制。其他缓解措施(如黑名单、安全哈希存储、机器生成的随机密码和速率限制)在防止现代暴力破解攻击方面更有效。”

科学的密码安全不是关于制造用户的麻烦,而是关于在安全与可用性之间找到最优平衡。这个平衡点,就在长度优先、黑名单辅助、以及尊重用户认知能力的交汇处。


参考文献

  1. NIST SP 800-63B Appendix A - Strength of Passwords, 2024 Edition
  2. Burr, W.E., Dodson, D.F., Polk, W.T. “Electronic Authentication Guideline.” NIST SP 800-63, 2006
  3. Komanduri, S., et al. “Of Passwords and People: Measuring the Effect of Password-Composition Policies.” CHI 2011
  4. Weir, M., et al. “Password Cracking Using Probabilistic Context-Free Grammars.” IEEE S&P 2009
  5. Wheeler, D.L. “zxcvbn: realistic password strength estimation.” Dropbox Tech Blog, 2012
  6. Hive Systems. “The 2025 Hive Systems Password Table.” 2025
  7. BBC News. “Password guru regrets past advice.” August 2017
  8. Shay, R., et al. “Encountering Stronger Password Requirements: User Attitudes and Behaviors.” SOUPS 2010
  9. Florêncio, D., Herley, C. “A Large-Scale Study of Web Password Habits.” WWW 2007
  10. Bonneau, J. “The science of guessing: analyzing an anonymized corpus of 70 million passwords.” IEEE S&P 2012
  11. Zhang, Y., et al. “The Security of Modern Password Expiration.” CCS 2010
  12. Schechter, S., et al. “Popularity is Everything: A New Approach to Protecting Passwords from Statistical-Guessing Attacks.” HotSec 2010
  13. HaveIBeenPwned Password Database. https://haveibeenpwned.com/Passwords
  14. UK NCSC. “Password guidance: simplifying your approach.” 2015
  15. Munroe, R. “Password Strength.” XKCD Comic #936, 2011