目录
漏洞简介
什么是密码学漏洞(Cryptography Vulnerabilities)?
密码学漏洞是指在加密、哈希、签名等密码学操作中使用不安全的算法、错误的实现或不当的密钥管理,导致数据泄露或被篡改。
密码学的核心概念:
1. 对称加密(Symmetric Encryption)
使用相同密钥进行加密和解密:
1 | 明文 + 密钥 → 加密 → 密文 |
2. 非对称加密(Asymmetric Encryption)
使用公钥加密,私钥解密:
1 | 明文 + 公钥 → 加密 → 密文 |
3. 哈希函数(Hash Functions)
单向函数,生成固定长度的摘要:
1 | 任意数据 → 哈希 → 固定长度摘要 |
4. 消息认证码(MAC)
验证消息完整性和真实性:
1 | 消息 + 密钥 → HMAC → 认证码 |
常见密码学漏洞:
| 漏洞类型 | 描述 | 示例 |
|---|---|---|
| 弱算法 | 使用已被攻破的算法 | MD5, DES, RC4 |
| 短密钥 | 密钥长度不足 | 56位DES密钥 |
| 硬编码密钥 | 密钥写死在代码中 | key=”12345678” |
| ECB模式 | 不安全的分组模式 | AES-ECB |
| 无IV | 不使用初始化向量 | 重复的密文 |
| 弱随机数 | 可预测的随机数 | rand(), mt_rand() |
| 重放攻击 | 缺少时间戳/nonce | 重复使用token |
危害:
- 密码被破解
- 数据被解密
- 消息被篡改
- 身份被伪造
- 签名被伪造
DVWA场景:
一个加密消息传输系统,使用不同强度的加密方法。
Low 难度
攻击目标
使用已被攻破的MD5算法,可以轻易破解。
后端代码分析
1 |
|
MD5哈希示例:
1 | 输入:password123 |
漏洞分析
核心问题:
MD5已被攻破
- 存在碰撞攻击
- 2004年王小云教授已破解
- 可以找到两个不同输入产生相同MD5
无盐(Salt)
- 相同密码产生相同哈希
- 容易被彩虹表攻击
XOR加密不安全
- 密钥重用会暴露明文
- 已知明文攻击
硬编码密钥
- 密钥写在代码中
- 任何人都可以看到
攻击步骤
步骤1:MD5暴力破解
使用在线工具:
1 | MD5哈希:5f4dcc3b5aa765d61d8327deb882cf99 |
使用hashcat暴力破解:
1 | # 准备哈希文件 |
使用John the Ripper:
1 | # 准备哈希文件(格式:username:hash) |
步骤2:彩虹表攻击
什么是彩虹表:
1 | 预计算的哈希表: |
生成彩虹表:
1 | # 使用rtgen生成彩虹表 |
步骤3:破解XOR加密
XOR加密原理:
1 | 明文:H e l l o |
已知密钥破解:
1 | import base64 |
已知明文攻击(Known-Plaintext Attack):
1 | # 如果知道一段明文和对应的密文 |
步骤4:暴力破解短密钥
1 | import base64 |
Medium 难度
攻击目标
使用SHA-1哈希和简单的AES加密,仍有弱点。
后端代码分析
1 |
|
新增防护
- SHA-1替代MD5 - 更强的哈希算法
- AES加密 - 标准的对称加密算法
- OpenSSL库 - 使用专业的加密库
仍存在的漏洞
核心问题:
SHA-1已被攻破
- 2017年Google发布SHA-1碰撞
- 仍然可以暴力破解
ECB模式不安全
- 相同明文产生相同密文
- 容易识别模式
硬编码密钥
- 密钥仍在代码中
无盐和迭代
- 密码哈希应使用bcrypt
绕过方法
方法1:SHA-1暴力破解
1 | # 使用hashcat破解SHA-1 |
方法2:利用ECB模式漏洞
ECB企鹅问题(ECB Penguin):
1 | 原始图片 → 使用ECB加密 → 仍能看出轮廓 |
块替换攻击:
1 | # 如果知道某些块的明文和密文对应关系 |
识别ECB模式:
1 | import base64 |
方法3:密钥恢复(如果可以)
1 | # 如果密钥仍然硬编码在可访问的地方 |
High 难度
攻击目标
使用SHA-256和AES-CBC,但仍有实现问题。
后端代码分析
1 |
|
新增防护
- SHA-256 - 更强的哈希算法
- AES-CBC模式 - 更安全的分组模式
- 随机IV - 每次加密使用不同IV
仍存在的漏洞
核心问题:
密码哈希不当
- SHA-256太快,易暴力破解
- 应使用bcrypt/Argon2
硬编码密钥
- 密钥管理不当
缺少消息认证
- 没有HMAC
- 易受Padding Oracle攻击
密钥派生简单
- 应使用PBKDF2/HKDF
绕过方法
方法1:SHA-256暴力破解
1 | # 虽然SHA-256更强,但仍可以暴力破解弱密码 |
方法2:Padding Oracle攻击
什么是Padding Oracle:
1 | AES-CBC使用PKCS#7填充: |
攻击脚本:
1 | import base64 |
方法3:时序攻击
1 | import time |
Impossible 难度
攻击目标
使用现代密码学最佳实践,真正安全。
后端代码分析
1 |
|
完善的防护机制
多层防御:
- Argon2id密码哈希 - 抗暴力破解
- 环境变量密钥 - 不硬编码
- AES-GCM AEAD - 加密+认证
- PBKDF2密钥派生 - 强密钥派生
- 随机盐和IV - 每次都不同
- 认证标签 - 防止篡改
- 密钥轮换 - 定期更换密钥
- 审计日志 - 记录所有操作
安全流程:
1 | 密码哈希: |
为什么无法攻破?
所有攻击都失败:
1 | 攻击1:暴力破解密码 |
防御建议
密码哈希最佳实践
1 | // ✅ 正确:使用password_hash() |
加密最佳实践
1 | // ✅ 正确:使用AEAD模式 |
密钥管理
1 | # 使用环境变量 |
随机数生成
1 | // ✅ 正确:密码学安全的随机数 |
总结对比
| 特性 | Low | Medium | High | Impossible |
|---|---|---|---|---|
| 密码哈希 | MD5 | SHA-1 | SHA-256 | Argon2id |
| 盐(Salt) | ❌ | ❌ | ❌ | ✅ 自动 |
| 加密算法 | XOR | AES-ECB | AES-CBC | AES-GCM |
| IV | ❌ | ❌ | ✅ | ✅ |
| 消息认证 | ❌ | ❌ | ❌ | ✅ AEAD |
| 密钥管理 | 硬编码 | 硬编码 | 硬编码 | 环境变量 |
| 密钥派生 | ❌ | 简单hash | 简单hash | PBKDF2 |
| 攻击难度 | 极易 | 简单 | 中等 | 极难 |
常用工具
密码破解
1 | # Hashcat |
加密分析
1 | # 检测ECB模式 |
实战建议
渗透测试:
- ✅ 识别哈希算法(长度、格式)
- ✅ 尝试彩虹表/暴力破解
- ✅ 检测加密模式(ECB/CBC)
- ✅ 查找硬编码密钥
- ✅ 测试Padding Oracle
- ✅ 分析随机数质量
防御清单:
- ✅ 使用Argon2id/bcrypt哈希密码
- ✅ 使用AES-GCM等AEAD模式
- ✅ 密钥存储在环境变量/KMS
- ✅ 使用PBKDF2派生密钥
- ✅ 使用random_bytes()生成随机数
- ✅ 定期密钥轮换
- ✅ 审计所有密码学操作
道德准则:
- 只在授权环境测试
- 不破解真实用户密码
- 学习是为了构建安全系统