一、消息摘要算法
消息摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。消息摘要算法也被称为哈希(Hash)算法或散列算法。
任何消息经过散列函数处理后,都会获得唯一的散列值,这一过程称为 “消息摘要”,其散列值称为 “数字指纹”,其算法自然就是 “消息摘要算法”了。换句话说,如果其数字指纹一致,就说明其消息是一致的。
(图片来源 —— https://zh.wikipedia.org/wiki/散列函數)
消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,目前可以解密逆向的只有 CRC32 算法,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用。消息摘要算法主要应用在 “数字签名” 领域,作为对明文的摘要算法。著名的摘要算法有 RSA 公司的 MD5 算法和 SHA-1 算法及其大量的变体。
1.1 消息摘要算法的特点
- 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用 MD5 算法摘要的消息有 128 个比特位,用 SHA-1 算法摘要的消息最终有 160 个比特位的输出,SHA-1 的变体可以产生 192 个比特位和 256 个比特位的消息摘要。一般认为,摘要的最终输出越长,该摘要算法就越安全。
- 消息摘要看起来是 “随机的”。这些比特看上去是胡乱的杂凑在一起的,可以用大量的输入来检验其输出是否相同,一般,不同的输入会有不同的输出,而且输出的摘要消息可以通过随机性检验。一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。
- 消息摘要函数是单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息。当然,可以采用强力攻击的方法,即尝试每一个可能的信息,计算其摘要,看看是否与已有的摘要相同,如果这样做,最终肯定会恢复出摘要的消息。但实际上,要得到的信息可能是无穷个消息之一,所以这种强力攻击几乎是无效的。
- 好的摘要算法,没有人能从中找到 “碰撞” 或者说极度难找到,虽然 “碰撞” 是肯定存在的(碰撞即不同的内容产生相同的摘要)。
1.2 消息摘要算法的应用
一般地,把对一个信息的摘要称为该消息的指纹或数字签名。数字签名是保证信息的完整性和不可否认性的方法。数据的完整性是指信宿接收到的消息一定是信源发送的信息,而中间绝无任何更改;信息的不可否认性是指信源不能否认曾经发送过的信息。其实,通过数字签名还能实现对信源的身份识别(认证),即确定 “信源” 是否是信宿意定的通信伙伴。 数字签名应该具有唯一性,即不同的消息的签名是不一样的;同时还应具有不可伪造性,即不可能找到另一个消息,使其签名与已有的消息的签名一样;还应具有不可逆性,即无法根据签名还原被签名的消息的任何信息。这些特征恰恰都是消息摘要算法的特征,所以消息摘要算法适合作为数字签名算法。
1.3 消息摘要算法的家谱
消息摘要算法主要分为三大类:MD(Message Digest,消息摘要算法)、SHA-1(Secure Hash Algorithm,安全散列算法)和 MAC(Message Authentication Code,消息认证码算法)。
如前文所述,MD5、SHA 和 MAC 都属于消息摘要算法,它们是三大消息摘要算法的主要代表。
- MD 系列算法包括 MD2、MD4 和 MD5 共 3 种算法;
- SHA 算法主要包括其代表算法 SHA-1 和 SHA-1 算法的变种 SHA-2 系列算法(包含 SHA-224、SHA-256、SHA-384 和 SHA-512);
- MAC 算法综合了上述两种算法,主要包括 HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384 和 HmacSHA512 算法。
尽管上述内容列举了各种消息摘要算法,但仍不能满足应用需要。基于这些消息摘要算法,又衍生出了 RipeMD 系列(包含 RipeMD128、RipeMD160、RipeMD256、RipeMD320)、Tiger、GOST3411 和 Whirlpool 算法。
二、MD 算法家族
2.1 简述
MD 算法是应用非常广泛的一个算法家族,尤其是 MD5(Message Digest Algorithm 5,消息摘要算法版本5),它由 MD2、MD3、MD4 发展而来,由 Ron Rivest(RSA 公司)在 1992 年提出,目前被广泛应用于数据完整性校验、数据(消息)摘要、数据签名等。MD2、MD4、MD5 都产生 16 字节(128 位)的校验值,一般用 32 位十六进制数表示。MD2 的算法较慢但相对安全,MD4 速度很快,但安全性下降,MD5 比 MD4 更安全、速度更快。
当软件开发者在互联网上分发软件安装包时,出于安全性考虑,通常会使用消息摘要算法,比如 MD5 算法产生一个与文件匹配的数字指纹,这样接收者在接收到文件后,就可以利用一些现成的工具来检查文件完整性。
(图片来源 —— https://en.wikipedia.org/wiki/MD5)
这里我们来举一个实际的例子,下图是 MySQL Community Server 8.0.19 版本的下载页,该下载页通过 MD5 算法分别计算出不同软件包的数字指纹,具体如下图所示:
(图片来源 —— https://dev.mysql.com/downloads/mysql/)
当用户从官网上下载到对应的安装包之后,可以利用一些 MD5 校验工具对已下载的文件进行校验,然后比对最终的 MD5 数字指纹,若结果与官网公布的数字指纹一致,则表示该安装包未经过任何修改是安全的,可以放心安装。
2.2 MD2 算法
1989 年,著名的非对称算法 RSA 发明人之一—麻省理工学院教授罗纳德·李维斯特(Ronald L.Rivest)开发了 MD2 算法。这个算法首先对信息进行数据补位,使信息的字节长度是 16 的倍数。再以一个 16 位的检验和作为补充信息追加到原信息的末尾。最后根据这个新产生的信息计算出一个 128 位的散列值,MD2 算法由此诞生。有关MD2 算法详情请参见 RFC 1319(http://www.ietf.org/rfc/rfc1319.txt)。
2.3 MD4 算法
1990 年,罗纳德·李维斯特教授开发出较之 MD2 算法有着更高安全性的 MD4 算法。在这个算法中,我们仍需对信息进行数据补位。不同的是,这种补位使其信息的字节长度加上 448 个字节后能成为 512 的倍数(信息字节长度 mod 512 = 448)。此外,关于 MD4 算法的处理与 MD2 算法又有很大差别。但最终仍旧是会获得一个 128 位的散列值。MD4 算法对后续消息摘要算法起到了推动作用,许多比较有名的消息摘要算法都是在 MD4 算法的基础上发展而来的,如 MD5、SHA-1、RIPE-MD 和 HAVAL 算法等。有关 MD4 算法的详情请参见 RFC 1320(http://www.ietf.org/rfc/rfc1320.txt)。
2.4 MD5 算法
1991年,继 MD4 算法后,罗纳德·李维斯特教授开发了 MD5 算法,将 MD 算法推向成熟。MD5 算法经 MD2、MD3 和 MD4 算法发展而来,算法复杂程度和安全强度大大提高。但不管是 MD2、MD4 还是 MD5 算法,其算法的最终结果均是产生一个 128 位的消息摘要,这也是 MD 系列算法的特点。MD5 算法执行效率略次于 MD4 算法,但在安全性方面,MD5 算法更胜一筹。随着计算机技术的发展和计算水平的不断提高,MD5 算法暴露出来的漏洞也越来越多。1996 年后被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如 SHA-2。2004 年,证实 MD5 算法无法防止碰撞(collision),因此不适用于安全性认证,如 SSL 公开密钥认证或是数字签名等用途。
下面我们来举几个示例,实际感受一下 MD5 算法:
代码语言:javascript复制MD5("semlinker") -> 688881f1c8aa6ffd3fcec471e0391e4d
MD5("kakuqo") -> e18c3c4dd05aef020946e6afbf9e04ef
MD5("lolo") -> d6581d542c7eaf801284f084478b5fcc
备注:MD2、MD4、MD5 都产生 16 字节(128 比特位)的校验值,一般用 32 位十六进制数表示。
三、SHA 算法家族
3.1 简述
SHA 算法是基于 MD4 算法实现的,作为 MD 算法的继任者,成为了新一代的消息摘要算法的代表。SHA 与 MD 算法不同之处主要在于摘要长度,SHA 算法的摘要更长,安全性更高。
SHA(Secure Hash Algorithm)是由美国专门制定密码算法的标准机构 —— 美国国家标准技术研究院(NIST)制定的,SHA 系列算法的摘要长度分别为:SHA 为 20 字节(160位)、SHA256为 32 字节(256位)、 SHA384为 48 字节(384位)、SHA512为 64 字节(512位),由于它产生的数据摘要的长度更长,因此更难以发生碰撞,因此也更为安全,它是未来数据摘要算法的发展方向。由于 SHA 系列算法的数据摘要长度较长,因此其运算速度与 MD5 相比,也相对较慢。
目前 SHA1 的应用较为广泛,主要应用于 CA 和数字证书中,另外在目前互联网中流行的 BT 软件中,也是使用SHA1 来进行文件校验的。
不过随着时间的推移,安全算法已不再安全。SHA-1 已经不再视为可抵御有充足资金、充足计算资源的攻击者。2005 年,密码分析人员发现了对 SHA-1 的有效攻击方法,这表明该算法可能不够安全,不能继续使用,自 2010 年以来,许多组织建议用 SHA-2 或 SHA-3 来替换 SHA-1。Microsoft、Google 以及 Mozilla 都宣布,它们旗下的浏览器将在 2017 年前停止接受使用 SHA-1 算法签名的 SSL 证书。
2017 年 2 月 23 日,CWI Amsterdam 与 Google 宣布了一个成功的 SHA-1 碰撞攻击,发布了两份内容不同但 SHA-1 散列值相同的 PDF 文件作为概念证明。下面让我们简要回顾一下 SHA 算法的发展历史:
3.2 SHA-0 算法
1993 年,NIST 公布了 SHA 算法家族的第一个版本,FIPS PUB 180。为避免混淆,现在我们称之为 SHA-0 算法。但 SHA-0 算法在公布不久后就被 NSA 撤回,原因是 NSA 发现 SHA-0 算法中含有会降低密码安全性的错误。由此,SHA-0 算法还未正式推广就已夭折。
3.3 SHA-1 算法
1995年,继 SHA-0 算法夭折后,NIST 发布了 FIPS PUB 180 的修订版本 FIPS PUB 180-1,用于取代 FIPS PUB 180,称为 SHA-1 算法,通常我们也把 SHA-1 算法简称为 SHA 算法。SHA-1 算法在许多安全协定中广为使用,包括 TLS/SSL、PGP、SSH、S/MIME 和 IPsec,曾被视为是 MD5 算法的后继者。
SHA-0 和 SHA-1算法可对最大长度为 264 的字节信息做摘要处理,得到一个 160 位的摘要信息,其设计原理相似于 MD4 和 MD5 算法。如果将得到 160 位的摘要信息换算成十六进制,可以得到一个 40 位(每 4 位二进制数转换为 1 位十六进制数)的字符串。
3.4 SHA-2 算法
SHA 算法家族除了其代表 SHA-1算法以外,还有 SHA-224、SHA-256、SHA-384 和 SHA-512 四种 SHA 算法的变体,以其摘要信息字节长度命名,通常将这组算法并称为 SHA-2 算法。摘要信息字节长度的差异是 SHA-2 和 SHA-1 算法的最大差异。
2001 年,在 FIPS PUB 180-2 草稿中包含了 SHA-256、SHA-384 和 SHA-512 算法,随即通过了审查和评论,于 2002 年以官方标准发布。
2004 年 2 月,在 FIPS PUB 180-2 变更通知中加入了一个额外的变种 “SHA-224”,这是为了符合双金钥 3DES(三重 DES 算法)所需的金钥长度而定义的。
3.5 SHA-3 算法
SHA-3 第三代安全散列算法(Secure Hash Algorithm 3),之前名为 Keccak 算法,设计者宣称在 Intel Core 2 的 CPU 上面,此算法的性能是 12.5cpb(每字节周期数,cycles per byte)。不过,在硬件实现上面,这个算法比起其他算法明显的快上很多。
SHA-3 在 2015 年 8 月 5 日由 NIST 通过 FIPS 202 正式发表。
下表展示了不同 SHA 算法对应的摘要长度:
算法 | 摘要长度(比特位) |
---|---|
SHA-1 | 160 |
SHA-224 | 224 |
SHA-256 | 256 |
SHA-384 | 384 |
SHA-512 | 512 |
若小伙伴们需要进一步了解不同 SHA 算法之间的详细差异,可以参考维基百科 - SHA家族。
四、MAC 算法家族
MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了 MD 和 SHA 算法的特性,并在此基础上加入了密钥。因为 MAC 算法融合了密钥散列函数(keyed-Hash),通常我们也把 MAC 称为HMAC(Keyed-Hash Message Authentication Code)。
MAC 算法主要集合了 MD 和 SHA 两大系列消息摘要算法。
- MD 系列算法有 HmacMD2、HmacMD4 和 HmacMD5 三种算法;
- SHA 系列算法有 HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384 和 HmacSHA512 五种算法。
下表展示了不同的 MAC 算法对应的摘要长度:
算法 | 摘要长度(比特位) |
---|---|
HmacMD5 | 128 |
HmacSHA1 | 160 |
HmacSHA256 | 256 |
HmacSHA384 | 384 |
HmacSHA512 | 512 |
HmacMD2 | 128 |
HmacMD4 | 128 |
HmacSHA224 | 224 |
经 MAC 算法得到的摘要值也可以使用十六进制编码表示,其摘要值长度与参与实现的算法摘要值长度相同。例如,HmacSHA1算法得到的摘要长度就是 SHA1 算法得到的摘要长度,都是 160 位二进制数,换算成十六进制编码为 40 位。有关 HMAC 算法详情请参见 RFC 2104(http://www.ietf.org/rfc/rfc2104.txt)。
五、参考资源
- 百度百科 - 消息摘要算法
- 维基百科 - 散列函数
- 维基百科 - SHA-1
- 常用消息摘要算法介绍
- Java 加密与解密的艺术(第2版)