引言
哈希函数虽不可逆,但攻击者仍可通过多种方式破解密码或伪造数据。了解这些攻击手段,有助于采取针对性防御措施。本文介绍常见的哈希攻击类型及防护策略。
1. 碰撞攻击
原理:找到两个不同的输入,产生相同的哈希输出。攻击者可利用碰撞伪造数字签名、恶意软件等。
实际案例:2004年王小云教授提出MD5碰撞攻击;2017年Google成功生成SHA-1碰撞(SHAttered攻击)。
防御:使用抗碰撞性强的哈希函数,如SHA-256、SHA-512、SHA-3,避免使用MD5、SHA-1。
2. 彩虹表攻击
原理:预计算常用密码的哈希值并存储为彩虹表,用于快速反向查询。
防御:使用加盐(Salt),使预计算失效。每个用户使用独立随机盐。
3. 字典攻击与暴力破解
原理:尝试常见密码列表(字典)或所有字符组合,直到匹配哈希值。
防御:
- 使用慢哈希算法(如bcrypt、Argon2),增加单次计算成本。
- 要求用户使用强密码(长、复杂、不常见)。
- 限制登录尝试次数,引入验证码。
4. 长度扩展攻击
原理:针对Merkle-Damgård结构的哈希(如MD5、SHA-1、SHA-2),在知道H(message)但不知道message的情况下,可计算出H(message || padding || extra)。
防御:
- 使用HMAC替代简单的哈希(key || message)。
- 使用SHA-3(海绵结构,天然抗长度扩展)。
- 对密码存储,使用密钥派生函数(KDF),避免直接哈希。
5. 中间相遇攻击
原理:利用哈希函数的分组特性,通过空间换时间的方式加速碰撞搜索。
防御:选择足够长的哈希输出(如256位),使攻击所需计算量远超可行范围。
6. 侧信道攻击
原理:通过分析执行时间、功耗、电磁泄漏等信息,推断密码或密钥。
防御:使用常量时间比较(如hash_equals())防止时序攻击;物理隔离等。
防御措施总结
| 攻击类型 | 防御策略 |
|---|---|
| 碰撞攻击 | 使用抗碰撞哈希(SHA-256及以上) |
| 彩虹表攻击 | 加盐(每个用户独立随机盐) |
| 字典/暴力破解 | 慢哈希算法(bcrypt/Argon2)、强密码策略、限流 |
| 长度扩展攻击 | 使用HMAC或SHA-3 |
| 侧信道攻击 | 常量时间比较、安全编码 |
实践建议
- 密码存储:永远使用
password_hash()(PHP)或等效库,不要自己实现。 - 数据完整性校验:使用SHA-256或SHA-512,并记录原始长度防止截断。
- 数字签名:使用SHA-256与RSA/ECDSA组合,避免使用已弃用算法。
- 定期审查使用的哈希函数,关注密码学进展,及时升级。
总结
了解攻击者的手段并采取多层防御,可以大幅提升系统安全性。哈希函数的选择、加盐、慢哈希以及常量时间比较,是保护密码和数据的核心实践。