我在 Amazon S3上有一个图像库。对于每个图像,我在我的服务器上 md5源 URL 加上一个时间戳,以获得一个唯一的文件名。由于 S3不能有子目录,我需要将所有这些图像存储在一个单一的平面文件夹中。
我是否需要担心生成的 MD5散列值中的冲突?
奖励: 在 MD5生成的散列值中出现冲突之前,我能有多少个文件?
这种可能性有多大并不重要,它是有可能的。它可能发生在您散列的前两件事情上(非常不可能,但是有可能) ,因此您需要从一开始就支持冲突。
碰撞的一个粗略的经验法则是值范围的平方根。您的 MD5签名大概是128位长,所以您可能会看到超过2 ^ 64图像的碰撞。
S3可以有子目录。只要在键名中输入一个“/”,您就可以访问这些文件,就好像它们在不同的目录中一样。我使用它根据用户在 S3中的 ID 将用户文件存储在单独的文件夹中。
例如: “ mybucket/users/1234/somfile.jpg”。它与文件系统中的目录并不完全相同,但是 S3API 具有一些特性,使它能够几乎相同地工作。我可以让它列出所有以“ users/1234/”开头的文件,它会显示“目录”中的所有文件。
等等,是这样吗:
md5(filename) + timestamp
或:
md5(filename + timestamp)
如果是前者,那么您就是 GUID 的最佳选择,我不会为此担心。 如果是后者,那么请看 Karg 关于最终将如何碰撞的帖子。
虽然由于碰撞,MD5存在一些广为人知的问题,但随机数据之间的无意碰撞是 非常罕见。另一方面,如果您对文件名进行哈希处理,那就不是随机数据,而且我预计会很快发生冲突。
仅仅两个散列意外碰撞的概率是 1/2 < sup > 128 也就是1/340十亿分之二百八十二亿分之三百六十六亿分之九百二十八亿分之九百三十八亿分之九百三十八亿分之四百六十三亿分之四百六十三亿分之四百六十三亿分之三百七十四千万亿分之六百零七万亿分之四百三十一亿分之七百六十八万分之二十一万一千四百五十六。
然而,如果你保持所有的哈希,那么概率是有点高,由于 生日问题。要有一个50% 的机会任何散列碰撞任何其他散列你需要 2 < sup > 64 散列。这意味着要获得冲突,平均而言,您需要散列 100年来,每秒钟数十亿份文件。
虽然随机的 MD5冲突非常罕见,但是如果您的用户可以提供文件(将逐字存储) ,那么他们就可以设计发生冲突。也就是说,它们可以故意创建两个具有相同 MD5sum 但不同数据的文件。确保您的应用程序能够以合理的方式处理这种情况,或者使用更强大的散列(如 SHA-256)。
MD5碰撞是极不可能的。如果你有 9万亿 MD5,在 9万亿中只有一次碰撞的机会。