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. aaaaa

    请问是如何做到的呢

    1. MD5碰撞,文件尾部是不同的,代码里面用条件判断一下尾部

  2. 有没有试过用hash的不同算法, 比如md5加密和SHA-1 , md5一样但是SHA-1是否也完全一样呢? 如果不一样, 百度网盘只需要用两种不同方法摘取, 就能大大降低碰撞的概率

    1. md5、sha不可能做到同时一样。

  3. 佳娃

    这么多年了作者还会回复,佩服佩服

  4. 写了一个简单的文件拷贝。
    拷贝出的文件与源文件打开内容相同,为什么两个文件的MD5不一样,是不是文件创建时间不一样所致的。

    1. FROYO

      md5和文件内容有关,与文件创建时间无关

  5. 佳吾

    可不可以网盘分享一下啊 这个失效了

    1. FROYO

      年头已久,恐怕难找了

  6. 估计百度主要考虑的是效率把,有那么一两个碰撞对他们来说无伤大雅

    1. FROYO

      啊,好几年前的了,应该是的吧

  7. niko

    我还是头一次听说啊...虽然概率很低,但以后还是不能只单单用一种算法了

  8. nf3

    哥连接失效了,能再发一下吗?

  9. test1

    就那个fastcoll_v1.0.0.5.exe 这个工具是吧 我测试时候 比如有一个1.exe 用这个工具生成了2.EXE 3.EXE 2和3 的MD5的确一样 并且也能正常运行 和1 是一样的效果 。但是2和1 的MD5完全不一样 他只是生成了两个相同MD5的 但并没有复制给2.exe 1的MD5 呀 哪来的伪造呢

  10. chunqiu

    :bobo_xieyanxiao: 正打算写一个网盘的程序, 本来打算使用MD5, 那是不是应该使用两种HASH算法, 同时使用MD5和Sha1应该比较保险吧

    1. FROYO

      是滴,再加上文件大小的判断

评论已关闭