一、什么是 MD5

MD5(Message-Digest Algorithm 5) 是罗纳德·李维斯特(RSA 加密算法的发明者,获得 2002 年图灵奖)发明的一种消息摘要算法

其在 MD4 的基础上增加了安全-带子(safety-belts)的概念。虽然 MD5MD4 稍微慢一些,但却更为安全。这个算法由四个和 MD4 设计有少许不同的步骤组成。在 MD5 算法中,信息-摘要的大小和填充的必要条件与 MD4 完全相同。den boerbosselaers 曾发现 MD5 算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。van oorschotwiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索 MD5 冲突的机器(这台机器在 1994 年的制造成本大约是一百万美元)可以平均每 24 天就找到一个冲突。但单从 1991 年到 2001 年这 10 年间,竟没有出现替代 MD5 算法的 MD6 或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响 MD5 的安全性。并且,由于 MD5 算法的使用不需要支付任何版权费用,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,MD5 也不失为一种非常优秀的中间技术),MD5 怎么都应该算得上是非常安全的了。

二、MD5 的应用

2.1 一致性认证与数字签名

MD5 将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生一个唯一的 MD5 信息摘要。在以后传播这个文件的过程中,无论文件的内容发生了什么形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要对这个文件重新计算 MD5 时就会发现信息摘要不相同,由此可以确定得到的是一个不正确的文件。另外,MD5 可以有效防止文本版权被篡改,这就是所谓的数字签名MD5 在论坛上、软件发布时经常使用,软件作者往往会事先计算出程序的 MD5 值并贴在网上。因此,在网上看到某个程序下载旁注明了 MD5 值时,可以把它记下来,下载后计算该文件的 MD5 值,并与之前记下的 MD5 值比较。如果两者相同,那么下载的文件没毛病;如果不匹配,则该文件不完整,或是被别人动过手脚。

2.2 安全访问认证

MD5 还广泛用于加密和解密技术上。比如在 unix 系统中用户的密码就是以 MD5 (或其它类似的算法)经加密后存储在文件系统中的。当用户登录的时候,系统把用户输入的密码计算成 MD5 值,然后再去和保存在文件系统中的 MD5 值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为跑字典的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用 MD5 程序计算出这些字典项的 MD5 值,然后再用目标的 MD5 值在这个字典中检索。我们假设密码的最大长度为 8 bytes,同时密码只能是字母和数字,共 26+26+10=62 个字符,排列组合出的字典的项数则是 p(62,1)+p(62,2)….+p(62,8),那也已经是一个天文数字了,存储这个字典就需要 TB 级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码 MD5 值的情况下才可以。这种加密技术被广泛的应用于 unix 系统中,这也是 unix 系统比一般操作系统更为坚固一个重要原因。

SHA1CRC32MD5 作用类似,只是算法不同。

三、文件 MD5 的计算和修改

3.1 计算文件 MD5

linux:

1
2
$ md5sum 文件名 # 计算文件 MD5
$ echo "字符串" | md5sum # 计算字符串的 MD5

windows:

1
$ certutil -hashfile 文件名 MD5

3.2 修改文件 MD5

MD5 值与文件内容息息相关,文件稍有改动,其 MD5 就完全大变样。所以,要修改文件 MD5 值,只需略微修改文件内容即可。

对于视频和图像文件,在文件末尾添加一些内容不会使其损坏,下面以修改视频文件的 MD5 为例:

linux:

1
$ echo "任意字符串" >> video.mp4

windows:

1
$ echo 任意字符串 >> video.mp4

先新建一个文件,写入任意内容,然后:

1
$ copy /b 原视频名+文本文件名 新视频名