ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

密码破解原理与防御:从暴力枚举到多因素认证的完整指南

密码破解原理与防御:从暴力枚举到多因素认证的完整指南

做安全这一行,最常被朋友问的一句话就是:"你能不能帮我破解某个密码?"还有另一个版本:"网上那些破解密码的工具到底有没有用?"每次我都得先泼一盆冷水:真正搞安全的,研究破解从来不是为了去偷别人的号,而是为了搞清楚一件事——密码到底是怎么被拿走的,然后想尽办法让你拿不走。这篇文章,我想把"破解密码"背后的原理和攻击路径,原原本本讲清楚,再把对应的防御思路一条条对上去。文章不会教你任何针对他人账号的具体破解操作,但会把那些绕不开的数学逻辑、人类行为弱点和系统设计缺陷讲透,因为只有知道攻击者是怎么想的,你才知道该往哪儿设防。适合所有想认真保护自己数字账号的人,也适合需要给团队做安全意识培训的人参考。

1. 破解密码的本质,其实是三件事的组合

1.1 枚举空间:密码强度是用计算量来衡量的

讲到破解,很多人第一反应是"黑客有一个神秘工具,咔一下密码就出来"。真实情况没这么玄乎。绝大多数破解行为,本质就是不断地"猜":把所有可能的密码组合从头到尾试一遍,直到遇到正确的那一个。这个过程有一个专门的说法叫枚举。密码强度的高低,不是看你感觉它复不复杂,而是看它所在的枚举空间有多大——也就是攻击者要试完全部候选,得花多长时间。

这里有个很直观的数学对比。一个8位纯数字密码,候选总量是10的8次方,也就是1亿个;一个8位纯小写字母密码,是26的8次方,约2088亿个;如果加了大小写、数字和符号,8位的候选量会膨胀到约6.5万亿个左右。位数每增加一位,空间就指数级扩大。所以密码界有一句话流传很久:长度才是第一要务,复杂度只是帮凶。你可以把枚举空间想象成一把锁的钥匙槽数量,钥匙槽越多,一把把试钥匙的时间就越长,这是最底层的逻辑。

但枚举只是第一步。真正决定破解成本的是"试一次要多久",这就要说到下面一点。

1.2 人类取密码的习惯性思维,才是破解的捷径

如果攻击者真的从头到尾做完整枚举,绝大多数系统的存储和网络都扛不住,也不划算。所以聪明的做法是先按人的习惯来猜。现实中人类设定密码的偏好高度集中:生日、手机号、姓名拼音、键盘相邻键位(比如qwerasdf这种)、单词加一个数字尾巴,还有把年份放在末尾的习惯。密码学里有个词形容这类行为:熵值低。意思是表面上看起来千变万化,实际上真正被人类使用的组合,少得可怜。

这里要引入一个公开的、几乎人人知道的现象:各种安全机构和平台每年都会发布"年度最弱密码排行榜",榜上常客永远是123456、123456789、password、qwerty、iloveyou这些。为什么?因为绝大多数普通用户并不把密码当成一道数学题来看,而是当成一个"能记住"的东西。攻击者当然也清楚这一点,所以他们的字典文件里装的不是全量枚举,而是一堆按使用频率和统计规律排序的人类偏好组合。很多所谓的"破解成功案例",压根没有跑完整个搜索空间,只是在头几万个常用密码里碰巧撞上了。

这也是为什么我一直坚持一个观点:研究"破解密码",与其说是钻研技术,不如说是在研究人类行为。你真正要防的不是一个无限耐心的机器,而是一个深谙人性弱点的对手。后面讲防御,我会反复回到这个前提:先承认自己是人,才会老老实实去用那些反人性的安全工具。

1.3 哈希:服务器不存明文,但破解的攻防依旧存在

现代系统几乎不会明文保存你的密码,而是保存它的哈希值。哈希是一个单向运算,同一输入永远得到同一输出,但从输出几乎不可能反推出输入。你登录的时候,服务器把你输入的密码做同样的哈希运算,再和库里存的哈希比对,一致就放行。这套机制本身是靠谱的。

问题出在两个地方。第一是算法选得弱:早年很多系统还在用MD5、SHA1这类为速度而生的算法,它们算得实在太快,攻击者拿到哈希文件后,可以在一秒内做几百万甚至上亿次穷举尝试。这就相当于把保险柜的锁拆下来拿回家慢慢开,完全没有时间压力。第二是没加盐:不加盐意味着同一个密码在不同平台上的哈希值完全一样,攻击者一旦破解出一条记录,马上就能拿去反查其他平台的同一密码。加盐,就是在每个密码后面随机拼接一段独立数据再做哈希,让相同密码在不同账号上产生完全不同的哈希值。

