在上篇博文中,我们通过查询MySQL数据库获取到了网站的管理员账号以及经过加密后的密码,大部分情况下,数据库中的密码都是采用的MD5加密。虽然Drupal这里采用的加密方式并不是MD5,但从初学者的角度,还是非常有必要先介绍一下MD5这种在网络安全中最常见到的加密方式。
要了解MD5,首先要了解Hash。
Hash是一种数学算法,这种算法最主要的特点,就是可以把一个任意大小的数据经过处理之后,得到一个固定长度的数值(Hash值)。
比如我们将一个大小只有10个字节的文件和一个大小为10GB的文件,分别用Hash算法进行处理,它们所得到的Hash值长度都是一样的。要注意是长度一样,而并非大小一样。
由于通常都是习惯采用二进制数的位数来表示Hash值的长度,所以我们最常见到的Hash值大都是128位或者是160位。
Hash算法还有很多特性,归纳起来主要是以下三点:
- 定长输出:无论原始数据多大,其生成的Hash值长度是固定的。
- 不可逆:无法根据加密后的密文,还原出明文。
- 雪崩效应:输入一样,输出必定一样。如果输入发生微小改变,输出将发生巨大变化。
当然,如果只是从理论上来解释Hash算法,那就太枯燥了,所以下面还是结合实例来说明。
现在就可以介绍什么是MD5了。
MD5是Hash算法的具体实现,除了MD5之外,Hash算法的实现方式还有SHA等,不过在实践应用以及CTF比赛中,使用最多的还是MD5。
这里需要说明的是,其实严格来讲,MD5并不属于是加密算法,而应该是“消息摘要”算法。MD本身就是“Message Digest”消息摘要的缩写。由于在shentou测试过程中所见到的MD5,主要是由于对用户密码进行加密,所以就可以把它理解为加密算法。对于初学者,也不必纠结于这些概念,随着学习的深入,现在一些看起来模糊不清的概念在以后自然就迎刃而解了。
下面通过一些具体的实例来介绍Hash算法的特点,这里要用到md5sum和sha1sum命令,通过这些命令可以对指定的数据进行Hash加密。
MD5 和SHA1都是Hash算法的具体应用,它们的主要区别是所生成的Hash值长度不同,MD5生成的Hash值长度为128位,SHA1生成的Hash值长度为160位。当然在实际应用中,Hash值通常都是以十六进制的形式表示,每1位十六进制数可对应4位二进制数,因而这两种算法生成的十六进制的Hash值长度就分别为32位和40位。
比如分别利用md5sum和sha1sum命令对/etc/passwd文件进行加密,各自得到32位和40位的十六进制Hash值。
检测字符串长度:
需要注意的是,md5sum和sha1sum默认都只能对文件进行加密,如果要加密的对象是一个字符串,可以使用echo输出要加密的字符串,再通过管道符传给md5sum或sha1sum命令。由于echo命令在输出字符串时会自动在行尾加上一个换行符,这就会导致计算结果有误,所以还需要加上“-n”选项去掉换行符,
可以发现,无论是对/etc/passwd文件进行加密,还是对“123”这种只有3个字符的字符串加密,所得到的Hash值长度都是相同的,这体现了Hash算法定长输出的特点。
下面对/etc/passwd文件的内容进行微小的修改,比如在最后一行的后面加一个“.”,然后再次对其进行MD5加密。与之前的结果对比,可以发现前后两次的Hash值发生了彻底的变化。如果把添加的“.”删掉,然后再次加密,所得到的结果就又跟之前一样了。
这体现了Hash算法雪崩效应的特点。
通过Hash算法对任意大小的数据进行计算,都可以得到一个固定长度的Hash值,而且Hash值与数据之间具有唯一相关性。Hash值就好比人类的指纹,每一组数据都可以计算出一个与其对应的唯一的Hash值,因而Hash算法也被称为“指纹算法”。
Hash算法还有一个重要特点,就是Hash运算的过程是不可逆的,即我们无法通过Hash值来推导出运算之前的原始数据。
也就是说Hash算法只能加密,而不能解密,所以也称之为单向加密。
这就好比通过指纹可以对应到唯一的一个人,指纹和这个人之间存在着对应关系。但是如果只有一枚指纹,就想通过这枚指纹把这个对应的人给还原出来,这明显是不现实的。Hash算法所谓的不可逆也是同样的道理。
Hash算法在网络安全领域应用非常广泛,它的作用主要有两个:一是用于验证数据的完整性和一致性,二是用来对数据进行单向加密。
我们这里所要介绍的主要是第二种应用,因为在Windows、Linux系统以及互联网的大多数应用中,都是采用了Hash算法对用户的密码进行加密之后再存储,也就是说最终存储的都是密码的Hash值,而非明文。
这主要是利用了Hash算法不可逆的特点,即无法根据加密后的密文来还原原始数据。因为对于系统中存放的用户密码,我们只需要用它来验证与用户输入的密码是否匹配即可,而无需知道其明文是什么。