摘要:长度比复杂度更重要——NIST 目前的密码指南(SP 800-63B)明确倾向于使用长口令短语,而不是强制的符号/数字组合,并建议对照已知泄露密码列表进行检查,而不是按固定周期强制密码过期。可搭配 Character CounterText EncryptionDuplicate FinderAI Hidden Characters 一起使用本指南。

密码强度从根本上关乎信息熵——攻击者平均需要多少次猜测——而长度会以指数方式增加信息熵,而添加一个强制符号只能线性地增加它。

为什么长度胜过复杂度规则

密码的搜索空间随字符集大小的长度次方而增长:一个 8 位纯小写字母密码大约有 26⁸(约 2×10¹¹)种可能组合,但一个 16 位纯小写字母的口令短语则有 26¹⁶ 种——大出许多数量级——尽管使用的是更小、更简单的字符集。这正是 NIST SP 800-63B 推荐使用长口令短语而非短而复杂的字符串的主要原因:四个不相关的随机单词既比"P@ssw0rd1!"更容易记住,也更难被暴力破解。

NIST 究竟不再建议什么

两项长期存在的"最佳实践"现在在 NIST 现行指南中被明确劝阻:强制的定期密码过期(这往往导致人们在被迫频繁更改密码时选择更弱、更可预测的密码——一个常见的模式是在末尾递增一个数字),以及要求特定字符类别的强制复杂度规则,这会把人们推向可预测的替换方式(用 @ 代替 a,用 0 代替 o),而这些替换攻击者的字典早已考虑在内。目前的建议转而是:允许长密码(64 个字符以上),不强制任意的复杂度要求,并对照已知泄露的凭证列表检查新密码。

为什么对照泄露列表检查比强度指示器更重要

一个密码可能具有很高的理论熵——长、看起来随机、大小写混合——却仍然危险,如果它出现在已知的数据泄露中,因为攻击者首先尝试的是这些泄露的列表,而不是暴力破解。这正是为什么像 Have I Been Pwned 密码 API 这样的服务会存在:对照已知泄露列表检查新密码,能捕捉到一个只测量理论随机性的通用强度估算无法看到的真实风险。

一种实用的方法

  1. 使用 4 个或更多不相关单词组成的口令短语,或 16 个字符以上的随机字符串,而不是短而复杂的密码。
  2. 永远不要在多个网站上重复使用同一个密码——一个服务的泄露会变成对所有使用相同密码的账户的攻击。
  3. 对照已知泄露列表检查新密码,而不是只信任一个视觉上的"强度"指示器。
  4. 使用密码管理器为每个网站生成并存储唯一密码——一旦你不再自己记忆它们,长度和唯一性就不再是记忆负担。
  5. 只有在有具体原因(怀疑泄露)时才更换密码,而不是按照任意的日程。

应避免的常见错误

  • 把符号/数字复杂度置于单纯的密码长度之上——每增加一个字符,长度所贡献的信息熵要多得多。
  • 在多个账户上重复使用一个强密码,一旦某个网站被攻破,这就失去了意义。
  • 因为密码"看起来随机"就信任它,而不检查它是否出现在已知的泄露中。
  • 出于习惯按固定日程轮换密码——NIST 现行指南明确不建议这种做法。

今天的强密码是一个长而独特的密码——对照已知泄露进行过检查,而不是通过任意复杂度规则强行拼凑出来的字符串,那种字符串主要只是让它更难记住,而不是更难猜到。