所以你看,破解和防守其实是一对不停博弈的对手:破解方追求"计算更快、猜得更准",防守方追求"让每一次计算都慢一些、让每个目标都独立一些"。现代密码存储推荐用的bcrypt、PBKDF2、Argon2这类慢哈希算法,就是故意把单次计算拖慢几百毫秒——服务器让用户登录几十次不痛不痒,但攻击者离线跑十亿次候选就要多花好几年。想靠增加长度和复杂度来让密码变安全之前,先得确认后面那套存储机制没有拖后腿,这个顺序不能反。

2. 现实中攻击者最常走的五条路,以及为什么多数人挡不住

讲完底层原理,我们把镜头拉到真实攻防场景。电影里动辄用超级计算机破解密码的桥段,在现实世界很少见。实务中真正得手的方式往往朴素的让人叹气:要么是你在别处泄露的密码被复用,要么是你亲手把密码交给了一个伪装者,要么是你的设备已经被悄悄监听。我按频率和危害,把这五条路排个序。

2.1 在线暴力尝试:最笨重,但永远有人中招

所谓在线暴力破解,就是攻击者对着登录入口一遍遍尝试密码组合。因为每试一次都要走一趟完整的网络请求,速度很慢,而且现代系统多少都有登录限制,所以很多人认为这条路已经过时。但数据摆在那里:只要一个后台接口没有做失败次数锁定、没有验证码、没有速率限制,攻击者用字典序去撞,总有人会把密码设成弱密码榜单里的某一个。

这里必须强调一个关键认知:在线爆破拼的不是算力,而是耐心和低门槛。攻击者不需要什么高深技术,拿一套现成的扫描脚本,对着公开暴露在互联网上的登录接口慢慢跑就行。对运维和开发者来说,防御前提非常简单粗暴——登录接口的限流、锁定、告警必须做到位;对普通用户来说,唯一能做的就是别让自己的密码出现在弱密码榜单里,也别让密码跟个人信息有可绑定关系。

2.2 撞库与凭据填充:最省力的大规模攻击

撞库是我个人认为目前普通用户中招概率最高的一条路。逻辑很简单:你在A网站注册的账号和密码,被A网站的数据库泄露事件带到了暗处;攻击者拿到这个"账密对"之后,并不会只用来登录A网站,而是批量拿到B、C、D网站去试,因为大多数人在每个网站用的是同一套密码。这个批量尝试的过程,业内叫凭据填充。

为什么这条路的成功率一直居高不下?因为人性如此——让每个人在每个平台都记住一串完全不同的随机密码,这本身就反人性。于是悲剧反复上演:某论坛的老密码泄露,几天后受害者的邮箱、购物平台的账号接连被登,可大家第一反应是"这家平台是不是又被脱库了",很少有人愿意承认真正的源头是自己把密码用重了。撞库的元凶不是某个黑客的天才创意,而是密码复用这个普遍习惯。

防御方向很清楚:唯一的根治办法是让每个重要平台拥有独立密码,靠密码管理器来实现"记不住也没关系";次选是至少保证邮箱、支付、社交这三类高价值账号,绝不能和各种来路不明的论坛用同一组密码。别嫌麻烦,真到了账户被洗劫再回头就晚了。

2.3 钓鱼与社会工程学:直接绕过密码本身

这一条严格来说已经不算是"破解密码",而是"骗取密码"。攻击者伪造一个和真实平台长得一模一样的登录页,通过短信、邮件、聊天链接发给你,等你在上面输入账号密码的那一刻,数据已经到了它手里。你输入得越顺畅,它越省事。技术上没有任何破解动作,但得手率非常高。

很多安全社区的人讨论钓鱼,喜欢用"人永远是系统里最薄弱的环节"这句话。我的看法是,这句话不是为了羞辱谁,而是在提醒我们:密码防御不能只靠密码。域名检查、链接悬停预览这些习惯能挡住一部分钓鱼,但对高度定制化的钓鱼页来说还远远不够。更稳妥的是在关键账号上启用一种"即使密码泄露也拿不走账号"的机制,也就是我们后面要专门说的多因素认证。把被动输入变成主动验证,钓鱼的成功率会明显下降。

