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, 信息安全教学, 哈希碰撞, 安全演示, 密码存储弱点, 密码安全, 密码破解, 并行计算, 性能测试, 暴力破解, 离线破解, 高性能计算