返回列表
常见哈希攻击方式与防御
自由客七维 2026-03-26 20:12 20

引言

哈希函数虽不可逆,但攻击者仍可通过多种方式破解密码或伪造数据。了解这些攻击手段,有助于采取针对性防御措施。本文介绍常见的哈希攻击类型及防护策略。

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组合,避免使用已弃用算法。
  • 定期审查使用的哈希函数,关注密码学进展,及时升级。

总结

了解攻击者的手段并采取多层防御,可以大幅提升系统安全性。哈希函数的选择、加盐、慢哈希以及常量时间比较,是保护密码和数据的核心实践。