2.4 哈希文件泄露后的离线破解

这条路的背景我们第一节说过:系统被攻破后,数据库里的密码哈希文件落到了攻击者手里。至此,攻击者不再受网络登录的限制,可以拿一份数据回到自己的机器上慢慢跑。这里的快慢完全取决于哈希算法和破解硬件。慢哈希算法每秒只能算几百次到几千次,配合12位以上的随机密码,离线破解的时间会膨胀到以年为单位,基本等于不可行;而弱算法加短密码,几分钟到几天就能出结果。

值得警惕的是,离线破解的高效催生了两个衍生威胁:彩虹表和预计算字典。彩虹表是把海量常用密码预先算好哈希值存起来,破解时直接查表;加盐防的正是这种东西,因为每个账号盐值不同,彩虹表就失去了通用性。所以我在给团队做安全意识培训时,总把"数据库泄露不等于密码必然被破解"和"算法和盐如果没配置好,泄露就等于裸奔"这两句话放在一起讲。很多人一听到某平台泄露就惊恐万分,实际情况要分两层看:如果平台用的哈希机制合理,泄露的是一堆没法直接用的乱码;如果机制糟糕,泄露就等于把密码本送出去了。

2.5 键盘记录与终端窃听:密码之外的盲区

最后一条路是终端层面的威胁。如果攻击者已经在你的电脑或手机上种下了恶意程序,那么键盘记录、屏幕截图、剪贴板监听都能在你不设防的情况下把密码悄悄带走。这种威胁和密码强度无关,密码再复杂,你毕竟要亲手输进去,只要输入动作发生在被监听的设备上,再强的密码也守不住。

这一块的防御已经超出了"密码怎么设"的范畴,属于设备卫生:操作系统和应用及时更新、不从不正规渠道下载软件、不随意运行不明来源的可执行文件、公共WiFi下的敏感操作能免则免。单独看每一条都很老生常谈,但真正全部坚持做的人很少。我见过太多人守着16位随机密码沾沾自喜,转头就在陌生电脑上登录自己的邮箱——这样的安全再强也留不住。

我用一个表格把这五条路的攻击特征和对应防线总结一下,方便对照:

攻击路径核心前提攻击难度对应防御
在线暴力尝试登录接口无限制低限流、锁定、验证码、远离弱密码
撞库/凭据填充多平台密码复用低独立密码、密码管理器分级管理
钓鱼/社工用户主动输入中域名校验、多因素认证、安全意识
哈希离线破解数据库泄露+弱算法中高加盐、慢哈希、高熵密码
终端窃听设备被植入恶意程序高设备卫生、软件来源管控、补丁更新

3. 那些密码被破解之前,往往已经泄露了

3.1 数据泄露这件事,你根本左右不了

先说一个让很多人沮丧的真相:就算你把自己的密码保护得再好,它依然可能因为你注册过的某个平台数据库被攻破而泄露出去。这份"被动泄露"你无法预测、无法阻止。你以为密码是存在某个地方的一把钥匙,实际它更像你在很多门店都登记过的一道资料,只要其中一间门店管理不善,资料就会流出去。

这些年公开报道的批量泄露事件,动辄涉及几千万甚至上亿条记录。泄露出来的内容里面,除了账号密码,往往还包括手机号、邮箱、密保问题答案、身份证号之类。你完全不需要在黑客的字典里,你的资料早就静静躺在某个攻击者的硬盘里,只是还没被翻牌而已。这个前提想清楚之后,你就能理解为什么安全圈如此强调"必须假设密码可能已经泄露"。这不是悲观,而是理性。只有接受了这个前提,才会认真去做独立密码和多因素认证,而不是把全部希望寄托在一家平台的信用上。

3.2 密码复用才是真正的致命伤

很多非安全从业者有一个根深蒂固的误解:密码泄露事件发生在某个平台,我跟这个平台不熟,所以这事跟我没关系。错。关系不但有,而且大多是乘法关系。攻击者拿到A平台的密码以后,真正值钱的东西不是A平台的账号,而是这份密码在B、C平台那里是否也能开锁。如果你的A平台密码和网银支付密码一致,那A平台的一纸泄露直接把你最重要的资产暴露了。

