破解一个密码到底要多久
答案几乎完全取决于两件事:密码是怎么存的,以及它有多长。
两种攻击速度,相差十个数量级
在线攻击是针对真实登录入口的猜测。限流和锁定最多把它压到每秒几次,所以一个有 40 比特熵的密码用这种方式实际上无法破解。离线攻击是在自己控制的机器上针对窃取到的哈希做猜测,现代多 GPU 机器对快速哈希可以达到每秒 10^11 次猜测。
几乎所有「密码几秒被破解」的标题描述的都是第二种情况。这很重要,因为同一个密码在一个站点上可能安全,在另一个站点上却是灾难,原因完全在于站点如何存储它。
按长度看破解时间
下表的计算假设使用完整的可打印字符集(88 个字符,每个字符约 6.46 比特)、每秒 10^11 次猜测,并且攻击者平均在搜索完一半空间之后才找到密码。
| 长度 | 熵 | 离线破解时间 |
|---|---|---|
| 8 | 52 比特 | 约 6 小时 |
| 10 | 65 比特 | 约 2 个月 |
| 12 | 78 比特 | 约 4 万年 |
| 14 | 90 比特 | 约 3 亿年 |
| 16 | 103 比特 | 超出有意义的量级 |
| 20 | 129 比特 | 超出有意义的量级 |
为什么长度胜过长复杂度
每增加一个字符,搜索空间就乘以 88 倍。给一个只含小写的密码增加一类符号,只是把搜索空间乘以约 1.35 倍。整个论证就浓缩在这一点上:长度是唯一带有大指数的杠杆。
这也是为什么强制复杂度规则——一个大写、一个数字、一个符号——产生的密码比长度要求更弱。它们把人推向「Password1!」这类可预测的模式,却几乎没有增加熵。
密码实际上是怎么被破解的
暴力破解在实践中反而是最不常见的方法。把别的泄露事件里的凭据拿来撞库、钓鱼,以及基于个人信息的猜测,造成的账号失陷要多得多。一个 103 比特的密码在五个站点上重复使用,实践中比一个只用一次、只有 60 比特的密码更弱。
所以防御的排序是:唯一密码第一,密码管理器第二,长度第三,复杂度最后。
常见问题
12 个字符够长吗?
对在线攻击来说足够宽裕。对针对快速哈希的离线攻击来说,78 比特已经处在认真配置的硬件所能触及的边缘。16 个字符是更好的默认值。
带符号的密码破解起来更慢吗?
略慢。字符集从 62 增加到 88,每个字符的熵提高约 8%。多四个字符的作用要大得多。
为什么有些资料说 8 个字符几秒就破?
因为它们假设的是 MD5 或 SHA-1 这类快速哈希,以及单块 GPU。对构建糟糕的站点来说这是现实模型,对 bcrypt 或 Argon2 来说则不现实。