Web安全入门与靶场实战(34)- MD5与Hash加密

时间:2023-02-12 18:08:42

在上篇博文中,我们通过查询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 /etc/passwd
933e128c427119ba30b5aee637c99d0f /etc/passwd
# sha1sum /etc/passwd
ea90d0d6fc809e4a77eb94af097dfa7b1c5d1d3d /etc/passwd

检测字符串长度:

# echo 933e128c427119ba30b5aee637c99d0f | wc -L
32
# echo ea90d0d6fc809e4a77eb94af097dfa7b1c5d1d3d | wc -L
40

需要注意的是,md5sum和sha1sum默认都只能对文件进行加密,如果要加密的对象是一个字符串,可以使用echo输出要加密的字符串,再通过管道符传给md5sum或sha1sum命令。由于echo命令在输出字符串时会自动在行尾加上一个换行符,这就会导致计算结果有误,所以还需要加上“-n”选项去掉换行符,

# echo -n "123" | md5sum                               
202cb962ac59075b964b07152d234b70 -

可以发现,无论是对/etc/passwd文件进行加密,还是对“123”这种只有3个字符的字符串加密,所得到的Hash值长度都是相同的,这体现了Hash算法定长输出的特点。

下面对/etc/passwd文件的内容进行微小的修改,比如在最后一行的后面加一个“.”,然后再次对其进行MD5加密。与之前的结果对比,可以发现前后两次的Hash值发生了彻底的变化。如果把添加的“.”删掉,然后再次加密,所得到的结果就又跟之前一样了。

# md5sum /etc/passwd
933e128c427119ba30b5aee637c99d0f /etc/passwd 最初的MD5值

# md5sum /etc/passwd
a8a971c90a44e99d67735913148492be /etc/passwd 添加“.”之后的MD5值

# md5sum /etc/passwd
933e128c427119ba30b5aee637c99d0f /etc/passwd 去掉“.”之后的MD5值

这体现了Hash算法雪崩效应的特点。

通过Hash算法对任意大小的数据进行计算,都可以得到一个固定长度的Hash值,而且Hash值与数据之间具有唯一相关性。Hash值就好比人类的指纹,每一组数据都可以计算出一个与其对应的唯一的Hash值,因而Hash算法也被称为“指纹算法”。

Hash算法还有一个重要特点,就是Hash运算的过程是不可逆的,即我们无法通过Hash值来推导出运算之前的原始数据。

也就是说Hash算法只能加密,而不能解密,所以也称之为单向加密。

这就好比通过指纹可以对应到唯一的一个人,指纹和这个人之间存在着对应关系。但是如果只有一枚指纹,就想通过这枚指纹把这个对应的人给还原出来,这明显是不现实的。Hash算法所谓的不可逆也是同样的道理。

Hash算法在网络安全领域应用非常广泛,它的作用主要有两个:一是用于验证数据的完整性和一致性,二是用来对数据进行单向加密。

我们这里所要介绍的主要是第二种应用,因为在Windows、Linux系统以及互联网的大多数应用中,都是采用了Hash算法对用户的密码进行加密之后再存储,也就是说最终存储的都是密码的Hash值,而非明文。

这主要是利用了Hash算法不可逆的特点,即无法根据加密后的密文来还原原始数据。因为对于系统中存放的用户密码,我们只需要用它来验证与用户输入的密码是否匹配即可,而无需知道其明文是什么。