2025年8月,NIST出了一份指南文档,其中关于密码复杂度的部分,会颠覆业界现有的实现,与大众的普遍认知也完全不同。

简单翻译一下关键的两点:
- 密码至少15个字符
- 不应该强制在密码中设置不同的字符类型,比如大小写,特殊字符的要求。
也就是说:新的密码标准,不再强调强制性的多类型字符的组合,而是更看重密码的长度。
为什么修改
在早期(2003年)的版本中,NIST给出的密码建议是:“包含大小写字符,特殊字符,至少一个数字”。就像这样:“P@ssW0rd123!”。这份密码指南,极大地影响了当今互联网世界。
随处可见的密码强度要求
2003年的指南中的“复杂性”规则背后的逻辑是:如果密码字符集更大(比如包括大写、数字、符号),那么穷举猜测攻击者面对的可能组合数就更多,从数学上安全性更高。
但是,这样的密码最大的问题是,增加了记忆的难度。
实际上,一个长密码:”i-live-in-new-york-city” 远比一个包含特殊字符的短密码:”ILive@NewYork1”更安全。也更容易记忆。
这就是做出NIST对密码指南做出修订的原因。
原作者的反思
https://www.theverge.com/2017/8/7/16107966/password-tips-bill-burr-regrets-advice-nits-cybersecurity
NIST那份早期的密码指南的作者Bill Burr在接受华尔街日报采访时坦承,他对此感到抱歉,他认识到这些规则不仅使密码变得难以记忆,而且对提升密码的安全性提升有限。
数学上的推理
以下从数学上推理密码长度和字符集大小与密码安全性的关系。
密码的安全性(熵值 H)可以由以下公式来衡量
$$H=L×log_2(C)$$
$L$是密码的长度。$C$是密码使用的字符集大小,即可能字符的总数。$H$是熵值,以比特为单位。
| 字符类型 | 字符集大小 (C) | 字符示例 |
|---|---|---|
| 仅小写字母 | 26 | a-z |
| 小写 + 大写 | 52 | a-z, A-Z |
| 小写 + 大写 + 数字 | 62 | a-z, A-Z, 0-9 |
| 小写 + 大写 + 数字 + 特殊符号 | ~94 | a-z, A-Z, 0-9, !@#$%… |
例 A — 短密码 8 字符,使用 94 字符集(含大小写、数字、符号):
- $熵=8×log_2(94)≈52.4368 bits$
- $可能搜索空间≈2^52.4367≈6.0957×10^{15}种可能$
例 B — 长密码 12 字符,但只用小写字母(26):
- $熵=12×log_2(26)≈56.4053 bits$
- $可能搜索空间≈2^56.4053≈9.543×10^{16}种可能$
12个小写字符的密码,比8个含特殊字符的密码难猜约15.7倍。
小结
当前主流的密码要求,是违反人性的。希望更多的厂商能够进行修正。在安全性和便利性上做出权衡。