MD5算法概述
MD5信息摘要算法(MD5, Message-Digest Algorithm)是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在RFC 1321标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
1992年8月,罗纳德·李维斯特向互联网工程任务组(IETF)提交了一份重要文件,描述了这种算法的原理。这种算法的公开性和安全性很好,在20世纪90年代被广泛使用在各种程序语言中,以确保资料传递无误等。MD5由MD4、MD3、MD2改进而来,主要增强算法复杂度和不可逆性。MD5算法因其普遍、稳定、快速的特点广泛应用于普通数据的加密保护领域。(注意,是普通数据。)
MD5算法的特点
MD5算法具有以下3个特点:
(1)输入任意长度的信息,经过处理,输出为128位的信息(数字指纹)。
(2)不同的输入得到不同的结果(唯一性)。
(3)根据128位的输出结果不可能反推出输入的信息(不可逆)。
MD5是否属于加密算法
有些文献或资料会提到MD5加密这样的说法。目前,业界有两派:一派认为是加密算法,一派不认为是加密算法。认为不属于加密算法的人觉得不能从密文(散列值)反过来得到原文,即没有解密算法,所以MD5只能属于摘要算法,不能称为加密算法;认为属于加密算法的人觉得经过MD5处理后看不到原文,即已经将原文加密了,所以MD5属于加密算法。
既然有了新称呼“摘要算法”,那就用摘要算法好了,没必要再去套加密的概念,因为说到加密,通常都会自然而然想到解密,既然摘要算法没有解密,就没必要去和加密这个概念混淆了。一个摘要算法就能讲清楚该算法的本质,即不可逆。
搞密码学的人应该用词严谨,加密就是加密,摘要就是摘要,没必要混为一谈。如果称MD5是加密算法,那么“摘要算法”又有何意义呢?
MD5用途
(1)防止被篡改
假设发送一个电子文档前先得到MD5的输出结果a,然后在对方收到电子文档后也得到一个MD5的输出结果b。如果a与b一样,就代表中途未被篡改。为了防止不法分子在安装程序中添加木马,可以在网站上公布由安装文件得到的MD5输出结果。SVN在检测文件是否在CheckOut后被修改过,也用到了MD5。
(2)防止直接看到明文
现在很多网站在数据库存储用户的密码时都是存储用户密码的MD5值,这样就算不法分子得到数据库的用户密码MD5值,也无法知道用户的密码。其实这样是不安全的,比如在UNIX系统中用户的密码就是以MD5(或其他类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码时就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且在一定程度上增加了密码被破解的难度。