MD5校验判断文件是否一样

MD5校验并不陌生,它常常被用于文件的一致性校验,在各大下载站都可以看到它的身影。

MD5校验(checksum)是通过对接收的传输数据执行散列运算来检查数据的正确性。

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

MD5校验原理

  • 一个散列函数,比如 MD5,是一个将任意长度的数据字符串转化成短的固定长度的值的单向操作。任意两个字符串不应有相同的散列值(即,有“很大可能”是不一样的,并且要人为地创造出来两个散列值相同的字符串应该是困难的)。
  • 一个 MD5 校验和checksum)通过对接收的传输数据执行散列运算来检查数据的正确性。计算出的散列值拿来和随数据传输的散列值比较。如果两个值相同,说明传输的数据完整无误、没有被窜改过(前提是散列值没有被窜改),从而可以放心使用。

MD5校验可以应用多个领域,比如说机密资料的检验,下载文件的检验,明文密码的加密等。

MD5校验原理举例

如客户往我们数据中心同步一个文件,该文件使用MD5校验,那么客户在发送文件的同时会再发一个存有校验码的文件,我们拿到该文件后做MD5运算,得到的计算结果与客户发送的校验码相比较,如果一致则认为客户发送的文件没有出错,否则认为文件出错需要重新发送。

有没有两个完全不一样的文件,但是他们的md5值是一样的?

首先答案是肯定的。

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

数据有意义的话就比较难找碰撞,数据没有意义的话按照上述的理论,碰撞的概率会比较大。

因此,md5保证给定一个文件f1,找到一个不同的文件f2使其md5与f1的相同是相对困难的,这就保证了md5可以用被用于比如判断文件完整性。