D
开发工具箱

密码强度检测详解:强度条到底在算什么

安全工具 2026年6月17日 约 1 分钟阅读

强度检测在测什么?

密码强度检测要回答一个问题:如果这个密码泄露了,攻击者多久能破解?

注意它测的不是”密码本身是否随机”——一个纯随机的 8 位字符串理论熵有 52 位,但如果是 password 这种字典词,实际强度几乎为零。好的强度检测器模拟的是攻击者的真实策略,而不是简单数”有没有大写字母”。

三种检测思路

1. 规则打分(最弱)

最朴素的检测器就是一堆 if 规则:

  • 长度 < 8:弱
  • 有大写 +10,有数字 +10,有符号 +15
  • 混合各种字符 → 强

这是早期网站”红黄绿”进度条的常见实现。问题是它只看字符种类不看内容Aa1!Aa1!Aa1! 满足所有规则拿满分,但它是 4 字符循环,破解工具一秒就破。规则打分给人虚假的安全感,属于最不可靠的一类。

2. 熵估算(中等)

按 [[password-gen]] 里讲的熵公式计算:

熵 ≈ 长度 × log₂(字符集大小)

比纯规则好,但它假设密码是随机的。对人造密码(含字典词、键盘序列、日期)严重高估——Password1! 算出来熵不低,实际却被秒破。纯熵公式不识别人类模式,是它的硬伤。

3. 字典 + 模式识别(最强,zxcvbn 路线)

真正靠谱的检测器会模拟攻击者的高级策略,代表是 Dropbox 开源的 zxcvbn。它按攻击者会用的”优先级顺序”逐一尝试匹配:

  1. 字典词匹配:密码里有没有常见英文单词、拼音、姓氏、常用密码(如 correcthorsewang123
  2. 键盘序列qwertyasdfgh1qaz2wsx 这种手指滑动模式
  3. 重复与序列aaaa1234abcd
  4. 日期与 L33t 替换2024p@ssw0rd(把 o 换成 0、a 换成 @)
  5. 熵兜底:对匹配不到任何模式的纯随机部分,才按熵公式算

每个匹配段按”攻击者需要多少次猜测能命中”来估算贡献,最后把整段密码的综合猜测次数换算成熵和破解时间。这种方式对人类密码准确得多,因为它还原了攻击者真实的字典+模式攻击思路。

猜测次数 → 破解时间

检测结果最终往往换算成”在线/离线破解需要多久”,让用户有直观感受。换算依赖攻击者的算力假设:

攻击场景猜测速度对应场景
在线限速100/秒网站登录接口有限流
在线不限速10⁴/秒接口没做防护
离线慢哈希10⁴/秒数据库用 Bcrypt 存储
离线快哈希10¹⁰/秒数据库用 MD5/SHA,GPU 暴力

同一个密码,在不同场景下”安全”程度天差地别。Tr0ub4dour&3 在 Bcrypt 离线场景下能撑几百年,但在 MD5 离线场景下几小时就破。所以”强度”不是绝对的,取决于它最终被怎么存储——这也是为什么 [[bcrypt]] 这种慢哈希那么重要。

如何解读检测结果

好的强度反馈应该告诉用户为什么弱,而不只是给个分数:

  • “包含常见词 password” → 换掉这个词
  • “检测到键盘序列 qwerty” → 避免手指滑动
  • “长度只有 6,建议至少 12 位” → 卷长度
  • “纯随机 16 位,熵 105,很强” → 继续保持

单纯的”弱/中/强”标签价值有限,能定位到具体弱点才能帮用户改进。

一个关键认知:强度检测 ≠ 泄露检测

强度检测估的是”密码本身抗暴力破解的能力”,但它不知道这个密码是否已经在泄露库流通qwerty123 强度检测可能给中等,但它早就排在泄露密码前 100 名里,攻击者第一个就会试。

所以完整的密码安全检查 = 强度检测(抗暴力)+ 泄露检测(查 HIBP 等已知泄露库)。两者解决不同问题,缺一不可。本站 [[password-breach]] 工具做的是后者。

常见误区

  1. “有符号就强”Passw0rd! 满足大小写+数字+符号,但字典+L33t 一击即破
  2. “长就一定强”passwordpasswordpassword 够长,但纯字典词重复,秒破
  3. “强度条满格就万事大吉”:强度只防暴力,不防泄露后撞库;每个站点仍需独立密码
  4. 检测器客户端可信度:本站的检测在浏览器本地完成,密码不会上传——用在线检测器时要留意它是否真的本地计算

小结

密码强度检测的本质是”扮演攻击者,估算破解成本”。规则打分和纯熵公式都不可靠,真正准确的是 zxcvbn 这类”字典 + 模式识别 + 熵兜底”的复合方案。理解了它的工作方式,你就会明白:强度条的颜色不是重点,长度够长 + 不含字典词和模式 + 每站独立才是密码安全的实操要点。