三类安全性目标
密码学哈希有三类安全性目标:抗前像(由摘要反推原文)、抗第二前像(给定一条消息找出另一条同摘要消息)、抗碰撞(自由构造两条同摘要消息)。前两类的最优攻击代价约为 2 的 n 次方,抗碰撞只有约 2 的 n/2 次方,因为生日攻击可以大幅降低搜寻成本。理解这组差异,才能判断「256 位哈希」在不同场景下分别意味着什么强度。
基本信息
| 抗前像 | 最优攻击约 2^n,用于口令散列与承诺 |
|---|---|
| 抗第二前像 | 最优攻击约 2^n,用于完整性校验 |
| 抗碰撞 | 最优攻击约 2^(n/2),用于数字签名与证书 |
| 底线 | 签名场景必须使用抗碰撞哈希,MD5 与 SHA-1 已不满足 |
典型使用场景
- 证书与代码签名:依赖抗碰撞性,碰撞即等价于伪造
- 下载校验:关注实际威胁模型,防篡改需要签名而非裸哈希
- 口令存储:关注抗前像与计算成本,摘要长度不是主要矛盾
- 内容寻址与去重:碰撞意味着两条不同内容互相覆盖
- 摘要截断设计:截断会同时降低三类强度,需要重新评估
强度直观对照
强度直观对照
MD5 128 位输出,碰撞可在秒级构造,禁止用于签名
SHA-1 160 位输出,碰撞强度约 80 位,已被实际攻破
SHA-256 256 位输出,碰撞强度约 128 位
SHA-512 512 位输出,碰撞强度约 256 位三类性质对照
| 性质 | 攻击者目标 | 强度上限 | 依赖场景 |
|---|---|---|---|
| 抗前像 | 由摘要反推原文 | 等于输出长度 | 口令散列、承诺 |
| 抗第二前像 | 给定原文找同摘要消息 | 等于输出长度 | 完整性校验 |
| 抗碰撞 | 自由构造两条同摘要消息 | 约输出长度一半 | 数字签名、证书 |
判断哈希是否够用要看输出长度与使用方式两方面:用于签名时必须具备抗碰撞性,而口令存储用的 Argon2、bcrypt、scrypt 主要靠计算成本与盐值,与摘要长度的关系弱得多。
评估思路
- 签名与证书:按抗碰撞强度评估,输出长度至少 256 位
- 口令存储:按抗前像与迭代成本评估,优先专用算法
- 完整性校验:先明确威胁模型,哈希不提供来源认证
- 短摘要使用:碰撞只需生日量级工作量,长度按数据规模估算
生日攻击的代价随数据量增长而下降:当同一条哈希下要产生大量条目时,碰撞概率会显著上升,去重与内容寻址类系统必须按规模重新核算。