md5的全称是message-digest algorithm 5(信息-摘要算法),在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向32位的电脑。这三个算法的描述和c语言源代码在internet rfcs 1321中有详细的描述(h++p://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由ronald l. rivest在1992年8月向ieft提交。
rivest在1989年开发出md2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,rogier和chauvaud发现如果忽略了检验和将产生md2冲突。md2算法的加密后结果是唯一的--既没有重复。
为了加强算法的安全性,rivest在1990年又开发出md4算法。md4算法同样需要填补信息以确保信息的字节长度加上448后能被512整除(信息字节长度mod 512 = 448)。然后,一个以64位二进制表示的信息的最初长度被添加进来。信息被处理成512位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。den boer和bosselaers以及其他人很快的发现了攻击md4版本中第一步和第三步的漏洞。dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到md4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,md4就此被淘汰掉了。
尽管md4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了md5以外,其中比较有名的还有sha-1、ripe-md以及haval等。
一年以后,即1991年,rivest开发出技术上更为趋近成熟的md5算法。它在md4的基础上增加了"安全-带子"(safety-belts)的概念。虽然md5比md4稍微慢一些,但却更为安全。这个算法很明显的由四个和md4设计有少许不同的步骤组成。在md5算法中,信息-摘要的大小和填充的必要条件与md4完全相同。den boer和bosselaers曾发现md5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。
van oorschot和wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索md5冲突的机器(这台机器在1994年的制造成本大约是一百万美元)可以平均每24天就找到一个冲突。但单从1991年到2001年这10年间,竟没有出现替代md5算法的md6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响md5的安全性。上面所有这些都不足以成为md5的在实际应用中的问题。并且,由于md5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,md5也不失为一种非常优秀的中间技术),md5怎么都应该算得上是非常安全的了。
什么是MD5?——MD5之我见2009/01/14 03:04MD5的全称为Message Digest Algorithm 5(即信息摘要算法第五版),这个概念十分抽象,而且又不太好理解,其实,MD5说白了就是平时我们所说的文件条形码,简称文件条码。就像商品一样,每个商品都有各自的条形码一样,不同的商品有不同的条形码,同样,对于软件产品(或文件)来说,不同的文件,其文件条形码也不尽相同。可以说,文件条码是文件固有属性之一,就像文件名,文件大小,修改日期等等一样。
MD5的特点
MD5具有哪些特点呢?首先,MD5的唯一性强,能唯一标识一个文件。我们知道商品的条形码是没有重复的,同样,不同的文件也应该有不同的条形码,也就是说,若文件的内容或长度稍有变化,则其文件条码一定会发生巨大的改变。其次,MD5所关注的仅仅是文件的内容本身,而与文件名等其他信息无关,就好比我们到店里买东西一样,外包装不同的物品,但只要其条形码完全一致,我们就可以认定这两样东西是同一产品。
MD5的实质
MD5从本质上来说,他就是一个函数,由于其采用散列算法,所以又称为散列函数,所谓散列,简单地说就是我们前面所提到的唯一性,散列性越高,唯一性越强,发生冲突的几率也就越低。若写成数学函数模型就是y=f(x),其中,x代表的是文件内容,f表示MD5散列函数,而y就是该散列函数的计算结果,也就是平时我们常说的MD5值。回顾计算机函数的基本性质,对于计算机函数来说,一个输入x只能对应一个输出y,而一个输出y可以对应无数个输入x,由此可见,MD5同样也是有一定的冲突的,故而MD5函数具有不可逆性,即无法通过对MD5值反算得到原文件内容,因此,MD5时常也被用作加密用。
早期的文件条码用的是CRC或CRC32,由于其算法快捷,且唯一性高,因此被广泛用于计算机文件的快速校验中,进而成为第一代文件条码,随着软件的规模不断扩大,文件数量的不断巨增,长度仅有8位数的CRC远不能胜任,于是第二代文件条码诞生了,这便是MD5,他具有32位数,能唯一标识更多的文件,虽说在算法速度上稍逊于CRC,但其数位长,唯一性高,最主要就是其源代码在网上是公开发表的,可以很容易地得到并集成到现有的任意程序中,故而受到广大网友的青睐,因此我认为,在不久的将来MD5很有可能成为文件条码的行业标准。
MD5的应用
MD5最早开发的初衷就是用于密码加密的,但后来据说被中国的某个王教授给破解了,故而其加密价值就没有了。现在的MD5最大的作用便是前面我们提到的文件识别。在此,我想先举个生活中的例子,以前我们到超市里买东西,由于那时候超市的发展才刚起步,东西不多,所以买东西时,只要看一下商品名称以及所对应的价格就可直接去付账了,而现在却不行了,超市里的东西越来越多,东西随处乱放,若还像以前一样只看商品名称就决定买下来的话是不行的,若不看条形码很是难保证你买的东西和你看到的价格是一致的,我就上过好几回当,买错东西,现在学聪明了,买东西前要看条形码,不看商品名。现在回过来,我们继续说文件,例如,平时我们经常喜欢在网上下载一些东西,在以前,若从网上下载一个文件,我们往往只能看到其文件名,没有条形码,某些好点的网站最多还给你看一些文件大小,但不具体如几MB,随后我们便下载了,然后隔几天又在其他网站上看到另一个相似的“更好的”文件,然后也把它给下了,下好以后才发现原来这两个文件其实是一样的,这才大呼上当,文件小点倒无所谓,如果文件很大,动则数G,若下了两份一样的文件,光财力上不说,你时间精力要花费多少呢?而现在的下载,如果有MD5或文件条形码在的话,我们通过比较它们的条形码,便可以知道这是否为同一软件产品,以免再次重复下载,造成不必要的损失。当然,MD5还有其他许多用处,这里就不说了。
当然,有的网站还是用CRC作为条码,或使用SHA1,一个和MD5差不多的散列函数,但其代码很难弄到,没有权威发布网站,故而用的不是很广泛。更有甚者,有的网站还有自己的散列函数,像eMule等,那仅仅只是特例,而网上我看得最多便是MD5,由于其源代码通俗易懂,所以我大胆预测,其成为行业标准的可能性很高。
信息摘要简要地描述了一份较长的信息或文件,它可以被看作一份长文件的“数字指纹”。信息摘要用于创建数字签名,对于特定的文件而言,信息摘要是唯一的。信息摘要可以被公开,它不会透露相应文件的任何内容。 MD2,MD4和MD5(MD表示信息摘要)是由Ron Rivest 设计的专门用于加密处理的,并被广泛使用的HASH函数,它们产生一种128位信息摘要,除彻底地搜寻外,没有更快的方法对其加以攻击,而其搜索时间一般需要1025年之久。