什么是 Hash Collision?
Hash Collision 是指两个不同的输入产生完全相同的哈希输出。想象两把不同的钥匙却能打开同一个数字锁。很少见,但如果在不安全的算法上发生,会引发严重问题。
“如果存在一次碰撞,一切都被破坏。”并非如此。强健的算法设计让任何实际发生的 Hash Collision 极为不可能,现代系统还设有多重防护,单个问题不会导致整个系统崩溃。
Hash Collision 的工作原理
可以把哈希看作大数据的小标签。下面是从输入到出错的简要流程。
- 输入:你从任意消息、文件或交易开始。
- 哈希:一个属于 加密哈希函数 家族的函数把该输入变成固定长度的字符串。
- 冲突:由于输出有限而输入无限,不同的两个输入可能映射到相同的输出。
- 攻击:严重的威胁在于有人能够有目的地构造出两种会发生碰撞的不同输入,之后将其中之一替换为另一个。
- 防护:优秀的算法使得该搜索在计算上耗费极大,所以随机猜测既耗时又昂贵。
是的,就是这个意思。
为什么 Hash Collision 很重要
为什么你要关心数学与代码中这个不常被注意的角落?
- 好处:强抗性能保持你的数据标签唯一,这就减少了被欺骗的可能。
- 视角:碰撞会威胁到诸如 区块链技术、软件更新和文件校验等的完整性。
- 相关性:你会在钱包、交易所、证明机制和依赖哈希相等性的审计工具中遇到它。
如果有这样的选择,优先采用像 双重哈希 这类叠加防护的方案,并坚持使用经过广泛审查且输出较长的算法。
Hash Collision 的主要特征
是什么让这一现象特殊并值得记住:
- 不可避免:在输出有限而输入无限的情况下,根据鸽巢原理,总会有一对产生碰撞。
- 困难:对于现代哈希,刻意寻找碰撞在计算上被设计为异常艰巨。
- 签名:许多 数字签名 对哈希进行签名,因此抗碰撞性可保护签名者免受调包式欺骗。
如何计算 Hash Collision?
可以用生日悖论的思路来估算所需工作量。对于 k 位哈希,达到大约 50% 碰撞概率所需的随机尝试次数约等于 2^k 的平方根乘以约 1.177。
n_fifty_percent ≈ 1.1774 * sqrt(2^k) 示例:当 k 等于 256 时,所需尝试次数极其巨大,这就是为什么用暴力破解去寻找碰撞不可能在短时间内完成。
变体
在研究和攻击中会出现不同的变种:
- 碰撞:任意两个不同的输入具有相同的哈希。
- 第二碰撞:已知一个输入,找到另一个与之哈希相同的输入。
- 前像:已知哈希,找到任意映射到该哈希的输入。
- 前缀:选择前缀碰撞指的是构造出两个以不同选定起始内容开头但最终哈希相同的消息。
SHA256 目前没有公开的、可行的碰撞。如果有人声称找到碰撞,应在惊慌或庆祝之前等待广泛的同行评审和检测结果。
示例
如果攻击者能够制造两个具有相同 txid 的不同交易,他们可能在你签名后通过替换其一来尝试 双重支付 的把戏。
趣闻
几十年前就已展示出 MD5 碰撞,SHAttered 项目公开展示了一个 SHA1 碰撞,使用两个不同的 PDF 文件,这一事件促使业界弃用它。
总结
简而言之,Hash Collision 是两个不同输入共享同一个数字指纹的罕见情况,现代密码学在努力防止这类情况超出轶事层面。
