在实践中忽略SHA碰撞的可能性是否安全?


209

假设我们有十亿个唯一的图像,每个图像一兆字节。我们为每个文件的内容计算SHA-256哈希。碰撞的可能性取决于:

  • 文件数
  • 单个文件的大小

假设可能性为零,我们可以忽略多远?


1
这取决于您使用哈希键的目的。如果是某种文件标识,那么冲突也可能意味着文件相同,因此在发生冲突的情况下也需要比较文件。我会说比较文件大小是相当安全的。
mojuba 2010年

是的,在这种情况下,如果您比较文件大小,则可能性会大大降低。您还可以使用两种哈希算法并连接结果。然后,两者同时碰撞的可能性进一步降低。但是,问题是,“相当”安全多少?也许我们需要一个公式和数字。
赫里斯托(Hristo Hristov)2010年

2
@Hristo Hristov:如果我们假设哈希密钥是一个伪随机数(理论上是正确的),那么十亿个128位密钥给出的碰撞概率为2.9 * 10 ^ -30。您甚至不能称其为“微不足道的”,比它还小;)
mojuba 2010年

3
@mojuba:甚至更好,他正在询问256位哈希。
Michael Borgwardt 2010年

FWIW:GIT版本控制系统通过文件的内容SHA识别文件。
2010年

Answers:


385

因此,通常的答案是:流氓小行星在下一秒钟内撞向地球,摧毁我们所知道的文明并杀死数十亿人的概率是多少?可以说,任何不幸的事件的概率实际上都不太重要。

如果我们有与输出尺寸的“完美”的散列函数Ñ,我们有p消息散列(单独的消息长度是不重要的),则碰撞的可能性为大约p 2 /2 n + 1个(这是一个近似值,其是对于“小” p有效,即实质上小于2 n / 2)。例如,对于SHA-256(n = 256)和十亿条消息(p = 10 9),则概率约为4.3 * 10 -60

大规模杀人犯的太空岩石平均每三千万年发生一次。这导致在下一秒至大约10 -15发生此类事件的可能性。这是45个比SHA-256的碰撞更可能的订单。简而言之,如果您发现SHA-256冲突令人恐惧,那么您​​的优先级是错误的。

在安全设置中,攻击者可以选择将被散列的消息,然后,攻击者可能会使用超过十亿条消息。但是,您会发现攻击者的成功概率仍然很小。这就是使用具有256位输出的哈希函数的全部要点:这样可以避免发生冲突的风险。

当然,以上所有假设均假定SHA-256是“完美的”哈希函数,远未得到证实。尽管如此,SHA-256似乎仍然很健壮。


12
这是一个很好的答案,谢谢!但是,如果在发生碰撞的情况下核电厂爆炸,而这取决于您,您是否会冒险?如果您完全正确,那么我们可以冒险,因为文明被破坏的可能性要高45个数量级。对?
赫里斯托(Hristo Hristov)2010年

46
@Hristo我想是的,有人会冒险的。核电厂由于其他原因而发生爆炸的机率高得多,例如机械故障,建造它的人为失误或运行过程中的操作员失误,而我们已经抓住了这些机会。如果SHA-256碰撞是造成核事故的唯一原因,那么到目前为止,几乎可以肯定的是,核事故只有零。
罗曼·斯塔科夫


37
我现在可以放心了,因为我很可能会在经历SHA-256碰撞之前很久就被小行星摧毁。
AaronLS 2013年

10
抱歉,缺少所谓的“生日悖论”。更好地看一下“漂亮的桌子”,它不符合您的想法。对于我在该表中给出的数字,在标记为“ 4.3 * 10 ^ -60”的列和“ 128位”的行中,其值为“ 10 ^ 9”(但该表不会低于10 ^ -18 )。
Thomas Pornin 2014年

47

发生冲突的可能性并不取决于文件的大小,而仅取决于文件的数量。

这是生日悖论的一个例子。Wikipedia页面提供了碰撞可能性的估计。如果运行这些数字,您会发现地球上生产的所有硬盘都无法容纳足够的1MB文件,因此SHA-256发生冲突的可能性甚至为0.01%。

基本上,您可以简单地忽略这种可能性。


5
我不同意这个结论。是的,没有任何强制性工具可以存储该数量的文件,但是IMO会误解这种情况。只需要两个文件即可产生冲突。尽管可能性很小,但仍然可能发生。
sharptooth 2010年

11
@sharptooth:不,我不是在歪曲事实。您和您认识的每个人在同一天死于交通事故的可能性很小,但仍可能发生(并且比SHA-256碰撞要高得多)。但是您忽略了这种可能性。
Michael Borgwardt 2010年

11
@sharptooth:我是在谈论数百人同时发生的单独道路交通事故。您真的不能采取任何措施降低这一水平。这已经没有意义了,因为它已经非常低了。但是与SHA-256碰撞相比,可能性仍然很大,您甚至无法想象有多少。这与托马斯提出的论点相同。
Michael Borgwardt 2010年

12
@sharptooth:不,机会不会显着增加,因为SHA-256哈希空间的大小仍绝对使这个数字相形见.。这是您没有适当考虑的一件事-所有因素都必须按其实际大小加权,而不是相等。如果您为地球上的每个人每秒产生10亿个哈希,并且这样做一千年,那么您发生碰撞的机会仍然不到1%。
Michael Borgwardt 2010年

3
如果你不检查每一个未修正错误的可能性从存储器中取出或从磁盘读取(其中有一个远远比SHA-256的碰撞概率更高),你可能不完全理解概率。
Christophe

17

首先,它不是零,而是非常接近零

关键问题是如果实际发生碰撞会发生什么?如果答案是“核电站将爆炸”,那么您可能不应该忽略碰撞的可能性。在大多数情况下,后果并不那么可怕,因此您可以忽略碰撞的可能性。

同样不要忘记,您的软件(或软件的一小部分)可能已在数百万台计算机(当今几乎随处可见的一些小型嵌入式微型计算机)中部署并同时使用。在这种情况下,您需要将获得的估计值乘以最大可能的份数。


...不是按副本数,而是按所有副本摘要的数据集数。
Andreas Spindler

1
这是错误的,正在运行的软件副本数无关紧要。唯一重要的是要处理的唯一文件数,而生日悖论是计算的数学公式。
Dirk Bester

1
我听到其他人提到硬件故障的可能性(即,由于辐射等原因导致的某个地方发生翻转)比散列冲突更有可能,因此,担心散列冲突很愚蠢。就个人而言,为了安全起见,我会尝试涵盖这两种情况(核电厂的安全性越好越好),但是在潜在危险列表中,哈希冲突可能会非常低(假设哈希空间足够大) 。但是,所有这些都假定在哈希函数中没有某些隐藏行为会更频繁地导致冲突。
克里斯·米德尔顿


@GreenTree您链接到的东西是关于故意制造碰撞的。
Sharptooth'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.