关于 MD5 加密
MD5 的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,
在 UNIX 下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5 的文件,在这个文件中通常只
有一行文本,大致结构如:
MD5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461
这就是 tanajiya.tar.gz 文件的数字签名。MD5 将整个文件当作一个大文本信息,通过其不可逆的字
符串变换算法,产生了这个唯一的 MD5 信息摘要。为了让读者朋友对 MD5 的应用有个直观的认识,笔者以一
个比方和一个实例来简要描述一下其工作过程:
大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方
法;与之类似,MD5 “ ”就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的 数字指纹 ,
如果任何人对文件名做了任何改动,其 MD5 “ ” 值也就是对应的 数字指纹 都会发生变化。
我们常常在某些软件下载站点的某软件信息中看到其 MD5 值,它的作用就在于我们可以在下载该软件后,
对下载回来的文件用专门的软件(如 Windows MD5 Check 等)做一次 MD5 校验,以确保我们获得的文件与
该站点提供的文件为同一文件。利用 MD5 算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、
系统文件安全等方面。
MD5 的典型应用是对一段 Message(字节串)产生 fingerprint(指纹) “ ”,以防止被 篡改 。举个例子,
你将一段话写在一个叫 readme.txt 文件中,并对这个 readme.txt 产生一个 MD5 的值并记录在案,然后
你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算 MD5 时就会发现
(两个 MD5 值不相同)。如果再有一个第三方的认证机构,用 MD5 “ ”还可以防止文件作者的 抵赖 ,这就是所
谓的数字签名应用。
MD5 还广泛用于操作系统的登陆认证上,如 Unix、各类 BSD 系统登录密码、数字签名等诸多方。如在
UNIX 系统中用户的密码是以 MD5(或其它类似的算法)经 Hash 运算后存储在文件系统中。当用户登录的时
候,系统把用户输入的密码进行 MD5 Hash 运算,然后再去和保存在文件系统中的 MD5 值进行比较,进而确
定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统
的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。MD5 “ ”将任意长度的 字节串 映射为一
个 128bit 的大整数,并且是通过该 128bit 反推原始字符串是困难的,换句话说就是,即使你看到源程序和
算法描述,也无法将一个 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),10^14 个密码为 100 万 G 大小的文件,或者说 1000T 大小的文件,。如
果只要小写字母和数字,那就是 10^12 个密码为 1 万 G 大小的文件。 那也已经是一个很天文的数字了,存
储这个字典就需要 TB 级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码 MD5 值的情况
下才可以。这种加密技术被广泛的应用于 UNIX 系统中,这也是为什么 UNIX 系统比一般操作系统更为坚固一
个重要原因。