MD5校验并不陌生,它常常被用于文件的一致性校验,在各大下载站都可以看到它的身影。MD5可以为任何文件产生一个同样独一无二的“数字指纹”,如果对文件做了任何改动,哪怕仅仅修改了1字节,其MD5值都会发生变化。正是因此,利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。

突然产生这样一个想法:不同文件也可以有相同的MD5校验值。

MD5校验值的长度是固定的128Bit,其总共有2的128次方种不同的值;而被MD5校验的文件长度却是任意的:可以是1Bit、1KB甚至1GB,也就是说可以有正无穷个不同的文件。用这有限的2的128次方种不同的值去匹配正无穷个文件,结果是必然有重复的。同一个MD5值有多少不同的文件呢?答案一定是正无穷个

相同MD5校验值的文件可以有正无穷个?这有点不可思议了

那岂不是说,我们从某网站下载了一个文件,经检测下载的文件的MD5校验值与网站上提供的一致。即使这样,我们仍然不能保证这个文件就是网站上提供的那个文件,因为还有正无穷个MD5完全一样的文件,或许我们下载到的是另一个文件,只不过其MD5与网站上那个文件一致罢了。

想到这里我有点邪恶了,下载到不同的文件,MD5校验值却相同?

这意味着什么?有没有可能出现这么一种情况:网站上提供的是某杀毒软件下载,而实际下载的却是一个病毒,偏偏他们的MD5校验值是相同的?如果存在这种情况,即使我们检测过MD5的一致性,也难免要中招了。

据说某数字卫士安全软件是通过MD5来判断病毒的,如果真是这样的话某数字安全卫士岂不是要把病毒当作安全软件?

想的很邪恶,那会不会有两个可执行文件,MD5值相同,执行结果却完全不同呢?

亲手制造两个MD5完全相同,但执行结果完全不同的可执行文件

从统计概率上来说,这种情况(存在MD5相同功能不同的两个可执行文件)是一定存在的。但我始终坚信:这只是概率上存在,若要人为做出这么两个可执行文件是不可能的,直到今天,我亲自打破了它。

现在我的C盘中已经有了这么两个文件,分别为1.exe和2.exe,它们的MD5是一样的:6E763063AAE609957DBEF281CAC6EEE4。

SameMD5

这不是简单的文件复制,它们真的是不同的两个文件,只是MD5相同罢了。他们运行的结果是完全不同的:放上两张图片展示其不同的运行结果

SameMD5-1

(这是1.exe)

SameMD5-2

(这是2.exe)

或许,也许,可能还是有点无法接受?但这确实是真实存在的。下面提供这两个文件,实在无法接受可以下载之后自行对比MD5以及运行测试

下载地址:百度网盘(提取码:tewt)

一个小发现,百度云盘(网盘)是通过MD5来判断文件是否相同的:

安装百度云上传插件后,如果上传的文件与百度云已有文件重复,可以“极速秒传”。但百度云是如何判断两个文件重复呢?既然制造出MD5相同的两个不同文件,那不妨上传试一下。先安装好百度云上传插件之后,上传1.exe,然后上传2.exe。正如猜测的那样,上传2.exe时提示“极速秒传”。百度认为2.exe与1.exe是两个一样的文件,这说明百度云的判断标准是MD5校验。

BaiduYunMD5

不该再用MD5作为文件检查的方式了,至少不应该是唯一方式

既然可以人为的做出具有相同MD5校验值的不同程序,那用MD5校验作为文件检查的方式自然不那么可靠了。就像本文开头幻想的那样,下载的病毒程序与安全网站提供的MD5完全相同。

标签: Windows

