Skip to content

定义Definition

抗碰撞性

Collision resistance

攻击者公开选择两个不同输入仍难以找到同摘要;解释生日尺度、目标消息差异和序列化歧义。

形式陈述 ​

抗碰撞性要求:即使攻击者可以自行挑选两份输入,也难以找到摘要相同的不同输入。 它约束的是寻找碰撞的计算难度,而不是断言碰撞不存在。

对安全参数 λ,设公开算法生成哈希函数族的索引 k←Gen(1λ),并确定函数 Hk。本页采用经典 uniform 攻击者模型。若对任意概率多项式时间攻击者 A,都有

Pr[(x,x′)←A(1λ,k):x≠x′ ∧ Hk(x)=Hk(x′)]≤negl(λ),

则称该族具有抗碰撞性。概率来自索引生成与攻击者的随机硬币;“可忽略”指随着安全参数增长,成功率最终小于任意逆多项式。[1]

这里 k 是提供给攻击者的公开函数索引,不是需要保密的加密密钥。实际固定规格的密码学哈希函数则通常用具体攻击成本和输出位数描述安全强度;形式定义与具体实例的安全评估要分开。

直觉

碰撞很多,为什么仍可能找不到 ​

若输出只有 n 比特,而允许输入的数量超过 2n,鸽巢原理已经保证存在不同输入落到同一输出上。但存在性没有交付找到它们的有效方法,正如知道某把锁有钥匙,并不等于知道钥匙的形状。

攻击者无需命中特定输出,只要在已见输出中找到任意重复即可。对理想的 n 比特随机函数,在 q 个不同输入上求值,且 q≤2n 时,碰撞概率为

1−∏j=0q−1(1−j2n)≈1−exp(−q(q−1)2n+1).

这个量由输入对的个数 (q2) 决定,而不只是由输入个数 q 决定。因此约 2n/2 次求值就达到常数成功概率,这就是生日攻击的平方根尺度。它说明 256 比特摘要在理想模型下对应约 128 比特的经典通用碰撞搜索强度;这不是对某个具体函数不存在结构性攻击的证明。[1]

例子与边界

三个安全目标的输入顺序不同 ​

目标 攻击者先拿到什么 要找到什么
抗原像 给定摘要 y 某个 x 使 H(x)=y
抗第二原像 给定消息 x 不同的 x′ 使 H(x′)=H(x)
抗碰撞 公开哈希函数 自行挑选不同 x,x′,使摘要相同

碰撞攻击可以预先设计两份文档再请求签署其中一份;第二原像攻击则必须匹配已经固定的文档。两者的控制权不同,生日攻击的 2n/2 成本不能直接当作匹配某份既定文档的成本。严格讨论蕴含关系时,还要固定输入分布、长度与函数族,不能只比较三个中文名称。

两个对象相同编码,不是哈希碰撞 ​

假设系统直接拼接两个字段,不写分隔符或长度。那么对象 ("ab", "c") 和 ("a", "bc") 都被编码为字节串 abc。它们的哈希当然相同,但这没有产生定义要求的 x≠x′:送入哈希函数的字节串根本相同。

解决这类歧义要靠无歧义序列化,例如长度前缀、规范编码或带类型的编码。抗碰撞哈希只保证不同输入难以发生摘要碰撞,不能修复对象到输入字节之间已经丢失的区分。

变动敏感、保密与来源认证也不同 ​

“输入改一位,输出通常变化很多”是扩散现象,并不充分推出抗碰撞性。反过来,抗碰撞函数也不应被当作加密:哈希身份证末位、布尔状态或其他小候选集合,攻击者仍可枚举所有候选并比对摘要。

公开摘要本身也不能认证来源。若攻击者能同时替换文件与公开的摘要,他可对替换文件重新计算摘要,完全不必找碰撞。来源保证来自可信渠道、消息认证码或数字签名;哈希只是其中一个组成部分。

推论与应用

在“先哈希、再签名”中,签名绑定的是摘要。若攻击者找到两条不同消息共用摘要,就可能把对一条消息的签名转移到另一条消息上。因此整个构造既需要适当的签名安全,也需要正确的哈希与编码规则。[2]

在 Merkle 树或内容寻址存储中,节点摘要压缩了子对象的描述。抗碰撞性支撑“两个不同结构难以得到同一标识”,但叶节点与内部节点应使用可区分的编码,避免结构歧义。用于承诺时,抗碰撞性可以支撑绑定性;隐藏性仍要由随机性和相应定义另外保证。

使用一个哈希函数前,应说明到底依赖哪条性质:去重是否容许误判、签名是否依赖碰撞困难、认证是否已经有秘密密钥。这比把所有要求统称为“哈希很安全”更具体。

Merkle认证树把这条要求落实为可复算的归约:错误位置值若沿路径得到同一可信根,就在叶或第一个汇合层交出两个不同输入的同一摘要。多重证明共享多条路径的中间计算,稀疏树则把固定键处为空也纳入认证;二者仍需明确可信根与规范编码。

参考资料
关系图谱8 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组