密码破解,这四个字在安全圈里是个经久不衰的话题。我做过不少授权渗透测试项目,也帮朋友恢复过遗忘的路由器管理密码,说实话,“破解”这个词听起来很玄,但真正落地时拼的是对密码体系原理的理解、对工具参数的把握,还有足够的耐心。这篇文章我想从实操者的角度,把密码破解的常见路径、核心原理和防御思路一次讲透,重点突出“为什么这样做”和“踩过的坑”,给正在学安全测试或者做企业自查的朋友一份能直接上手的参考。
1. 密码破解的本质:不是“猜”,而是“计算与匹配”
很多人以为密码破解就是拿个工具在那儿傻猜,其实完全不是。密码破解的本质是
在海量候选值中找到与目标哈希值匹配的那一个
,或者
在认证协议的弱点中找到可利用的突破口
。搞懂这一点,后面所有操作思路都会清晰很多。
1.1 先搞清楚攻击目标:明文密码还是密码哈希
绝大多数系统不会直接存储明文密码,而是存储密码的哈希值。哈希算法(比如MD5、SHA1、SHA256、bcrypt、scrypt、Argon2等)把任意长度的密码映射成固定长度的字符串,而且这个映射是单向的。破解的本质,就是把候选密码逐个哈希,拿算出来的哈希和目标哈希比对,一致就算命中。
所以实际工作中,你通常需要先拿到一份哈希文件,比如Linux系统的
/etc/shadow
文件、Windows的SAM文件,或者某个Web应用数据库里的用户表。没有哈希文件,纯靠对在线登录页面做尝试,那是“撞登录口”,属于另一种场景,效率和成功率都差很多。
这里有个很重要的判断:
哈希算法的强度直接决定破解成本
。MD5和SHA1在GPU面前脆弱得跟纸一样,但bcrypt和Argon2设计之初就是故意“算得慢”,让暴力破解的成本呈指数级上升。后面实操环节我会专门说参数怎么选。
1.2 攻击路径的三种基本形态
-
纯暴力破解
:穷举所有字符组合。理论上一定能穷出来,但受限于密码长度和字符集大小。比如8位纯小写字母是26的8次方,约2088亿种组合,看着吓人,但在GPU集群面前也就一会儿的事。如果加了大小写、数字、特殊符号,复杂度就是指数级上涨。
-
字典攻击
:用预生成的字典文件(比如rockyou.txt、常用密码列表)逐个尝试。现实中绝大多数人的密码都在字典里,因为人脑记不住随机字符串。
-
规则变异攻击
:在字典基础上做变形,比如在单词后面加年份、统一换成Leetspeak写法(把e换成3,把a换成4)、大小写交替。这是性价比最高的路径,一条规则能跑出几亿种常见变体。
我的经验是:
90%以上的实际破解任务,靠的是字典加规则,而不是纯暴力穷举
。所以拿到哈希后第一步不是急着跑GPU,而是先分析这个哈希是什么算法、目标用户可能是什么习惯,再选字典和规则。
1.3 合规边界:哪些场景可以动手
这里必须先说清楚:
没有授权就尝试破解任何系统密码,都是违法行为
。我写这篇文章的前提是你拥有目标系统的合法测试授权,或者是在恢复自己设备的密码。正规的渗透测试项目都会签授权书,写明测试范围和时间窗口;漏洞赏金项目也会在白帽范围内划定边界。千万不要越线,安全测试这份职业的口碑和安全,比任何一次“秀技术”都重要。
2. 工具选型:哈希破解与在线爆破的分工
工具太多容易眼花,我按场景把主流工具分成了两大类,实操时根据需求选就行。
2.1 离线哈希破解:Hashcat与John the Ripper
哈希破解的核心工具就两个:Hashcat和John the Ripper(简称John)。两者各有侧重。
|
维度
|
Hashcat
|
John the Ripper
|
|---|
|
硬件加速
|
支持NVIDIA/AMD GPU,速度极快
|
支持GPU但优化略逊,CPU模式更常用
|
|
规则引擎
|
功能更强,支持复杂变异规则
|
规则相对简单,但内置常见模式
|
|
哈希类型支持
|
超过300种,覆盖主流算法
|
约200种,配合社区版可用性也不错
|
|
上手难度
|
参数多,但教程丰富
|
更简单,适合入门
|
我自己主攻Hashcat,因为企业项目里面对的多是WPA2握手包、NTLM哈希、数据库密文,Hashcat的覆盖度和速度优势非常明显。但John在Unix系设备上开箱即用,处理一些老哈希格式时也很顺手,两者的规则文件可以互相转换用。
2.2 在线登录爆破:Hydra与Burp Suite
如果目标没有可离线提取的哈希,只能尝试在线登录,这属于完全不同的战场。Hydra是个老牌在线爆破工具,支持HTTP表单登录、SSH、FTP、SMTP、RDP等几十种服务协议。Burp Suite则是Web应用测试的全能选手,它的Intruder模块可以用来对登录接口做字典尝试,而且能灵活处理验证码、Token等防护逻辑。
坦率讲,在线爆破的效率和成功率都很低:一是受网络延迟限制,每秒尝试次数有限;二是现在的系统基本都有失败锁定、验证码、双因素认证等机制。所以在线爆破通常只在测试低防护的内部系统、或者验证弱口令策略是否存在时使用。
2.3 字典资料:质量决定成败
字典文件是破解的“弹药库”,我电脑里长期存着以下这几类:
-
标准字典
:rockyou.txt,约1400万条真实泄露密码,覆盖了大量历史弱口令,适合起步阶段。
-
中文密码字典
:国内安全社区整理的常见中文拼音组合、手机号段、姓名变体、生日组合,对公司内部人员的弱口令测试效果奇好。
-
行业定制字典
:针对目标行业的关键词组合,比如金融公司用“jinyin”、电商公司用“dianshang”,加上年份和特殊字符后缀,命中率往往出人意料。
-
规则文件
:Hashcat自带的
best64.rule
、
rockyou-30000.rule
,以及社区分享的高阶规则。
不要小看字典准备工作。有一次项目,我用默认rockyou跑了两小时没出结果,后来把目标公司官网上的产品名、公司英文名、创始团队姓名做成定制字典,十分钟内连出三个弱口令。密码学里有个术语叫“密钥空间”,但从攻击者视角看,
用户的思维模式才是真正需要探索的空间
。
3. 核心实现:从拿到哈希到跑出密码的全流程
下面以两个最常见场景为例,拆解完整实操过程。我会把每一步的参数选择和目的讲透,方便你真正理解而不是照抄命令。
3.1 场景一:Linux系统哈希的破解实战
假设你在授权测试中拿到了目标的
/etc/shadow
文件,里面通常是
$6$
开头的SHA-512哈希,或者
$y$
开头的yescrypt哈希。第一步是清理数据,把用户名和哈希提取出来,做成Hashcat能识别的格式。
- # 提取shadow文件中“用户名:哈希”的字段
- awk -F':' '{print $1":"$2}' shadow.txt > hash.txt
复制代码
然后先判断哈希类型。
$6$
就是哈希模式
1800
(sha512crypt),
$y$
对应
10900
(yescrypt),
$2y$
对应bcrypt的
3200
。判断对了模式,破解就成功了一半;判断错了,跑多久都是白费。
接下来选字典。先跑一遍标准字典:
- hashcat -m 1800 hash.txt /path/to/rockyou.txt -r /path/to/best64.rule --force
复制代码
参数的意图很简单:
-m
指定哈希类型,
-r
加载规则变异,
--force
跳过一些环境检测(比如非NVIDIA环境用OpenCL时)。跑完如果没出,就升级到更昂贵的规则组合、更大的字典,最后才考虑纯暴力模式。
3.2 场景二:WPA2 Wi-Fi握手包捕获与破解
WPA2的破解思路跟离线哈希不同,它需要先捕获目标AP(无线接入点)与客户端之间的四步握手报文。用一个支持监听模式的无线网卡(芯片推荐Realtek 8812AU或Atheros AR9271),配合Aircrack-ng工具套件操作。
- # 查看无线网卡接口
- airmon-ng
- # 开启监听模式
- airmon-ng start wlan0
- # 扫描周围AP
- airodump-ng wlan0mon
- # 锁定目标信道与BSSID,捕获握手
- airodump-ng -c 6 --bssid XX:XX:XX:XX:XX:XX -w capture wlan0mon
复制代码
如果周边客户端连接不活跃,可以发送deauth(取消认证)包踢掉一个客户端,强制它重连,从而抓到握手:
- aireplay-ng -0 2 -a XX:XX:XX:XX:XX:XX wlan0mon
复制代码
抓到握手后,文件里会保存为cap格式,然后转成Hashcat可用的hccapx格式再跑GPU:
- # 将cap转为hashcat格式
- cap2hccapx capture.cap capture.hccapx
- # GPU跑WPA2
- hashcat -m 22000 capture.hccapx /path/to/wordlist.txt --rule
复制代码
这里有个关键点:WPA2破解的目标其实是PMKID或者握手包里的PSK哈希,字典里的每一个候选密码都会经过PBKDF2-SHA1计算4096次迭代才能验证。这个算法相对较慢,所以对GPU性能要求高,但哪怕只有一张中端显卡,跑常用弱密码字典也能有不错的成功率。
3.3 硬件与参数:跑得快不如跑得对
GPU型号决定了每秒能尝试的哈希次数。拿
SHA-512crypt
(模式1800)举例,一张RTX 4090大概每秒能跑40万到60万次,但一张普通CPU核跑同一算法可能一秒只能完成几百次。两者差距是数量级的。所以条件允许,搞一块NVIDIA显卡会省很多时间。
但参数选错,硬件再好也白搭:
-
迭代次数
:bcrypt的cost factor默认是12(即2的12次方次迭代),如果目标哈希是cost 12,那每秒能跑的量会断崖下跌。此时不要硬刚纯暴力,必须靠字典加规则。
-
规则文件层级
:
best64.rule
只做小幅度变形,适合快速筛选;
rockyou-30000.rule
做了大量组合变形,速度慢但漏网概率低。务实做法是先跑快规则,再跑慢规则。
-
掩码攻击
:当你大概知道密码格式时,比如“首字母大写+8位数字+感叹号”,用
?u?d?d?d?d?d?d?d?s
这样的掩码能大大压缩尝试空间,比纯暴力少跑几个数量级。
4. 从破解到防御:把攻击视角转为加固思路
做了这么多次攻防对抗,我最大的感受是:
理解攻击路径的价值,在于知道怎么防
。很多企业招人做安全测试,目的不是为了“证明系统可以被打穿”,而是要拿到这份证据去推动整改。
4.1 密码策略的设计原则
-
长度优先于复杂度
:NIST早就建议,与其强制大小写数字符号混用,不如要求至少14位以上,支持长密码短语。原因是14位以上的随机短语,即使全用小写字母,密钥空间也远大于8位混合字符。
-
禁用已知弱口令
:阻止用户使用rockyou字典界定的高频弱口令,这一步能挡掉大量撞库攻击。
-
不要定期强制改密
:除非有泄露事件或明确风险,否则频繁改密只会逼用户加序号后缀,比如
Password1!
、
Password2!
,反而降低整体安全性。
-
允许多因素认证
:这一点是压倒性的。密码泄露不可怕,可怕的是只有一个密码因子在裸奔。
4.2 开发者视角的加密存储
服务端存储密码,现在不应该再用MD5或SHA1这种快速算法。正确做法是加盐加慢哈希。我建议新项目直接上
Argon2id
,它的内存参数和迭代参数可以调节,抗GPU破解能力比bcrypt更硬;老项目至少升级到bcrypt,把cost factor调到12以上。
加盐也很关键:盐必须是每个用户独立的随机值,长度至少16字节。否则两个密码相同的用户,哈希值会一致,攻击者一眼就能分辨出重复口令。
4.3 企业侧的多层防御
单靠密码策略远远不够,实际工作中我经常建议企业再叠加这几层:
-
登录风控
:同一IP高频失败自动限速,异地登录触发二次验证,新设备登录需要邮件确认。
-
泄露情报监控
:订阅泄露数据库检索服务,一旦发现企业员工的邮箱或域名出现在泄露数据中,立即强制重置相关账号。
-
硬件密钥推广
:对内部高权限系统强制使用FIDO2硬件密钥,替代短信验证码。
有一回项目复盘时,客户问我:“既然密码这么容易被破,为什么还在用密码?”我回答:“密码不会消失,但它的定位已经从唯一防线变成了多因素认证中的一环。你要做的不是取消密码,而是让密码即使泄露也派不上用场。”
5. 常见问题与排查技巧实录
长期实操中,我积累了不少典型问题和排查思路,整理成速查表,对照着处理能少走很多弯路。
|
问题现象
|
可能原因
|
处理方案
|
|---|
|
Hashcat提示
No devices found
|
OpenCL驱动未装,或显卡驱动版本过旧
|
安装对应显卡厂商的驱动与OpenCL运行时,NVIDIA装CUDA Toolkit
|
|
哈希跑了一天没出结果
|
字典覆盖度不够,或规则太弱
|
换大字典、加载更激进的规则,尝试掩码攻击缩小范围
|
|
WPA2抓了很多包但显示
0 handshake
|
Deauth包没发出去,或网卡不支持注入
|
检查网卡驱动是否支持包注入,换USB网卡并重试
|
|
跑出来的“密码”是乱码
|
哈希类型判断错误
|
用
hashcat --identify
或者在线哈希识别工具核对算法模式
|
|
John与Hashcat规则不通用
|
两者规则语法存在差异
|
用工具自带的规则格式互转,或直接单独适配
|
还有一个高频提示:
跑出来的明文密码可能是“历史密码”而非“当前密码”
。如果目标系统会定期轮换口令,你破解到的哈希可能来自旧记录,拿到结果后要在目标环境里做一次实际登录验证,别直接拿来写报告,否则容易闹笑话。
做安全测试这些年,我有个非常深的体会:密码破解这项技术,真正考验人的不是命令记得多熟,而是
是否愿意花时间观察目标、分析习惯、打磨字典
。工具是死的,思路是活的。遇到瓶颈时,回头想想对方会怎么设置密码——人的惯性,往往就是最大的突破口。
最后再说一个细节:破解完成后,记得清理现场。临时生成的哈希文件、cap包、破解出的明文密码,该销毁就销毁,该脱敏就脱敏。我们做测试的目的是帮系统变强,不是让敏感数据二次扩散。守住这条底线,这门技术才能一直走在正确的方向上。