已有 85 条评论

  1. 那有没有两个不同的字符串md5相同呢?我用他们的十六进制编码检测 md5值不同

    1. FROYO

      这个没有研究过唉,感兴趣的话研究一下吧

  2. lentrody

    现在百度盘的校验据说还会读取一部分文件头

    1. FROYO

      看来变先进了

  3. zw_chen

    我想问问,百度云如果是用md5验证文件,从而让2.exe极速秒传,那么你上传后的2.exe应该不是真正的2.exe而是1.exe?因为极速秒传实际上是没有上传,只是把1.exe显示为2.exe

  4. jack

    我想网盘在上传文件时不仅要检查md5值,还要检查文件的大小等等,的如果有两个文件的md5值相同,但是文件大小也相同,那概率就非常小了,甚至不可能。

    至于你上传的两个程序1.exe,2.ext,我想应该完全是同一个exe,不过这个exe中包含两张图片,首先执行的exe展示一张图片,后面执行的exe展示另一张图片,只要在注册表或文件里建立一个通信的空间就可以了,这就是你说的同md5不同程序?

    1. 诸子百家

      楼主果然强大啊

    2. jack

      好,道歉来了!
      刚才详细了解了md5的被破解状况,并下载了fastcoll试验了一下,确实可以让两个exe的md5相同,但是用beyond compare比对,发现中间有不同部分。

      本人比较无知和贸然,望楼主见谅。

    3. FROYO

      同样大小的、MD5相同的文件有正无穷个
      没有调查就没有发言权,不要动不动就“我想。。。”
      有没有文件操作、注册表操作、是不是完全相同的一个exe、是不是按照顺序展示不同图片、有没有一个通信空间,你完全可以下载之后确认一下
      你的前提都不成立,后面的问题无从谈起

      1. jack

        你说你的两个exe为两个不同的exe唯一依据,就是运行的结果不同,凭这一点说他们不是同一个程序,我不知道你是不是有点缺乏编程常识,这中间通过随机数调用,或变量的变化完全可以做到。

        这种不经思考和推敲的论断,自己被别人骗了也罢了,还误导别人,在这里危言耸听

        1. FROYO

          你在这里的发言基本上全是那种“我想。。。”的猜想,然后在自己猜想的基础上进一步论证错误所在,这样最终只能证明你自己猜想错了
          看的出来,这篇文章你没有好好看,只是揪着一个观点钻牛角尖,毫无实际意义

        2. FROYO

          还有啊,这哪里危言耸听了?

        3. FROYO

          这个程序是我亲自写出来的,过程中没有随机数的产生和使用
          如果我自己写的程序你都认为我“没有经过思考和推敲的论断”,“没有编程常识”,呵呵,你太彪悍了

          1. jack

            那麻烦提供下这两个程序的下载链接
            我想研究下相同大小,相同md5,不同内容的exe文件是怎么练成的。

      2. jack

        我同意“相同md5的文件有无穷多个”这个说法,但是“同样大小md5也相同的文件有无穷多个”这个理论不知道你从哪里得来。
        我刚刚看到另外一个帖子发表跟你一样的内容,我下载了他的两个exe,用winhex比对了一下,完全就是同一个exe,话说你比对过你的两个exe吗,建议你用beyond compare看一下。

        1. FROYO

          版面问题,图片没显示全,右击另存为或者在新窗口中打开

        2. FROYO

          好吧,我仔细研究了一下,同样大小同样MD5的文件不是正无穷个,这有个变量就是文件大小,文件越大重复率越高。MD5有2的128次方种可能性,相当于一个16字节的文件的信息量。如果文件大小是1MB,那么MD5相同的文件有2的65536次方个,如果文件大小是1GB,那么MD5相同的文件有2的67108864次方个。说是正无穷个确实不够严谨,但它也绝对不是不可能。
          最简单的一个办法,直接看CRC32是否相同,如果文件相同,不仅仅是MD5、CRC32校验也应该是相同的,直接用WinRAR就能对比。

  5. 就是制作这两个文件的程序?

    1. FROYO

      有个MD5碰撞器,网上找找吧

  6. 软件能给我发一份不?

    1. FROYO

      给你发一份什么

  7. 目前检验在用SHA1和SHA-256
    部分SHA-512

  8. 清晨

    在王小云公布结果后,MD5可以人为碰撞了,就已经不安全了...
    秒传自然是基于HASH的,不过HASH的家族里里不仅仅有MD5,比如常用的还有SHA-1和CRC32(这个似乎略酱油...)刚刚用这两个文件在115网盘做了测试,在第一个上传完之后,第二个依然是需要上传的。这说明115的上传控件用了至少两种HASH校验...

    1. FROYO

      SHA-1碰撞也公布了,如果能做出一个MD5,SHA-1都相同的不同文件就更厉害了

      1. 清晨

        嗯,是的,病毒作者们就太happy了...
        这说明我们需要更复杂的算法,制作更长的HASH值...

        1. FROYO

          这几年应该会有新算法出现吧

          1. 清晨

            这个得问密码学专家了,不知道这个是不是能跟快做出来。似乎,不容易。

  9. 博主对百度的网盘了解不少的嘛

    1. FROYO

      不是很了解呀。。。

  10. 秒传肯定是检查MD5的

评论已关闭