密码强度检测详解:强度条到底在算什么
强度检测在测什么?
密码强度检测要回答一个问题:如果这个密码泄露了,攻击者多久能破解?
注意它测的不是”密码本身是否随机”——一个纯随机的 8 位字符串理论熵有 52 位,但如果是 password 这种字典词,实际强度几乎为零。好的强度检测器模拟的是攻击者的真实策略,而不是简单数”有没有大写字母”。
三种检测思路
1. 规则打分(最弱)
最朴素的检测器就是一堆 if 规则:
- 长度 < 8:弱
- 有大写 +10,有数字 +10,有符号 +15
- 混合各种字符 → 强
这是早期网站”红黄绿”进度条的常见实现。问题是它只看字符种类不看内容:Aa1!Aa1!Aa1! 满足所有规则拿满分,但它是 4 字符循环,破解工具一秒就破。规则打分给人虚假的安全感,属于最不可靠的一类。
2. 熵估算(中等)
按 [[password-gen]] 里讲的熵公式计算:
熵 ≈ 长度 × log₂(字符集大小)
比纯规则好,但它假设密码是随机的。对人造密码(含字典词、键盘序列、日期)严重高估——Password1! 算出来熵不低,实际却被秒破。纯熵公式不识别人类模式,是它的硬伤。
3. 字典 + 模式识别(最强,zxcvbn 路线)
真正靠谱的检测器会模拟攻击者的高级策略,代表是 Dropbox 开源的 zxcvbn。它按攻击者会用的”优先级顺序”逐一尝试匹配:
- 字典词匹配:密码里有没有常见英文单词、拼音、姓氏、常用密码(如
correct、horse、wang123) - 键盘序列:
qwerty、asdfgh、1qaz2wsx这种手指滑动模式 - 重复与序列:
aaaa、1234、abcd - 日期与 L33t 替换:
2024、p@ssw0rd(把 o 换成 0、a 换成 @) - 熵兜底:对匹配不到任何模式的纯随机部分,才按熵公式算
每个匹配段按”攻击者需要多少次猜测能命中”来估算贡献,最后把整段密码的综合猜测次数换算成熵和破解时间。这种方式对人类密码准确得多,因为它还原了攻击者真实的字典+模式攻击思路。
猜测次数 → 破解时间
检测结果最终往往换算成”在线/离线破解需要多久”,让用户有直观感受。换算依赖攻击者的算力假设:
| 攻击场景 | 猜测速度 | 对应场景 |
|---|---|---|
| 在线限速 | 100/秒 | 网站登录接口有限流 |
| 在线不限速 | 10⁴/秒 | 接口没做防护 |
| 离线慢哈希 | 10⁴/秒 | 数据库用 Bcrypt 存储 |
| 离线快哈希 | 10¹⁰/秒 | 数据库用 MD5/SHA,GPU 暴力 |
同一个密码,在不同场景下”安全”程度天差地别。Tr0ub4dour&3 在 Bcrypt 离线场景下能撑几百年,但在 MD5 离线场景下几小时就破。所以”强度”不是绝对的,取决于它最终被怎么存储——这也是为什么 [[bcrypt]] 这种慢哈希那么重要。
如何解读检测结果
好的强度反馈应该告诉用户为什么弱,而不只是给个分数:
- “包含常见词
password” → 换掉这个词 - “检测到键盘序列
qwerty” → 避免手指滑动 - “长度只有 6,建议至少 12 位” → 卷长度
- “纯随机 16 位,熵 105,很强” → 继续保持
单纯的”弱/中/强”标签价值有限,能定位到具体弱点才能帮用户改进。
一个关键认知:强度检测 ≠ 泄露检测
强度检测估的是”密码本身抗暴力破解的能力”,但它不知道这个密码是否已经在泄露库流通。qwerty123 强度检测可能给中等,但它早就排在泄露密码前 100 名里,攻击者第一个就会试。
所以完整的密码安全检查 = 强度检测(抗暴力)+ 泄露检测(查 HIBP 等已知泄露库)。两者解决不同问题,缺一不可。本站 [[password-breach]] 工具做的是后者。
常见误区
- “有符号就强”:
Passw0rd!满足大小写+数字+符号,但字典+L33t 一击即破 - “长就一定强”:
passwordpasswordpassword够长,但纯字典词重复,秒破 - “强度条满格就万事大吉”:强度只防暴力,不防泄露后撞库;每个站点仍需独立密码
- 检测器客户端可信度:本站的检测在浏览器本地完成,密码不会上传——用在线检测器时要留意它是否真的本地计算
小结
密码强度检测的本质是”扮演攻击者,估算破解成本”。规则打分和纯熵公式都不可靠,真正准确的是 zxcvbn 这类”字典 + 模式识别 + 熵兜底”的复合方案。理解了它的工作方式,你就会明白:强度条的颜色不是重点,长度够长 + 不含字典词和模式 + 每站独立才是密码安全的实操要点。