MD5算法,是Message-Digest Algorithm version.5的缩写,译为,消息摘要算法。是一种基于“消息摘要”的算法。“消息摘要”(Message Digest)是一种能产生特殊输出格式的算法,这种加密算法的特点是:无论用户输入什么长度的原始数据,经过计算后输出的密文都是固定长度的,这种算法的原理是根据一定的运算规则对原数据进行某种形式的提取,这种提取就是“摘要”,被“摘要”的数据内容与原数据有密切联系,只要原数据稍有改变,输出的“摘要”便完全不同,因此,基于这种原理的算法便能对数据完整性提供较为健全的保障。但是,由于输出的密文是提取原数据经过处理的定长值,所以它已经不能还原为原数据,即消息摘要算法是“不可逆”的,理论上无法通过反向运算取得原数据内容,因此它通常只能被用来做数据完整性验证,而不能作为原数据内容的加密方案使用,否则谁也无法还原。尽管如此,“消息摘要”算法还是为密码学提供了健全的防御体系,因为连专家也无法根据拦截到的密文还原出原来的内容。
是当前公认的强度最高的加密算法。出现在MD5之前的是MD2和MD4,间隔分别只有一年。虽然三者的算法结构多少有点相似,但是由于MD2诞生于8位计算机的时代,因此它的设计与后来出现的MD4、MD5完全不同,因此不能进行简单的替代。然而,无论是MD2、MD4还是MD5,它们都是在获得一个随机长度信息的基础上产生一个128位信息摘要的算法。
MD2算法是Rivest在1989年开发的,它很慢(因为是为8位机器设计的),但相当安全。在这个算法中,首先要对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾,并且根据这个新产生的信息计算出散列值(Hash),最终运算结果即为类似于“d41d8cd98f00b204e9800998ecf8427e”的摘要,而且这个值是唯一的。
为了加强算法的安全性,Rivest在1990年又开发出MD4算法。MD4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度除以512的余数为448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位Merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理,最终生成摘要。
然而MD4存在一个严重漏洞,那就是“冲突”(Collisions)。“冲突”是所有基于“摘要”的算法都要面对的最大问题,由于它们是根据“不完整”的数据内容产生的密文,如果运算过程存在暇癖,就会在处理某些不同数据时产生相同的摘要,这后果可是致命的,因为“摘要”算法的原则是原数据不可还原,因此验证的过程并不同于简单加密运算里的“数据还原匹配”,验证端同样要根据原数据(甚至连原数据都没有,而仅仅是最初保存的摘要)进行运算得到的摘要作为凭据与客户端发来的摘要进行匹配检验,如果两段字符串完全相同,即视为验证通过。这是在“摘要算法”理论上“不可逆且唯一”的基础上采用的安全检验方法,验证方可以不需要索取原数据,而只要拥有一个有效的摘要即可完成对客户端的身份确认,大大减少了原数据被入侵者掌握的几率。
但是这样的验证的方式就产生了一个“看似不可能”的缺陷:假如入侵者能伪造出一段数据,使之能在通过“摘要”计算后产生的摘要与真正的原数据产生的摘要一样,那么入侵者便能冒充原数据持有者通过身份验证。这在理论上是不可能的,然而现实总是不会让人那么愉快,由于算法不可避免的出现了漏洞,使得这个设想成为了事实,这就是“冲突”的来源:某两个或多个数据产生的摘要出现了完全雷同的现象,使得用户能在输入了即使不是原数据的密码后能顺利通过验证,因为身份检验程序发现原本储存的用户信息的签名数据与接收到的数据的运算结果完全一致,于是认为请求方为合法用户,就给予通过了。这种运算结果相同的现象,就是“冲突”。
“冲突”会造成非常危险的后果,因此MD4被无情的抛弃了,取而代之的是在MD4基础上加强了算法的MD5,它在MD4的基础上增加了“安全带”(Safety Belts)的概念,虽然MD5比MD4稍微慢一些,但却大大减小了冲突的发生率,虽然很早以前就有专家发现MD5算法在专门用于寻找“冲突”的机器上平均每24天就会产生一个“冲突”,但是对于一般应用来说,这种几率已经非常低微,因此MD5至今仍然是最强健的加密算法。