MD5是Message DigestAlgorithm MD5的缩写,中午名为消息摘要算法第5版。为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。算法的文件号为RFC1321。其实在生活中也广泛见识过MD5,下载一个文件时,当下载完成之后要进行MD5校验,校验的目的就是去检测下载的文件有没有被篡改,哪怕是动了一个bit位,下载文件的内容生成的MD5校验值跟原文生成的MD5校验值差距是天大的,这取决于MD5校验值的生成算法。

         MD5之前还有MD2、MD4由于在安全性上的原因,最终还是被MD5替换。MD5的用处主要有一下几个场景:

1、数据完整性校验

         检查数据有没有被篡改过,这里取个例子。当用Android手机进行OTA升级的时候,下载完升级包(不管是全升包还是增量包),紧接着就是用该升级包的标准MD5进行验证,如果校验的结果等于标准的MD5值,那么就证明这个升级包没有被篡改过。

2、不可逆的加密

         像Unix系统中,用户用用户名和密码登陆系统,由于系统中存放的是用户名和密码组合MD5校验值,所以登陆框将会把用户名和密码进行MD5算法从而生成用户名和密码组合的MD5校验值,系统由此可以知道能不能登陆成功。

MD5算法解析

         MD5是以512位做为一个单位来处理原文,每一个512位又被分成16*32位来进行处理,直到所有原文都被处理一遍。

1、首先要对原文进行填充,保证数据长度是512个位的整数倍,填充方式如下:

         (原文+ n + 64) %512  = 0

         n:表示需要在原文后面添加多少位,一般添加1个1,或n和0

         64:表示原文的长度

2、MD5算法中,需要初始链接变量,作为算法第一轮运算的基础,它作为MD5算法的初始值,可以想象,就算是同一段原文在进行MD5生成时,只要链接变量不一样,生成的MD5校验值也是不一样的。

         针对这512位为一个分组的数据,处理方式是将它分成16*32位。从程序上来看,主循环有4轮,每一轮对这个16个数字进行处理,这里需要提到4个函数,每一次的处理都是通过这4个函数来完成的。当经过这些循环之后,会生成一个32位的MD5目标校验值。如果采用相同的初始链接变量和4个函数,那么对于同一段原文生成的MD5目标校验值是一样的,所以,MD5就能去检测数据的完整性和一致性。

下面有两种方式实现MD5校验,一种是Java SDK提供的API去生成MD5校验值,另外一种是自己写的MD5校验。在使用时一定要注意链接变量和函数是否一致,避免不一致而导致的MD5失败。