MD5产生碰撞之前有多少个随机元素?


164

我在Amazon S3上有一个图像库。对于每个图像,我在服务器上md5源URL加上时间戳以获取唯一的文件名。由于S3不能有子目录,因此我需要将所有这些图像存储在单个平面文件夹中。

我是否需要担心产生的MD5哈希值发生冲突?

好处:在看到MD5产生的哈希值发生冲突之前,我可以拥有多少个文件?



2
字面上的答案是,第二个文件可能与第一个文件具有相同的MD5。但是,可能性很小。
瑞克·詹姆斯

Answers:


306

只有两个散列意外碰撞的概率为1/2 128 ,其是在340 undecillion 282 decillion 366 nonillion 920千的十六次方938 septillion 463 sextillion 463三次方374万亿6070000亿431十亿7.68亿211000 456 1。

但是,如果保留所有哈希值,则由于生日悖论,发生的可能性会更高。要使任何散列与任何其他散列冲突的可能性为50%,您需要2 64个散列。这意味着,要平均产生碰撞,您需要在100年的时间内每秒散列60 亿个文件


20
“碰撞的概率是1/2 ^ 64” -什么?冲突的可能性取决于已散列的项目数,它不是固定的数。实际上,它等于1 - sPn/s^n,其中s是搜索空间的大小(2^128在这种情况下),n是散列的项目数。您可能会想到的是2^64,这是您需要对MD5进行哈希处理才能产生50%的碰撞几率的大概数量。
BlueRaja-Danny Pflughoeft13年

19
+1是因为我一直想知道如何计算超过999万亿哈哈(哦,是的,您的回答很有
启发性

7
不幸的是,您仍然不正确。您假设哈希函数是真正随机的。它不是。这意味着碰撞概率更高。
约根·

22
约根·福(JørgenFogh):而且所有物理定律也不是正确的。这样的学究主义水平是不必要的,因为它不会以任何有意义的方式改变答案。
Kornel

20
所以你是说有机会!
vargonian '18

27

S3可以具有子目录。只需在键名中输入“ /”,就可以访问文件,就像它们在单独的目录中一样。我使用它根据S3中的用户ID将用户文件存储在单独的文件夹中。

例如:“ mybucket / users / 1234 / somefile.jpg”。它与文件系统中的目录并不完全相同,但是S3 API具有一些使其工作几乎相同的功能。我可以要求它列出所有以“ users / 1234 /”开头的文件,它会向我显示该“目录”中的所有文件。


7
我认为,这应该是一个内容,因为它实际上并未回答有关碰撞可能性的问题
Ian Clark

18

所以,等等:

md5(filename) + timestamp

要么:

md5(filename + timestamp)

如果是前者,那么大多数情况下都是使用GUID的方式,我不会为此担心。如果是后者,则请参阅Karg的帖子,其中介绍了您最终将如何发生碰撞。


1
请详细说明时间戳记如何增加发生碰撞的机会
Brad Thomas

14
@BradThomas:不会。无论是在文件名上还是在文件名+时间戳的组合上,MD5发生碰撞的风险都是相同的。但是在第一种情况下,您将需要同时发生MD5冲突和时间戳冲突。
文森特·休伯特

2
这仍然使每分钟有两个用户发生冲突的机会为2 ^(128 ^ 60)。从字面上看无法使用。
Berry M.

2
@BradThomas要更清楚:md5(filename) + timestamp大大降低了碰撞风险,因为您需要在完全相同的时间戳上发生md5碰撞,才能整体上发生碰撞。md5(filename + timestamp)与相同md5(filename),假设文件名开头是随机的(因为为随机数添加更多随机性只会更改单个md5结果,并且所有md5哈希值仍然存在生日问题)。
robocat


7

尽管随机发生的MD5冲突非常少见,但是如果您的用户可以提供文件(将逐字存储),则他们可以设计发生冲突的过程。也就是说,他们可以故意创建两个具有相同MD5sum但数据不同的文件。确保您的应用程序可以以明智的方式处理这种情况,或者使用更强大的哈希(例如SHA-256)。


使用盐会解决用户工程问题,不是吗?
StackOverflow

这取决于盐的应用方式。它必须是用户提供的数据的前缀,或者更好地是HMAC的密钥。不过,深入练习防御仍然是一个好主意。
bdonlan 2014年

请注意,尽管SHA256的长度为256位,但是您可以通过将SHA256截短为更少的位(例如使用SHA256但将其截断为128位)来权衡与存储密钥长度冲突的风险(甚至比使用MD5还要安全)尽管它们具有相同的位数)。
robocat

5

尽管由于冲突而引起了人们对MD5的广泛关注,但随机数据之间的无意识冲突却极为罕见。另一方面,如果您要在文件名上进行哈希处理,则该数据不是随机数据,并且我希望很快发生冲突。


我对taylors示例的唯一问题是,如果有人获得了您数据库的副本,他们可能会使用彩虹表来找出信用卡号……
Sam Saffron

1
虽然我不会选择将MD5用于信用卡,但是彩虹表中的所有有效信用卡号介于10,000,000(8位数是我所见过的最小长度的信用卡)和9,999,999,999,999,999(最大的16位数)之间表生成。窃取这些号码可能有更简单的方法。
2009年

1

可能性有多大都不重要;有可能的。散列的前两件事可能会发生这种情况(极不可能,但有可能),因此您需要从一开始就支持冲突。


36
当然,可能还会发生其他许多坏事,发生概率为1/2 ^ 128。您可能不想单单担心这一点。
威尔·迪恩

2
这里可能发生的最糟糕的事情是您可以拍照。对于相对较小的数字,我不会担心。现在,如果您的软件正在控制着自动驾驶飞机降落的飞机,那就是另一回事了。
Jim C

9
你不能当真 您需要每秒散列60亿个文件,并持续100年才能每秒散列一次,以获得很好的碰撞机会。即使您非常不幸,使用S3所花费的全部时间可能要比人类寿命更长。
Kornel

12
数据库及其备份全部失败的可能性要高出数十亿倍。碰撞不值得担心。
Artelius

5
用防撞时间建造一个掩体来放置服务器!那些讨厌的流星可能会打到您(非常不可能,但可能),因此您需要从乞讨中支持流星避难所。
polvoazul

1

MD5碰撞极不可能。如果你有90000个亿 MD5s,存在只有一个机会九万亿会有冲突。


1
其他许多答案都谈到添加一个项目时发生碰撞的可能性。我认为我的答案更有用,因为它讨论了整个表中可能有重复的内容。
里克·詹姆斯

1
这与MD5无关,不正确。这就像在说,如果您有9万亿只猫,那么在9万亿只猫中,其他人拥有同一只猫的几率为1。这里的关键问题是,您可以获得具有多个值的相同散列。
Joonas Alhonen

@JoonasAlhonen-是的,是的。许多穷人以此为借口购买他们负担不起的另一张彩票。
瑞克·詹姆斯

谢谢,这实际上是一个非常有用的统计信息。插入9万亿个项目时发生碰撞的几率。谢谢。
Tom P.
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.