MD5是否仍然足以唯一识别文件?

Ran*_*ray 134 hash md5

MD5散列文件仍然被认为是一个足够好的方法来唯一地识别它,因为MD5算法的所有破坏和安全问题等?安全性不是我的主要关注点,但唯一标识每个文件的是.

有什么想法吗?

Mar*_*tos 87

是.从安全角度来看,MD5已完全被打破,但意外碰撞的可能性仍然很小.请确保文件不是由您不信任的人创建的,并且可能具有恶意意图.

  • @ 0xA3:你和我都不知道OP指的是什么文件,或者折衷会造成多大的损害.我们所知道的可能是他们孩子的宝贝照片集.我的目标是提供事实; 别人对他们的所作所为是他们的事.还要考虑Bruce Schneier [推荐](http://www.schneier.com/blog/archives/2005/06/write_down_your.html)写下你的密码; 并非所有东西都需要存放在诺克斯堡.有些东西会在花盆下保持良好状态. (9认同)
  • 我非常不同意.不同的哈希值表示文件不同.但是对于一个相等的哈希值:如果哈希是相同的,你不能说"它们很可能都是相同的":你只能逐字节地进行比较.散列比整个文件的不同值的数量小****,因此每个散列值存在许多很多可能的冲突.只有在你复制已知文件(使用已知哈希)的情况下,相同的哈希值"可能意味着"第二个被正确复制(即便如此,它不是100%肯定,但极有可能). (5认同)
  • @Marcelo Cantos,我认为这里缺少的是对"安全"一词的区分或解开.显然,人们对任何校验和工作都采用"安全",但Marcelo的术语可能意味着"在实验室中". (3认同)
  • 好吧,我的数学很烂。GUID 大约有 122 位的熵,因此十亿个文件中任何地方发生冲突的概率约为 2^(2*30 - 122) = 2^-62。虽然这比我最初的计算要高得多,但仍然很小,大约为四分之一。 (3认同)
  • @none:关于第一个问题,请参阅[此处](http://en.wikipedia.org/wiki/MD5#Security).我害怕我不理解其他问题. (2认同)

sta*_*auf 31

出于实际目的,所创建的散列可能是适当随机的,但理论上由于Pigeonhole原则总是存在碰撞的概率.拥有不同的哈希值肯定意味着文件不同,但获取相同的哈希值并不一定意味着文件是相同的.

因此,为此目的使用哈希函数 - 无论是否考虑安全性 - 都应该始终只是检查的第一步,特别是如果已知哈希算法容易产生冲突.要可靠地确定具有相同散列的两个文件是否不同,您必须逐字节地比较这些文件.

  • @Ranhiru.不会.哈希为您提供一个"摘要"值(对于MD5)只有16个字节长.为了*保证*文件是相同的,您需要逐字节检查.无论您选择何种哈希算法,都是如此,总是存在碰撞的可能性. (16认同)
  • @Marcelo.它不符合逻辑推理,意外碰撞比偶然的位翻转更少*(同时进行逐字节比较).在构建哈希时,你仍然有同样的位翻转机会(并且可以说更多,因为涉及更多的处理时间).@Thomas最初提出的观点是,没有保证识别唯一性的方法,尽管位翻转的影响是值得商榷的.最悲观的估计是每GB /小时翻转1次,ECC RAM甚至可以删除. (8认同)
  • 这个答案是对的.防止篡改和验证唯一性是一回事.此外,虽然散列不保证唯一性,但实际比较也不是.实际上,散列意外碰撞的可能性实际上低于由于正常太阳能伽马射线发射产生的CPU中的毛刺而导致比较失败的可能性.并且不要忘记,文件的唯一来源通常位于Web服务器内的世界的另一端,并且您用于比较目的的唯一独立信息是哈希. (7认同)
  • @Ranhiru.重读这个答案,它的imho是最全面的答案.Hashing可以作为第一步使用,它可以确保文件完全相同,但是如果你想要*绝对100%*,那么你需要逐字节检查.无论您使用MD5,SHA还是任何其他算法,都是如此. (6认同)
  • "哈希意外碰撞的可能性实际上低于由于正常太阳伽马射线发射产生的CPU中的故障而导致比较失败的可能性"[引证需要] (2认同)
  • @endolith https://en.wikipedia.org/wiki/Cosmic_ray#Effect_on_electronics 引用了每 256 MB 月的一次翻转。每 2^52 位每秒翻转 1 次。假设没有恶意,每 2^128 次比较中就会发生一次虚假的成对 MD5 碰撞。我承认“伽马射线”可能是错误的。它更有可能是β粒子。 (2认同)

Tho*_*nin 19

如果没有对手,MD5就足够了.但是,有人可以(故意)创建两个不同的文件,这些文件散列到相同的值(称为冲突),这可能是也可能不是问题,具体取决于您的具体情况.

由于知道已知的MD5弱点是否适用于给定的上下文是一个微妙的问题,因此建议不要使用MD5.使用抗冲突哈希函数(SHA-256或SHA-512)是安全的答案.此外,使用MD5是糟糕的公共关系(如果你使用MD5,准备必须证明你自己;而没有人会质疑你使用SHA-256).

  • 实际上,由于宇宙射线翻转一点,字节到字节的比较可能会失败(例如,将`return 0;`转换为`return 1;`).这种可能性极小,但与SHA-256发生冲突的风险甚至更小.在数学上,你不能确定散列到相同值的两个文件是相同的,但是只要你使用计算机进行比较,你就不能通过比较文件本身来确定这一点.我的意思是,超过99.999 .... 9%的确定性是没有意义的,SHA-256已经提供了更多. (7认同)
  • 如果读者不太熟悉散列,这个答案可能会有点误导.没有什么神奇的SHA可以防止*哈希冲突,它们更能抵抗哈希冲突*攻击*.如果你想要超过99.999 ^ e%确定文件是相同的,你仍然需要逐字节检查. (2认同)
  • 什么,你不使用ECC内存?).好评,非常有趣的想法. (2认同)

afi*_*ina 9

md5可以产生碰撞.从理论上讲,虽然不太可能,但连续一百万个文件可以产生相同的哈希值.在存储值之前,不要测试你的运气并检查md5碰撞.

我个人喜欢创建随机字符串的md5,这减少了散列大文件的开销.当发现冲突时,我迭代并重新散列附加的循环计数器.

您可以阅读鸽子原则.


tac*_*ach 6

我不推荐它.如果应用程序可以在多用户系统上运行,那么可能有用户,这将有两个具有相同md5哈希的文件(他可能是工程师并使用这些文件,或者只是好奇 - 可以从http:/轻松下载它们/www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html,我自己在写这个答案时下载了两个样本).另一件事是,某些应用程序可能出于任何原因存储此类重复项(我不确定,如果有任何此类应用程序但存在可能性).

如果您唯一地识别程序生成的文件,我会说可以使用MD5.否则,我会推荐任何其他没有冲突的哈希函数.