本文主要介绍 MD5 算法(Message-Digest Algorithm 5)的相关知识,同时通过用法示例介绍 MD5 算法的使用方法。

1 概述

MD5,即消息摘要算法第五版,是一种被广泛使用的密码散列函数。散列算法的基本原理是:进行数据(如一段文字)运算,将原始数据变为另一段固定长度的值。

MD5 可以产生出一个 128位(16字节)的散列值(hash value),用于确保传输信息的完整性。

MD5 由美国密码学家 Ronald Linn Rivest 设计,于 1992 年公开,用以取代 MD4 算法。

2 特点

MD5 算法具有以下特点:

  • 压缩性:任意长度的数据,运算得出的 MD5 值长度都是固定的(128位);
  • 容易计算:很容易从原数据计算出对应的 MD5 值;
  • 抗修改性:对原数据进行的任何改动,哪怕只修改 1 个字节,所得到的 MD5 值都有很大区别;
  • 强抗碰撞:已知原数据和其 MD5 值,想找到一个具有相同 MD5 值的数据(即伪造数据)是非常困难的。

3 作用

MD5 的作用是:让大容量信息在用数字签名软件签署私人密钥前,被“压缩”成一种保密的格式(就是把一个任意长度的字符串变换成一定长度的十六进制字符串)。除了 MD5 以外,其他比较有名的类似算法还有 sha-1、RIPEMD 以及 Haval 等。

4 应用场景

4.1 一致性验证

MD5 可以在文件传输场景中提供文件的一致性验证。

例如,文件服务器预先提供一个 MD5 校验值,用户下载完文件以后,用 MD5 算法计算下载文件的 MD5 校验值(如果任何人对文件做了任何改动,这个文件的 MD5 值就会发生变化),然后通过检查这两个校验值是否一致,就能判断下载的文件是否出错、或者下载的文件是否被篡改了。

现在,利用 MD5 算法进行文件校验的方法,已经广泛应用到软件下载站、论坛数据库、系统文件安全等方面了。

4.2 数字签名

MD5 的典型应用是针对一段信息(Message)产生对应的信息摘要(Message-Digest),以防止该段信息被篡改。

例如,在文件“readme.txt”中写入一些内容,并对这个文件进行 MD5 运算,产生一个 MD5 值并记录下来,然后可以将这个文件发送给别人,别人如果修改了“readme.txt”文件中的任何内容,我们对这个文件重新计算 MD5 时,就会发现两个 MD5 值不同。

在上述过程中,如果再有一个第三方的认证机构介入,那么使用 MD5 还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

4.3 安全访问认证

MD5 还广泛用于操作系统的登录认证中,如 Unix、各类BSD操作系统登录密码、数字签名等诸多方面。

例如,在 Unix 操作系统中,用户的密码是经 MD5(或其它类似的算法)运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行 MD5 运算,然后再与保存在文件系统中的 MD5 值进行比较,从而确定用户输入的密码是否正确。通过这些步骤,操作系统在并不知道用户明文密码的情况下,就可以确定用户登录系统的合法性,这可以避免用户的密码被具有系统管理员权限的用户窃取。

MD5 将任意长度的“字符串”映射为一个 128bit 的“字符串”,通过该 128bit 的“字符串”反推原始字符串是困难的,换句话说,即使你看到源程序和算法描述,也很难将一个 MD5 的值转换回原始的字符串。

5 用法示例

此处列举一个简单的用法示例。

有一个名为“md5_test.txt”的文件,该文件的内容如下:

[root@node1 /opt/liitdar/mydemos]# cat md5_test.txt 
hello world
[root@node1 /opt/liitdar/mydemos]#

此时,对该文件进行 MD5 运算,如下:

[root@node1 /opt/liitdar/mydemos]# md5sum md5_test.txt 
6f5902ac237024bdd0c176cb93063dc4  md5_test.txt
[root@node1 /opt/liitdar/mydemos]#

得到该文件的 MD5 值为“6f5902ac237024bdd0c176cb93063dc4”。

现在,我们修改文件“md5_test.txt”的内容,修改后该文件的内容如下(多了一个感叹号):

[root@node1 /opt/liitdar/mydemos]# cat md5_test.txt 
hello world!
[root@node1 /opt/liitdar/mydemos]#

此时,再对该文件进行 MD5 运算,如下:

[root@node1 /opt/liitdar/mydemos]# md5sum md5_test.txt 
c897d1410af8f2c74fba11b1db511e9e  md5_test.txt
[root@node1 /opt/liitdar/mydemos]#

通过上述结果能够知道,随着文件“md5_test.txt”内容的修改,该文件对应的 MD5 值也发生了变化。