6.2 MD算法家族

每当人们一提到消息摘要算法,就很自然地会联想到MD5和SHA算法。MD5算法是典型的消息摘要算法,是计算机广泛使用的杂凑算法之一(又译摘要算法、散列算法),更是消息摘要算法的首要代表。

6.2.1 简述

MD5算法是典型的消息摘要算法,其前身有MD2、MD3和MD4算法,它由MD4、MD3、MD2算法改进而来。不论是哪一种MD算法,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。如果将这个128位的二进制摘要信息换算成十六进制,可以得到一个32位(每4位二进制数转换为1位十六进制数)的字符串,故我们见到的大部分MD5算法的数字指纹都是3 2位十六进制的字符串,如本文开篇中,MySQL下载页上的数字指纹(MD5:5a077abefee447cbb271e2aa7f6d5a47)就是32位的十六进制串。现在,各大主流计算机语言均支持MD5算法。

虽然,MD5算法漏洞越来越多,已不再安全,但至今我们仍没有看到它的下一版本—MD6算法的出现。或许,同样基于MD4算法改进而来的SHA算法将会是MD系列算法的主要替代者。

让我们一同回顾一下MD算法家族的发展历史。

❑MD2算法

1989年,著名的非对称算法RSA发明人之一—麻省理工学院教授罗纳德·李维斯特(Ronald L.Rivest)开发了MD2算法。这个算法首先对信息进行数据补位,使信息的字节长度是16的倍数。再以一个16位的检验和作为补充信息追加到原信息的末尾。最后根据这个新产生的信息计算出一个128位的散列值,MD2算法由此诞生。

有关MD2算法详情请参见RFC 1319(http://www.ietf.org/rfc/rfc1319.txt)。

❑MD4算法

1990年,罗纳德·李维斯特教授开发出较之MD2算法有着更高安全性的MD4算法。在这个算法中,我们仍需对信息进行数据补位。不同的是,这种补位使其信息的字节长度加上448个字节后能成为512的倍数(信息字节长度mod 512=448)。此外,关于MD4算法的处理与MD2又有很大差别。但最终仍旧是会获得一个128位的散列值。MD4算法对后续消息摘要算法起到了推动作用,许多比较有名的消息摘要算法都是在MD4算法的基础上发展而来的,如MD5、SHA-1、RIPE-MD和HAVAL算法等。

有关MD4算法的详情请参见RFC 1320(http://www.ietf.org/rfc/rfc1320.txt)。

著名开源P2P(Peer-To-Peer,点对点)下载软件EMule(http://www.emule.com)所使用的消息摘要算法正是经过改良后的MD4算法。该算法用于对文件分块后做消息摘要,以验证其文件的完整性。

❑MD5算法

1991年,继MD4算法后,罗纳德·李维斯特教授开发了MD5算法,将MD算法推向成熟。MD5算法经MD2、MD3和MD4算法发展而来,算法复杂程度和安全强度大大提高。但不管是MD2、MD4还是MD5算法,其算法的最终结果均是产生一个128位的消息摘要,这也是MD系列算法的特点。MD5算法执行效率略次于MD4算法,但在安全性方面,MD5算法更胜一筹。随着计算机技术的发展和计算水平的不断提高,MD5算法暴露出来的漏洞也越来越多。MD5算法已不再适合安全要求较高的场合使用。

有关MD5算法的详情请参见RFC 1321(http://www.ietf.org/rfc/rfc1321.txt),其中包含了MD2、MD4和MD5三种算法的C语言版实现。