1. 引言:密码安全的攻防博弈
在网络安全领域,密码破解工具扮演着双重角色——对防御方而言,它们是检测弱密码、评估系统安全性的审计利器;对攻击方而言,则是渗透测试中的必要手段。理解这些工具的工作原理,不仅关乎技术能力的提升,更关乎对密码安全本质的认知。
John the Ripper(简称JtR)与Hashcat是当今最主流的两个密码破解工具,它们各有侧重、各有所长。而*2john工具家族则是连接“原始数据”与“可破解哈希”之间的桥梁。本文将系统性地剖析:Hash算法的分类与特征、*2john工具的工作原理、John the Ripper与Hashcat的核心差异,以及它们在实战中的应用策略。
2. Hash算法家族:密码存储的基石
2.1 什么是密码哈希?
密码哈希(Password Hash)是将用户密码通过单向函数转换后得到的固定长度字符串。其核心特性包括:
| 特性 | 说明 |
|---|---|
| 单向性 | 从哈希值无法逆向还原原始密码 |
| 确定性 | 同一密码每次计算得到相同哈希 |
| 雪崩效应 | 密码微小改动导致哈希值剧烈变化 |
| 抗碰撞性 | 难以找到两个不同密码产生相同哈希 |
2.2 主流Hash算法分类
2.2.1 传统加密哈希(Unix早期)
| 算法 | 输出长度 | 设计者 | 安全性状态 | 典型应用 |
|---|---|---|---|---|
| DES crypt | 64位 | IBM | ❌ 已破解 | 早期Unix密码(已淘汰) |
| MD5 | 128位 | Rivest | ❌ 碰撞可构造 | 已不推荐用于密码存储 |
| SHA-1 | 160位 | NSA | ⚠️ 理论碰撞 | Git、TLS(逐步淘汰) |
2.2.2 密码哈希专用算法
这些算法通过加盐(Salt) 和迭代计算(Key Stretching) 抵抗暴力破解:
| 算法 | 特点 | 强度 | 典型应用 |
|---|---|---|---|
| bcrypt | Blowfish加密 + 可调迭代次数 | 高 | OpenBSD、不少Web框架 |
| scrypt | 内存硬函数,抗ASIC/GPU | 很高 | 加密货币钱包 |
| Argon2 | 2015密码哈希竞赛冠军 | 最高 | 新一代系统推荐 |
| PBKDF2 | 基于HMAC的迭代派生 | 中(取决于迭代数) | WPA2、许多企业系统 |
| NTLM | Windows专有,基于MD4 | 低 | Windows本地认证 |
算法设计逻辑:现代密码哈希算法的核心追求是慢——让每一次哈希计算都消耗足够多的资源,从而大幅提高暴力破解的成本。
2.3 哈希的“外在”表现:唯一识别
不同Hash算法产生的输出格式具有明显特征,可通过这些特征快速识别哈希类型:
| Hash类型 | 输出特征 | 示例 |
|---|---|---|
| MD5 | 32位十六进制字符 | 5d41402abc4b2a76b9719d911017c592 |
| SHA-1 | 40位十六进制字符 | a94a8fe5ccb19ba61c4c0873d391e987982fbbd3 |
| SHA-256 | 64位十六进制字符 | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
| bcrypt | $2a$/$2b$前缀 + 盐 + 哈希 |
$2a$10$N9qo8uLOickgx2ZMRZoMy.Mr/.6oK8i.QdWdYdC/4eWb6R9WnZflK |
| NTLM | 32位十六进制(大写通常) | B4B9B02E6F09A9BD760F388B67351E2B |
John the Ripper支持超过300种哈希格式,可通过john --list=formats查看完整列表。
3. *2john工具家族:哈希提取的艺术
3.1 为什么需要*2john?
密码哈希不会直接以“裸露”形式存放在文件中。它们被封装在各种复杂的容器中:加密的PDF、Bitcoin钱包.dat文件、Office文档、系统shadow文件……
*2john工具家族的作用正是从这些特定格式的文件中提取出John可以识别的哈希字符串。正如一位开发者所言:
Most of the *2john programs, in the same directory as the john, unshadow etc binaries, works the same way. Run the program/script and it will give you a help text.
3.2 工作原理:容器 → 哈希串
以PDF为例,pdf2john的工作流程如下:
graph LR
A[加密PDF文件] --> B[pdf2john解析]
B --> C[提取加密字典]
C --> D[构建哈希串]
D --> E[输出JtR兼容格式]
pdf2john的内部机制:
- 解析PDF结构:使用pyHanko库解析PDF的对象结构
- 定位加密字典:找到
/Encrypt条目,获取加密算法、密钥长度等信息 - 提取关键值:包括O(所有者密码哈希)、U(用户密码哈希)、P(权限位)、ID(文件标识符)
- 格式组装:将上述信息按特定格式拼接成JtR可识别的哈希串
不同格式的*2john工具各有侧重:
| 工具名 | 输入来源 | 提取内容 | 输出格式 |
|---|---|---|---|
unshadow |
/etc/passwd + /etc/shadow | 用户名:盐:哈希 | 标准JtR格式 |
pdf2john.py |
加密PDF文件 | 密码相关加密参数 | $pdf$... 格式 |
bitcoin2john.py |
wallet.dat | 加密密钥派生参数 | 钱包特定哈希串 |
rar2john |
RAR压缩包 | 加密头信息 | RAR哈希格式 |
3.3 实战示例
# 从PDF提取哈希
pdf2john encrypted.pdf > pdf.hash
# 查看提取的哈希内容
cat pdf.hash
encrypted.pdf:$pdf$5*6*3*-4*1*256*...*32*7e3c3a...*32*0000...*32*...
# 使用John破解
john --format=PDF pdf.hash --wordlist=rockyou.txt
4. John the Ripper:CPU优化的全能型审计专家
4.1 核心定位
John the Ripper被描述为“全能型密码审计专家”,其设计理念是在单一工具中集成多种破解模式,自动检测哈希类型,并具备高度可扩展性。
它通过字典攻击(Dictionary Attack)运行:将字典中的文本样本以与目标密码相同的方式加密,并比较加密输出是否匹配。
4.2 四种核心破解模式
| 模式 | 命令参数 | 工作原理 | 适用场景 |
|---|---|---|---|
| Wordlist模式 | --wordlist |
从字典文件读取单词,可选应用变换规则 | 常见弱密码检测 |
| Single Crack模式 | --single |
利用账户信息(用户名、GECOS字段)生成候选密码 | 针对特定用户的审计 |
| Incremental模式 | --incremental |
暴力穷举所有字符组合(最多8字符) | 短密码的穷举 |
| External模式 | --external |
用户编写类C函数自定义密码生成逻辑 | 高度定制化需求 |
4.3 规则引擎:John的“王牌”
John内置超过3000条变换规则,其规则引擎是其核心竞争力。这些规则可对字典中的单词进行变形:
# 使用默认规则集进行字典攻击
john --wordlist=rockyou.txt --rules hashes.txt
规则类型示例:
l:全小写(password → password)u:全大写(password → PASSWORD)c:首字母大写(password → Password)r:反转(password → drowssap)$:追加字符(password → password123)
4.4 格式指定与自动识别
John可以自动检测哈希类型,也可通过--format显式指定以加速识别:
# 列出所有支持的格式
john --list=formats
# 指定格式破解
john --format=sha512crypt hashes.txt --wordlist=dict.txt
4.5 会话管理
John支持暂停和恢复长期运行的破解任务:
# 显示会话状态
john --status
# 恢复上一次会话
john --restore
5. Hashcat:GPU加速的“破解之王”
5.1 核心定位
Hashcat自称“世界上最快、最先进的密码恢复工具”,其最大特色是利用GPU的大规模并行计算能力实现暴力破解速度的量级提升。
基准测试显示,相同哈希类型下,GPU破解速度可达CPU的数十甚至数百倍。
5.2 攻击模式架构
| 攻击模式 | 代码 | 说明 |
|---|---|---|
| Straight(字典攻击) | -a 0 |
直接使用单词列表 |
| Combination(组合攻击) | -a 1 |
两个字典的笛卡尔积 |
| Mask(掩码攻击) | -a 3 |
智能暴力破解 |
| Hybrid Wordlist + Mask | -a 6 |
字典后跟掩码 |
| Hybrid Mask + Wordlist | -a 7 |
掩码后跟字典 |
5.3 Mask攻击:Hashcat的标志性功能
Mask攻击是传统暴力破解的智能化升级。它通过占位符定义密码结构,显著缩小猜测空间。
内置字符集:
| 占位符 | 含义 | 字符集大小 |
|---|---|---|
?l |
小写字母 | 26 |
?u |
大写字母 | 26 |
?d |
数字 | 10 |
?s |
特殊字符 | 约33 |
?a |
所有可打印ASCII | 95 |
?h |
小写十六进制 | 16 |
?H |
大写十六进制 | 16 |
自定义字符集:通过-1、-2、-3、-4定义:
# 定义自定义字符集:小写字母+数字
hashcat -a 3 -1 ?l?d ?1?1?1?1?1 hashes.txt
# 定义两个自定义字符集
hashcat -a 3 -1 ?l?d -2 ?u ?1?1?1?2?2?2 hashes.txt
为什么Mask优于传统暴力破解?以破解密码“Julia1984”为例:
- 传统暴力破解:需要遍历62⁹ ≈ 1.35×10¹³种组合(4年以上)
- Mask攻击:限定首字母大写+字母+年份模式,仅需约2.37×10¹¹种组合(40分钟)
5.4 规则引擎:与John的兼容与超越
Hashcat的规则引擎与John the Ripper“100%兼容”,这意味着为John编写的规则集可直接用于Hashcat。
核心规则函数示例:
| 函数 | 说明 | 示例规则 | 输入→输出 |
|---|---|---|---|
: |
无操作 | : |
p@ssW0rd → p@ssW0rd |
l |
全小写 | l |
p@ssW0rd → p@ssw0rd |
u |
全大写 | u |
p@ssW0rd → P@SSW0RD |
c |
首字母大写 | c |
p@ssW0rd → P@ssw0rd |
r |
反转 | r |
p@ssW0rd → dr0Wss@p |
d |
重复 | d |
p@ssW0rd → p@ssW0rdp@ssW0rd |
$X |
追加字符 | $1$2 |
p@ssW0rd → p@ssW0rd12 |
^X |
前置字符 | ^2^1 |
p@ssW0rd → 12p@ssW0rd |
sXY |
替换字符 | ss$ |
p@ssW0rd → p@$$W0rd |
Hashcat还实现了John不具备的独有函数,如字符交换(k、K)和位置交换(*NM)。
5.5 增量模式
Hashcat通过--increment标志自动递增密码长度,无需手动为每个长度单独运行:
# 自动尝试长度1-8的所有小写字母组合
hashcat -a 3 ?l?l?l?l?l?l?l?l --increment --increment-min=1 --increment-max=8 hashes.txt
6. John vs Hashcat:核心差异对比
6.1 硬件利用模式
| 维度 | John the Ripper | Hashcat |
|---|---|---|
| 主要计算单元 | CPU | GPU |
| 并行能力 | 中等(多核心) | 极高(数千核心) |
| 能耗效率 | 较高 | 较低 |
| 硬件门槛 | 几乎所有环境 | 需要独立显卡 |
这是两者最本质的差异:John是为CPU优化设计的,而Hashcat从诞生之初就以GPU加速为核心。对于大规模密码破解任务,GPU带来的速度优势是决定性的。
6.2 哈希格式兼容性
两种工具的哈希格式**“大致相同但并不直接兼容”**,这是实践中最大的痛点。
不兼容示例(raw-md5格式):
# John可以加载的格式
jithakur:$dynamic_0$38bb03886dd4fbda5a780f0617847e4c
# Hashcat期望的格式
jithakur:38bb03886dd4fbda5a780f0617847e4c
主要差异:
- 类型标识符:John使用
$tag$格式标识哈希类型,Hashcat使用-m参数指定 - 用户名处理:Hashcat需要
--username标志才能解析带用户名的条目 - 字段分隔符:对于带盐和多参数的哈希,两者的约定可能不同
John的维护者Solar Designer这样描述:
This becomes a hassle when using both tools on a set of hashes like this. Maybe we could make it easier to load hashes formatted for one tool into the other, which may currently require some trivial external scripting (such as with “sed”).
6.3 功能定位对比
| 对比项 | John the Ripper | Hashcat |
|---|---|---|
| 最佳场景 | 综合审计、哈希识别、规则探索 | 大规模破解、已知哈希类型的穷举 |
| 易用性 | 自动检测哈希,使用更简单 | 需指定哈希类型,命令行更复杂 |
| 分布式破解 | 原生支持(通过–node) | 需额外方案 |
| 二进制直接读取 | 不支持 | 部分格式支持 |
| 规则引擎复杂度 | 成熟但较保守 | 丰富且持续扩展 |
6.4 协同工作策略
在实践中,John与Hashcat可以形成互补:
- 哈希提取阶段:使用
*2john工具家族提取可破解的哈希串 - 快速试探阶段:John的自动识别功能快速判断哈希类型和弱密码
- 攻坚阶段:确认哈希类型后,将哈希转换为Hashcat格式,利用GPU大规模破解
- 结果同步:需要将两者的已破解密码(potfile)保持同步,避免重复工作
7. 哈希破解的技术原理
7.1 攻击模式数学本质
| 攻击方式 | 时间复杂度 | 空间复杂度 | 适用条件 |
|---|---|---|---|
| 字典攻击 | O(N×K) | O(1) | 有高质量字典 |
| 暴力攻击 | O(Cᴸ) | O(1) | 密码长度短 |
| 掩码攻击 | O(∏各位置字符集大小) | O(1) | 了解密码模式 |
| 彩虹表攻击 | O(N)查找 | O(压缩存储) | 预计算可用 |
7.2 密码空间计算示例
假设密码长度为8,字符集为小写字母+数字(36个字符):
- 暴力破解空间:36⁸ ≈ 2.8×10¹²
- GPU速度:约100亿次/秒
- 理论耗时:约280秒
实际速度受哈希算法复杂度、硬件配置、温度限制等因素影响,差异可达数倍。
7.3 哈希算法的“慢”设计
现代密码哈希算法刻意被设计得“慢”——通过迭代计算增加单次哈希的时间成本:
- bcrypt:迭代次数可调(通常2¹⁰)
- PBKDF2:迭代次数可调(常为10,000+)
- Argon2:同时消耗CPU和内存资源
这种设计使暴力破解的时间成本呈指数级增长,迫使攻击者在“破一个密码的时间”与“收益”之间做出权衡。
8. 工程实践总结
8.1 工具选择决策树
graph TD
A[开始] --> B{目标是什么?}
B -->|哈希类型未知| C[John + 自动检测]
B -->|哈希类型已知| D{硬件条件?}
D -->|仅有CPU| E[John]
D -->|有GPU| F{任务规模?}
F -->|小规模/快速试探| E
F -->|大规模破解| G[Hashcat + Mask/规则]
C --> H[提取哈希格式]
H --> G
8.2 核心原则
- 哈希提取:使用
*2john工具从原始数据中提取标准格式哈希 - 效率分层:John用于快速试探和复杂规则,Hashcat用于穷举攻坚
- 格式统一:在两种工具间传递哈希时,通过脚本清理格式差异
- 迭代优化:从已破解密码中分析模式,构造更精准的Mask/规则
9. 总结
John the Ripper与Hashcat代表了密码破解领域的两条不同技术路线:
-
John the Ripper是CPU优化的瑞士军刀——哈希自动识别、丰富规则、会话管理使其成为审计工作的首选。它的价值在于“智能”而非“速度”。
-
Hashcat是GPU加速的破坏性工具——Mask攻击、庞大规则库、多模式支持使其在大规模破解任务中无可替代。它的优势在于“并行”而非“灵活”。
*2john工具家族则是连接“原始数据”与“可破解哈希”的桥梁。理解它们的原理,意味着从根本上理解了一个事实:安全不在于隐藏算法,而在于让破解的成本远大于收益。
在实际攻防中,两种工具常被结合使用:John负责哈希识别和快速试探,Hashcat负责已知哈希类型的深度破解。这种协同策略,正是密码安全审计工作的最佳实践。
原文 https://blog.csdn.net/2301_79518550/article/details/148607765