“可靠性依赖抗碰撞性。固定一棵正确构建的树,假设某个 $v\ne v i$ 的打开仍获接受。若两份叶摘要已经相同,两个不同的规范叶输入立即给出 H 碰撞。否则,从叶向上比较真假路径:起点摘要不…”
形式陈述
抗碰撞性要求:即使攻击者可以自行挑选两份输入,也难以找到摘要相同的不同输入。 它约束的是寻找碰撞的计算难度,而不是断言碰撞不存在。
对安全参数
则称该族具有抗碰撞性。概率来自索引生成与攻击者的随机硬币;“可忽略”指随着安全参数增长,成功率最终小于任意逆多项式。[1]
这里
直觉
碰撞很多,为什么仍可能找不到
若输出只有
攻击者无需命中特定输出,只要在已见输出中找到任意重复即可。对理想的
这个量由输入对的个数
例子与边界
三个安全目标的输入顺序不同
| 目标 | 攻击者先拿到什么 | 要找到什么 |
|---|---|---|
| 抗原像 | 给定摘要 |
某个 |
| 抗第二原像 | 给定消息 |
不同的 |
| 抗碰撞 | 公开哈希函数 | 自行挑选不同 |
碰撞攻击可以预先设计两份文档再请求签署其中一份;第二原像攻击则必须匹配已经固定的文档。两者的控制权不同,生日攻击的
两个对象相同编码,不是哈希碰撞
假设系统直接拼接两个字段,不写分隔符或长度。那么对象 ("ab", "c") 和 ("a", "bc") 都被编码为字节串 abc。它们的哈希当然相同,但这没有产生定义要求的
解决这类歧义要靠无歧义序列化,例如长度前缀、规范编码或带类型的编码。抗碰撞哈希只保证不同输入难以发生摘要碰撞,不能修复对象到输入字节之间已经丢失的区分。
变动敏感、保密与来源认证也不同
“输入改一位,输出通常变化很多”是扩散现象,并不充分推出抗碰撞性。反过来,抗碰撞函数也不应被当作加密:哈希身份证末位、布尔状态或其他小候选集合,攻击者仍可枚举所有候选并比对摘要。
公开摘要本身也不能认证来源。若攻击者能同时替换文件与公开的摘要,他可对替换文件重新计算摘要,完全不必找碰撞。来源保证来自可信渠道、消息认证码或数字签名;哈希只是其中一个组成部分。
推论与应用
在“先哈希、再签名”中,签名绑定的是摘要。若攻击者找到两条不同消息共用摘要,就可能把对一条消息的签名转移到另一条消息上。因此整个构造既需要适当的签名安全,也需要正确的哈希与编码规则。[2]
在 Merkle 树或内容寻址存储中,节点摘要压缩了子对象的描述。抗碰撞性支撑“两个不同结构难以得到同一标识”,但叶节点与内部节点应使用可区分的编码,避免结构歧义。用于承诺时,抗碰撞性可以支撑绑定性;隐藏性仍要由随机性和相应定义另外保证。
使用一个哈希函数前,应说明到底依赖哪条性质:去重是否容许误判、签名是否依赖碰撞困难、认证是否已经有秘密密钥。这比把所有要求统称为“哈希很安全”更具体。
Merkle认证树把这条要求落实为可复算的归约:错误位置值若沿路径得到同一可信根,就在叶或第一个汇合层交出两个不同输入的同一摘要。多重证明共享多条路径的中间计算,稀疏树则把固定键处为空也纳入认证;二者仍需明确可信根与规范编码。
参考资料
- [1] Mike Rosulek, The Joy of Cryptography, Ch. 10 “Collision-Resistant Hash Functions”:安全游戏、生日攻击与不同哈希安全目标。
- [2] Dan Boneh and Victor Shoup, A Graduate Course in Applied Cryptography, version 0.6, 2023,Ch. 8:抗碰撞哈希、消息完整性及构造中的编码。