前面几篇讲的都是骗子主动来找你:钓鱼链接、冒充公检法的电话、刷单群。你只要不点、不说、不转,就挡住了。

还有一条完全不同的失守路径,它不需要你做错任何事。你什么都没点,某天却发现邮箱被人改绑了。起点可能是三四年前随手注册过的一个小网站——那个网站被拖库了,而你在上面用的密码,跟你现在用的某一个一样。

撞库:带着答案去考试

安全行业把这类攻击叫 撞库(credential stuffing)。OWASP 的定义是:把偷来的用户名和密码对,自动注入其他网站的登录表单,试图获取账号访问权 1。

它和暴力破解不是一回事。暴力破解是在 猜——试一万个密码看哪个对,所以密码越乱越难猜。撞库 不猜:攻击者手里拿的已经是确认可用的账号密码,他做的只有一件事,把这串密码拿到别的网站再登一次。CrowdStrike 的解释里因此有一句听上去很反直觉的话:撞库中“密码强度不是问题”,因为攻击者的起点就是一个已经暴露的账号;再强的密码,只要被共享在多个账号上,就是一个负担 2。

这件事已经工业化了:攻击者从黑市买“撞库清单”(combo list),一份动辄上亿条已验证的账号密码对,然后用脚本批量登录,配合大量代理 IP 轮换、自动破解图形验证码,绕开单站点的限速 3。命中一次,这个账号就被标记为“可用”,可以立刻拿去改绑邮箱、转走余额,或者以你的名义去骗你通讯录里的人。

绘制中

“复杂”和“唯一”解决的不是同一件事

我们对密码的期待里混着两个不同目标:

  • 强度:一串密码被猜中、被破解的难度,主要由长度决定。
  • 唯一性:这串密码泄露之后会连带影响几个账号,只取决于你有没有在别处重复用它。

长度、随机性、大小写和符号混搭,全都在提高第一项,对第二项毫无帮助。一条 30 位的随机串,只要它在十个网站上是同一条,泄露一次就等于十次失守——而且因为它又长又难记,你还特别舍不得换。

麻烦的是,这件事网站帮不了你。服务端能做的防御都在自家范围内,比如把已知泄露和常见密码做成黑名单:你设置密码时跟它比对,命中就拒绝。NIST 最新的身份认证指南(SP 800-63B-4)要求单因素密码最低 15 个字符,同时取消了强制字符组合规则,也不再要求定期更换密码 4。取消复杂度规则的依据是,用户会极其可预测地应付它——本来想用 password 的人,被要求加数字就写成 Password1,再要求加符号就写成 Password1!,定期更换的结果也大同小异 5。

这条要求正好说明黑名单的作用范围:它是网站拿你的密码去跟全世界泄露过的密码比对,所以拦得住“你设了一个烂密码”,拦不住“你把这串密码同时用在别处”。没有任何一个网站看得见你在别处用什么密码。

所以在长度和唯一性之间,如果只能先改一件,答案永远是唯一性:它挡住的是已经发生过的泄露,而不是一次猜测的运气。

泄露为什么会发生,“我很小心”为什么不够

泄露是别人家服务器的事。你控制不了对方有没有加盐哈希、用的是不是足够昂贵的哈希算法。同一个库被拖走,结果差别很大:存得好的网站,攻击者拿到的是一堆难以还原的哈希;存得差的,密码基本等于明文。撞库之所以划算,正是因为“能直接拿来用”的那批库足够多——攻击者根本不需要破解你的密码。

所以“我从不点奇怪链接”是真实有效的防护,但它防的是钓鱼,不是撞库。

工具一:密码管理器,把“唯一”变成不费力

一个人记不住 60 条互不相同的强密码,这是事实,不是意志力问题。密码管理器的做法是:你只需要记住 一个主密码,其余每个网站一条又长又随机的密码,由它生成、由它填入。

它要回答的质疑是“那我的密码不都放在一个篮子里了吗”。答案在加密架构里:主流管理器采用 零知识(zero-knowledge)加密,你的密码在自己的设备上加密之后才上传,服务商服务器上存的是密文,解锁密钥由主密码在本地派生,服务商既不保存也不掌握它 6。即使服务商的服务器被攻破,攻击者拿到的是密文,不是你的密码清单。

这套设计把风险重新分配了:原本你要赌“我注册过的几十个网站都不出事”,现在只需要守住一个主密码和你的设备。主密码怎么设?与其拼一个短而复杂的 P@ssw0rd!,不如用多个词组成的 口令短语(passphrase),长度是强度的主要来源,短语既长又好记 5。三条边界一起记住:主密码要长、且只用于这个管理器;管理器账号本身要开双因素认证;零知识也意味着忘了主密码通常无法找回,所以要保存好恢复码。

工具二:双因素认证,让“密码已被知道”不再致命

前面有一篇讲过验证码为什么不能给别人,这里补上它在防撞库里的位置。

密码证明“你知道一串东西”,第二因素证明“你拥有某样东西”。撞库的攻击者手里只有用户名和密码,没有你的手机,也没有你的设备。所以撞库恰好是双因素认证最能拦住的一类攻击:短信验证码、验证器 App、passkey,都能拦住它 7。哪怕某个网站只提供最弱的短信验证码,也值得开。

但“开了 2FA”这四个字几乎不携带信息。各方法真正的分水岭,是能不能被交到假网站手里 7:短信验证码会被 SIM 卡补卡(把你的号码转到别人卡上)和中继钓鱼拿走;验证器 App 的 6 位码不走电话网络、防住了补卡,但它仍是一串给人看的数字,造假站的人在几秒内转发给真站,照样能过;passkey / FIDO2 安全密钥与域名绑定,域名对不上时浏览器根本不会把它拿出来签名,假站拿不到任何可用的东西。

也就是说,这三种方式防撞库的能力差不多,差别主要体现在防钓鱼上。落到行动上:先给邮箱、支付账户,以及“可以用来重置其他账号”的账号(Apple ID、Google 账号、微软账号这类)配上 2FA,有条件时再升级到 passkey。

今天可以做的三件事

  1. 先处理上面那三个账号:各设一条长而唯一的密码,并开启双因素认证。
  2. 泄露过的密码不要“改一改再用”。Password2024 改成 Password2025 是无效动作,攻击者的字典里本来就收录了这类变体。
  3. 检查恢复路径。常见情况是双因素认证做得不错,但找回方式还挂在最弱的环节上,比如用一个短信验证码就能重置那个已经受保护的邮箱。攻击者会从最弱的门进。

两点边界

第一,撞库不保证必然得手。很多服务有异地登录风控、失败次数限速,会拦下一部分;是否失守也取决于泄露的那份密码是否“可直接使用”。这不是放松的理由,但你真正要做的是查清自己有没有在那个站用了重复密码,有就换。

第二,不要把“复杂不重要”听成“密码可以简单”。准确的说法是:字符组合规则和定期改密码的价值被高估了,长度仍然是防在线猜解和离线破解的主要因子。正确的做法是两件同时成立——每条密码都够长,并且互不相同;只能在两者里先做一件时,先做“不重复”。