安全属性与攻击模型
密码学哈希的安全性由三个逐级更强的属性定义,理解它们之间的包含关系是工程选型的前提:
抗原像性(单向性):给定哈希值 h = Hash(m),找到任意 m' 满足 Hash(m') = h 在计算上不可行。这是哈希作为「数字指纹」的最基本要求——如果你能从一个文件的哈希值恢复出原始文件,哈希就失去了意义。理论上 n 位的安全哈希抵抗原像攻击的复杂度为 2^n。应特别注意的是「迭代哈希」(如多次 Hash(Hash(...)))在某些场景反而降低熵值:SHA-256 迭代 1000 次不会带来显著安全增益。
抗第二原像性:给定消息 m1,找到不同的 m2 满足 Hash(m1) = Hash(m2) 在计算上不可行。这与碰撞抗性的区别在于攻击者不能自由选择第一条消息。Merkle-Damgård 结构的 SHA 家族在消息扩展方面存在固有弱点:长度扩展攻击(Length Extension Attack)允许在不需知道密钥的情况下,从 H(Secret || Message) 推导出 H(Secret || Message || Padding || AttackerData)。HMAC 和 SHA-3(海绵结构)均免于此类攻击。
抗碰撞性(最强要求):找到任意 m1 ≠ m2 满足 Hash(m1) = Hash(m2) 在计算上不可行。由于生日悖论,n 位哈希的碰撞安全强度仅为 2^(n/2)——即 SHA-256 的碰撞安全强度实际为 128 位。这是为什么输出为 160 位的 SHA-1(理论上碰撞安全 80 位)在现代算力下已被攻破的直接原因。碰撞攻击一旦实用化,可被用于伪造数字签名、构造恶意软件变体(同一哈希对应良性/恶意两个版本)、绕过文件白名单等。