loicguillois/md5hack
GitHub: loicguillois/md5hack
基于 CUDA 的 GPU 加速 MD5 暴力破解工具,用于教育目的演示并行计算威力及 MD5 密码存储的脆弱性
Stars: 1 | Forks: 0
# md5hack
一个用于学习 CUDA GPU 编程的教育项目,并演示了为什么 MD5 用于密码存储是极度不安全的。
## 关于本项目
本项目作为 CUDA 开发的实践练习而构建:编写 GPU 核函数、管理设备内存、调整线程/块配置,以及理解现代 GPU 的大规模并行性。
它同时也实际演示了为什么绝不应在数据库中使用 MD5 哈希密码。通过在消费级 GPU 上暴力破解 MD5 哈希,md5hack 直观地展示了 MD5 用于密码存储的脆弱性 —— 6 位密码在 38 秒内被破解,这不是理论,而是实践。
数千个 GPU 线程中的每一个都会生成唯一的密码候选,完全在寄存器中计算其 MD5 哈希(无内存流量),并将其与目标进行比较。项目中包含了一个纯 C 单线程 CPU 版本(`md5hack_cpu`),用于比较性能并展示 GPU 的加速效果。
## CPU 与 GPU 性能对比
两个版本实现了完全相同的算法。唯一的区别在于并行性。
测试平台:Intel Core i7-8700K @ 3.70 GHz (CPU) 和 NVIDIA GeForce GTX 1080 (GPU)。
| | CPU (i7-8700K, 1 核心) | GPU (GTX 1080) | 加速比 |
|---|---|---|---|
| 速度 | ~10 MH/s | ~1,500 MH/s | **~150x** |
| "test5" (5 位) | 87.2s | 0.6s | 145x |
| "AZE128" (6 位) | ~95 分钟 (估计) | 37.8s | ~150x |
## 使用方法
```
# GPU 版本(需要 NVIDIA GPU + CUDA)
./md5hack
# CPU 版本(可在任意环境运行)
./md5hack_cpu
```
### 示例
```
# 破解 3 位数字密码
./md5hack 202cb962ac59075b964b07152d234b70 3
# → 找到:"123"(即时)
# 破解 6 位字母数字密码
./md5hack a906449d5769fa7361d7ecc6aa3f6d28 6
# → 找到:"123abc"(GTX 1080 上约 1.2s)
# 破解包含数字的大小写混合密码
./md5hack 45c6666f0cfa1d37778f7a9ad7f428ca 6
# → 找到:"AZE128"(GTX 1080 上约 38s,1.5 GH/s)
```
### 字符集
暴力破解覆盖 `a-z A-Z 0-9`(62 个字符),对于长度为 L 的密码,总候选数为 62^L。
| 长度 | 密钥空间 | GPU (GTX 1080) | CPU (单核) |
|--------|----------|----------------|-------------------|
| 3 | 238,328 | 瞬间 | 瞬间 |
| 4 | 14,776,336 | 瞬间 | 1.5s |
| 5 | 916,132,832 | < 1s | ~1.5 分钟 |
| 6 | 568 亿 | ~38s | ~1.6 小时 |
| 7 | 3.5 万亿 | ~40 分钟 | ~4 天 |
| 8 | 218 万亿 | ~40 小时 | ~253 天 |
## 构建
### 环境要求
- GCC(用于 CPU 版本)
- NVIDIA GPU + CUDA toolkit(用于 GPU 版本,使用 CUDA 12.8 测试)
```
# 构建两个版本
make
# 仅构建 GPU 版本
make gpu
# 仅构建 CPU 版本(无需 CUDA)
make cpu
```
## 项目结构
```
md5hack/
├── Makefile
├── README.md
└── src/
├── main.cu GPU version: CUDA kernel launch, progress display
├── md5_gpu.cuh MD5 algorithm on GPU (register-only, __device__)
├── charset.cuh Candidate generation from thread index (__device__)
└── md5hack_cpu.c CPU version: single-threaded C, same algorithm
```
## 工作原理
1. 目标 MD5 哈希被解析并存储在 GPU **常量内存** 中(可快速广播至所有线程)
2. 密钥空间(62^长度 个候选)被分成约 200 万个一批
3. 每批启动一个包含 8192 个块 × 256 个线程的 CUDA 核函数
4. 每个线程将其全局索引转换为密码候选(62 进制编码)
5. MD5 哈希完全在 GPU **寄存器** 中计算 —— 哈希过程中不访问共享内存或全局内存
6. 如果线程找到匹配项,它将通过原子操作写入结果
7. 主机在批次之间检查结果并显示进度(速度、百分比)
CPU 版本遵循相同的步骤,但是顺序执行的:在简单的 for 循环中逐个处理候选。
## 为什么绝不应将 MD5 用于密码
2000 年代,MD5 被广泛用于在数据库中存储哈希密码。应用程序不再以明文保存密码,而是存储 `MD5(password)` —— 如果数据库泄露,攻击者只能看到哈希值,而非密码。
**这已不再安全。** 正如本工具所演示的,单个消费级 GPU 每秒可以测试 15 亿个 MD5 候选。高端 RTX 4090 可达到 1640 亿 MD5/s([来源](https://gist.github.com/Chick3nman/32e662a5bb63bc4f51b847bb422222fd))。在此类硬件上,MD5 哈希的 8 位字母数字密码可在 48 分钟内被破解([来源](https://www.bitdefender.com/en-us/blog/hotforsecurity/rtx-4090-8-card-rig-cracks-random-and-powerful-eight-character-passwords-in-48-minutes))。
根本问题在于:**MD5 太快了。** 它是为校验和数据完整性设计的,而非用于密码存储。一个好的密码哈希必须是刻意缓慢的,以使暴力破解不可行。
### 应该使用什么替代
现代密码哈希算法设计为缓慢、内存密集且抗 GPU 加速:
| 算法 | RTX 4090 速度 | 对比 MD5 | 状态 |
|-----------|---------------|--------|--------|
| MD5 | 164 GH/s | 基准 | **已破解** — 禁止使用 |
| SHA-256 | ~22 GH/s | 慢 ~7x | **不适用于**密码 |
| bcrypt (cost 10) | 184 kH/s | **慢 ~900,000x** | 推荐 |
| Argon2id | ~10 kH/s | **慢 ~16,000,000x** | 最佳实践 |
对于 bcrypt 的 184 kH/s 速度,破解一个 8 位密码需要 **~37,000 年**,而 MD5 只需 48 分钟。
**当前建议**([OWASP 密码存储备忘单](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)):
1. **Argon2id**(2015 年密码哈希竞赛获胜者)—— 黄金标准。内存密集,抗 GPU/ASIC 攻击。推荐配置:19 MiB 内存,2 次迭代,1 个线程。
2. **bcrypt** —— 自 1999 年起久经考验,广泛支持。使用 cost factor 10+。仅限于 72 字节密码。
3. **scrypt** —— 内存密集替代方案,适用于无法使用 Argon2 的情况。
切勿使用 MD5、SHA-1、SHA-256 或任何快速哈希进行密码存储 —— 即使使用了加盐。
### 参考资料
- [OWASP 密码存储备忘单](https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html)
- [2025 密码哈希指南:Argon2 vs Bcrypt vs Scrypt vs PBKDF2](https://guptadeepak.com/the-complete-guide-to-password-hashing-argon2-vs-bcrypt-vs-scrypt-vs-pbkdf2-2026/)
- [Hashcat RTX 4090 基准测试](https://gist.github.com/Chick3nman/32e662a5bb63bc4f51b847bb422222fd)
- [RTX 4090 在 48 分钟内破解 8 位密码](https://www.bitdefender.com/en-us/blog/hotforsecurity/rtx-4090-8-card-rig-cracks-random-and-powerful-eight-character-passwords-in-48-minutes)
## 作者
**Loïc Guillois** — [github.com/loicguillois](https://github.com/loicguillois)
## 许可证
MIT
标签:CUDA编程, DOS头擦除, GPGPU, MD5破解, PoC, Vectored Exception Handling, 信息安全教学, 哈希碰撞, 安全演示, 密码存储弱点, 密码安全, 密码破解, 并行计算, 性能测试, 暴力破解, 离线破解, 高性能计算