很多人对密码安全的想象还停留在“只要够复杂就没人能破”。大小写字母加数字再加符号,凑够十二位,觉得自己稳了。但现实里,复杂密码被破的案例一点不比简单密码少。问题不在复杂有没有用,而在于复杂只堵住了其中一个门,其他的门还大敞着。
攻击者最常干的事,不是对着你一个人的账号硬猜。他们手里通常握着一批从某个网站泄露出来的数据库,里面是成千上万个邮箱和密码哈希。如果那个网站存密码的方式比较糙,比如用MD5或者SHA1,还不加盐,那跑起来快得离谱。一张显卡一秒钟能算几十亿次,稍微搭个集群,几十亿条候选密码几天就跑完了。你觉得自己那个“Zhang1987!”挺复杂,但在规则字典面前,这种“首字母大写+年份+感叹号”的组合早就被穷举过无数遍了。复杂规则反而把用户逼出了高度一致的行为模式,攻击者就照着这个模式生成字典,命中率相当可观。

更省事的办法是撞库。你在某个小论坛注册时用了一个复杂密码,后来那个论坛数据库泄露了。攻击者拿到你的邮箱和密码,直接去试你的网银、邮箱、社交账号。很多人虽然每个网站密码不一样,但变来变去就那么几个模板,改个后缀换个年份。攻击者试两三次就进去了。这种情况下密码复不复杂根本无所谓,因为你等于把钥匙复制了一份放在别人家里。
钓鱼和社会工程就更直接了。假登录页做得跟真的一模一样,你收到一封邮件说账号异常要点进去验证,输入密码的瞬间,攻击者就拿到了。密码再复杂,也挡不住你亲手交出去。键盘记录器、恶意浏览器扩展、公共WiFi上的中间人代理,干的都是同一件事:在你输入密码的时候截下来。你输入的是一串随机字符还是生日,对它们来说没区别。
服务器端的问题往往被忽略。很多网站存密码的方式根本不合格,有的甚至明文存。一旦服务器被攻破,所有密码一览无余。还有密码重置流程,很多平台靠邮箱或短信验证码来重置密码。如果你的邮箱被黑了,或者手机号被 SIM 卡劫持,攻击者根本不需要知道原密码,走“忘记密码”就能把账号拿走。复杂密码在这里连出场机会都没有。
登录之后的会话令牌也是个漏洞。网站为了让你不用每次操作都输密码,会发一个 cookie 或者 token。攻击者通过 XSS 或者网络嗅探偷到这个令牌,就能直接冒充你,密码是什么他压根不关心。双因素认证能挡掉一大部分这类攻击,但短信验证码也不是铁板一块,SIM 交换攻击和实时钓鱼都能绕过去。硬件密钥或者 passkey 要安全得多,但普及度还不够。
还有一个尴尬的现实:很多网站的密码规则本身就限制了安全性。有的规定最长不能超过十六位,有的不允许空格,有的强制要求特殊符号但又不让用某些字符。结果用户只能在一个很窄的范围内选密码,熵值上不去。密码的强度主要看长度和随机性,不是看有没有感叹号。一个二十位的随机短语,比十二位的“复杂”密码难猜几个数量级。但人脑记不住二十位随机串,于是写便利贴、存记事本、用重复模式,又把安全性拉回来了。
量子计算是另一个远期变量。它对目前的公钥密码体系威胁很大,但对密码哈希的影响没那么直接。真正的问题在于,如果加密通道被破了,中间人攻击会变得更容易,你输入密码的过程可能被截获。不过这是整个基础设施层面的问题,不是个人换个复杂密码能解决的。
说到底,复杂密码的风险不在于它没用,而在于它被当成了唯一的防线。身份验证是一条链,人、设备、网络、服务器、恢复流程,任何一环弱,整条链就断。攻击者从来不按你设想的路线走,他们专挑最薄弱的那个环节下手。你花二十分钟想出来的复杂密码,可能抵不过一次钓鱼点击,或者某个小网站的一次数据泄露。
所以别再迷信复杂了。复杂只是及格线,不是终点。真正管用的做法是:每个账号用不同的长密码,最好是密码管理器生成的;能开双因素就开,优先用硬件密钥或者 passkey;定期看看自己的邮箱有没有出现在已知泄露库里。这些事做下来,比单纯把密码改得更复杂要实在得多。