MD5简介
MD5 信息摘要算法(Message-Digest Algorithm),是一种被广泛使用的密码散列函数,可以产生出一个 128 位(即 16 字节)的散列值,用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,并于 1992 年公开,用以取代之前的 MD4 算法。MD5算法的程序在RFC 1321标准中被加以规范。
MD5 的典型应用是对一段消息(Message)产生消息摘要(Message-Digest),以防止被篡改。
比如,在 UNIX 下有很多软件在下载的时候都有一个文件名相同,文件扩展名为 .md5
的文件,在这个文件中通常只有一行文本,大致结构如:
MD5(virtualbox-6.0.tar.gz) = 4fe088dab6c94514c5e8ee8a6e236ae1
这就是 virtualbox-6.0.tar.gz
文件的数字签名。MD5 将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的 MD5 信息摘要。
MD5的应用
我们知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件名做了任何改动,其 MD5 值也就是对应的“数字指纹”都会发生变化。
我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。
MD5还广泛用于操作系统的登陆认证上,如 Unix、各类BSD系统登录密码、数字签名等诸多方。
如在 UNIX 系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定用户输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。
MD5将任意长度的“字节串”映射为一个 128 bit 的大整数,并且是通过该 128 bit 反推原始字符串是非常困难的。换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串(即不可逆性)。从数学原理上说,是因为原始的字符串有无穷多个,这有点类似不存在反函数的数学函数。所以,要遇到了MD5密码的问题,比较好的办法是:你可以用这个系统中的 md5()
函数重新设一个密码,如 admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。
正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为“跑字典”的方法。
有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的。先用 MD5 程序计算出这些字典项的 MD5 值,然后再用目标的 MD5 值在这个字典中检索。
我们假设密码的最大长度为 8 位字节(8 Bytes),同时假定密码只能由字母和数字组成,那么,就有 26+26+10=62 个字符;通过排列组合出的字典的总数则是:P(62,1)+P(62,2)….+P(62,8)
。这已经是一个天文数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于UNIX系统中,这也是为什么UNIX系统比一般操作系统更为坚固一个重要原因。