我见过一起典型案例,印象很深。某开发者一直觉得自己的安全做得很好,每个账号密码都设得很复杂,手机号、关键账号都绑了二次验证。结果他的一个小众技术论坛账号用的是旧密码,恰好那个论坛遭遇了数据泄露,他的密码随着数据包流了出去。一周之后,他的电商平台账号、支付账号接连出现异地登录,因为密码完全一样,二次验证虽然拦住了几笔交易,但还是被反复骚扰了很久。复盘之后他自己都承认:如果当初把高价值账号的密码独立出来,这整件事根本不会发生。

所以我对身边所有人的建议都一样:你可以不用密码管理器,但你至少要把密码分成几档。第一档是邮箱,因为几乎所有账号的找回密码都靠它,它沦陷就等于整个数字生活沦陷;第二档是支付和云存储;第三档是社交媒体;第四档才是论坛、工具站这些低敏感度地方。每一档之间密码必须彻底不同。这个底线都不守的话,谈再多复杂密码规则都是舍本逐末。

3.3 合理检查自己的密码是否出现在泄露名单里

既然泄露是常态,那有没有办法知道自己有没有中招?现在有一些公开的泄露信息查询服务,你输入邮箱或手机号,它会返回你的账号是否出现在历次被公开的数据泄露事件中。这类服务的原理是:它本身不保存你的明文密码,只提供"命中/未命中"的索引,查询行为也是去中心化的,不会把你的查询请求暴露给第三方。

我的使用建议是:把常用邮箱、主要手机号都查一遍,不用天天查,每年查一两次、以及每次看到某平台爆出数据泄露新闻后顺手查一次就够了。查完如果显示"命中",别慌——这恰恰是提醒你马上去改密码的好时机。同时注意,改密码的时候一定要连带检查账号的绑定手机号、恢复邮箱有没有被攻击者改过,因为攻击者拿到密码后,第一件事往往就是把这些找回通道接管走,让你后面想补救都进不去。

4. 站在破解者对面:一个真正扛得住密码体系的完整设计

前面讲了这么多攻击路径,核心不是为了吓人,而是为了让我们知道该在哪些地方花钱、花精力。现在把视角彻底反转,站在防守者一侧,按重要性从高到低,给你一套可以直接落地执行的密码体系设计。

4.1 从破解成本反推密码怎么设

我这里直接给结论,然后解释背后的原因。个人密码的核心策略应该是:随机、够长、独立、不包含任何与个人信息强相关的片段。长度建议至少12位,如果平台支持,16位更好;字符组合里的大小写、数字、符号不是刻意追求的目标,但也不要回避,密码管理器的随机生成器会自然带上这些。

为什么长度是第一位的?回到第一节的数学:一个12位的随机混合字符密码,搜索空间大约是95的12次方,这已经是一个天文数字,配合慢哈希算法,即便动用大规模并行计算硬件,需要的时间也是以万年计的。反过来,一个P@ssw0rd2024这种看似带符号带大小写、其实完全按人类惯性拼出来的密码,真实熵值低得可怜,字典里早就有它的位置。强度的秘密不在于你改得多花哨,而在于候选空间到底有多大,这就只能靠随机性和长度来撑。

设置的时候还有几个经验:

  • 永远不要用生日、手机号、昵称、座右铭、宠物名这类可被社交挖掘的内容当密码主体,也别把它放进密码末尾当"安全后缀"。这类信息在社工眼里简直是开卷答案。
  • 不同平台不要用同一密码,至少把高价值平台彻底独立开。
  • 如果平台强制要求定期改密码,旧密码也不要简单在新密码里延续,更不要在新密码里沿用一个核心词做替换。比如从abc123def改成abc124def这种,在攻击者眼里跟没改一样。

这里顺手辟个谣:很多人觉得"密码定期三个月一换"就一定安全。这个说法现在越来越被质疑。如果你的密码是随机生成的独立密码,按期换确实能降低长期泄露的风险;如果你只是把弱密码从abc123改成abc124,那换一百次也等于没换。与其强迫自己换密码,不如把精力放在让每个密码本身足够强、足够独立上。

4.2 多因素认证的正确用法,以及它真正的边界

如果说密码是第一道门,那么多因素认证(MFA)就是给这道门再加一道锁。目前从可靠性到安全性,我个人的排序大概是:硬件安全密钥最高,然后是基于时间的一次性验证码(TOTP),再到短信验证码,最后是邮箱验证码。越往后越容易被中间人的钓鱼手法截获。

