在实践中忽略SHA冲突的可能性是否安全?
比方说,我们有十亿个独特的图像,每个一兆字节。 我们计算每个文件内容的SHA-256哈希值。 碰撞的可能性取决于:
- 文件的数量
-
单个文件的大小
假设它为零,我们可以忽略这个可能性多大?
通常的答案是这样的:一个stream氓小行星在下一秒崩溃在地球上的可能性是什么,抹杀了我们所知道的文明,并杀死了几十亿人? 可以认为,任何一个低于这个概率的不幸事件都不是非常重要的。
如果我们有一个输出大小为n的“完美”散列函数,并且有p个散列消息(单个消息长度不重要),那么碰撞概率约为p 2/2 n + 1 (这是一个近似值对于“小” p有效,即基本上小于2 n / 2 )。 例如,在SHA-256( n = 256 )和十亿个消息( p = 10 9 )的情况下,概率大约是4.3 * 10 -60 。
平均每3000万年发生一次大规模凶手太空摇滚。 这导致在接下来的一秒钟内发生这样的事件的可能性大约为10-15 。 这比SHA-256碰撞的可能性要大45个数量级。 简而言之,如果你发现SHA-256碰撞可怕,那么你的优先级是错误的。
在安全设置中,攻击者可以select将被散列的消息,然后攻击者可以使用大量十亿条消息; 但是,你会发现攻击者的成功概率仍然是微乎其微的。 这就是使用具有256位输出的散列函数的一个重点:所以可以忽略碰撞风险。
当然,以上所有都假设SHA-256是一个“完美”的哈希函数,这远远没有被certificate。 尽pipe如此,SHA-256似乎相当强大。
碰撞的可能性不取决于文件的大小,只取决于它们的编号。
这是生日悖论的一个例子。 维基百科页面给出了碰撞可能性的估计。 如果你运行这个数字,你会发现所有在地球上生产的硬盘都无法保存足够的1MB文件,以至于SHA-256的冲突率甚至可能达到0.01%。
基本上,你可以简单地忽略这种可能性。
首先, 它不是零,而是非常接近零 。
关键问题是如果实际发生碰撞会发生什么? 如果答案是“核电站将爆炸”,那么你可能不应该忽略碰撞的可能性。 在大多数情况下,后果不是那么糟糕,所以你可以忽略碰撞的可能性。
另外不要忘记,你的软件(或其中的一小部分)可能被部署,并同时用于数以万计的计算机(一些现在几乎无处不在的微型embedded式微型计算机)。 在这种情况下,您需要将估算值乘以尽可能多的份数。