普通用户最容易犯的错误,是把多因素认证当成金刚罩:开了短信验证就觉得万事大吉。实际上短信验证码可以被诱导转发,也可以通过号码接管攻击拿下;TOTP虽然不依赖运营商,但如果手机被种了木马或者验证码输入页本身是钓鱼页,一样可能实时被转发。硬件密钥的特点是它和具体域名绑定,登录过程发起域名如果不对,密钥根本不会应答,这是目前封堵钓鱼最稳的方式。

我的建议不是让每个人都立刻去买硬件密钥,而是分层处理:网银、支付、邮箱、云存储这些一旦沦陷代价极高的账号,尽量用硬件密钥或有离线备份机制的TOTP;社交和普通娱乐账号,至少打开平台自带的二次验证;那些小论坛和一次性注册的网站,反而要提醒自己别用重要密码,因为同时用同一条密码开两个高风险账账号,属于花了力气却把力气用错了地方。

另外要注意:开MFA之前,建议把恢复码和备用码妥善保存下来。没有这个准备动作,遇到手机丢失、验证器App被误删的情况,你可能会被自己锁在门外,到头来不得不用密码找回走邮箱,而邮箱又没开高等级验证,这一串连锁反应等于把前面建立的所有防御打回原形。

4.3 密码管理器:从"记住密码"切换到"保管钥匙"

接下来要聊一个我几乎对所有朋友都会安利的工具:密码管理器。它的核心价值只有一个——把"记密码"这件事从人脑里解放出来。你用一套强主密码打开密码管理器,所有账号的密码全部由它生成和保管,每个平台各不相同的随机密码,你根本不用背。很多人一听"所有密码放在一个软件里"就觉得危险,这种顾虑可以理解,但要想清楚一个关键点:攻击者要拿到你的密码管理器内容,必须先同时突破你的设备登录、主密码、以及可能的本地加密密钥。相比之下,你手记密码时,要防的是几十个平台各自的数据泄露,被击穿的概率要高出几个数量级。

选密码管理器的时候,我看重三件事:

  • 代码开源且经过独立审计,不迷信商业广告。
  • 支持本地加密存储,主密码不会上传到服务端。
  • 团队维护及时,能跟上安全公告。

使用上有两个容易踩的坑,说说。第一是主密码仍然要遵循我们前面说的强密码原则,因为你把整串钥匙都压在这一个密码上;第二是别把密码管理器里的密码导出到明文文本文件里保存,所谓"备份"如果失去了加密,等于亲手把保险箱钥匙配了一把送给别人。很多人的密码管理器被攻破不是因为软件不行,而是使用者自己在某个环节把明文密码敞开了。

4.4 恢复机制与找回通道,别让密码成为唯一的救命稻草

最后说一个很少人认真对待、但出问题最多的环节:找回密码通道。因为你的所有密码理论上都有可能泄露,那么真正意义上的"最后防线"其实是恢复机制。攻击者一旦拿到你的密码,往往会第一时间去修改你的绑定手机号、恢复邮箱、密保问题答案,把整个账号的归属权接管过去。如果你没有及时发现,等你想找回的时候就发现所有通道都被堵上了。

所以我在设计自己的账号安全体系时,会把恢复通道单独划出来管理:

  • 高价值账号的恢复邮箱,要用一个独立、不对外公布、不开云同步的邮箱,密码单独设,并且开启最强的多因素认证。
  • 手机号绑定要检查是否还在自己手上,尤其是那些实名认证过的号码,一旦丢失要立刻通过平台流程申诉并提醒自己检查关联账号。
  • 不要用"你母亲的名字"之类的密保问题,这类答案在熟人社会或社交网络上几乎是公开信息,攻击者可能不需要破解任何东西就能猜到。

这些细节看起来很琐碎,但一个成熟的账户体系里,密码、MFA、恢复通道三者是互相支撑、缺一不可的。只盯着密码本身猛刷强度,却放开了恢复通道,就像把大门换成保险库的锁,却在院墙上开了个便门。

做了这么多年安全,我自己最大的体会是:所谓"破解密码",从来不是某一个天才黑客的炫技,而是一整套围绕人性弱点和系统缺陷的慢功夫。研究这些攻击路径,真正的意义不是教谁去干坏事,而是让我们在设置密码、管理账号、面对钓鱼链接的时候,心里有一张清晰的攻防地图。你再回头看那些中招的案例,几乎没有一个是毫无办法只能眼睁睁挨打的——绝大多数人的损失,早在几个月甚至几年前的一个草率选择里就注定了。每次想偷懒的时候,想想你手里那些一旦丢了就真的回不来的数字资产,这一点时间花得绝对值。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进