📖 报文摘要和报文鉴别码
🎯 课程摘要:报文摘要(MD)用于验证报文的完整性(即报文鉴别),通过密码散列函数将可变长报文映射为固定长度的摘要值,再对其加密生成报文鉴别码(MAC)。常用算法有 MD5(128 位)、SHA-1(160 位)、SHA-2/SHA-3 等。散列报文鉴别码(HMAC)利用共享的秘密比特串,无需加密即可实现报文鉴别。
📝 详细笔记
1. 报文完整性与鉴别的概念
- 报文完整性:若报文被攻击者篡改或伪造,则报文不具备完整性
- 报文鉴别:对报文进行完整性验证,即鉴别报文的真伪
- 使用加密技术通常可达报文鉴别的目的,因为被篡改的报文解密后一般不能得到可理解的内容
问题引出:对于不需要保密而只需报文鉴别的网络应用(例如从网站下载应用软件,用户只关心软件是否与官方发布一致),对整个报文加解密会消耗大量 CPU 时间。使用报文摘要进行报文鉴别是一种更有效的方法。
2. 报文摘要进行报文鉴别的原理
报文摘要的英文缩写词为 MD。用加密的报文摘要进行报文鉴别的基本原理如下:
- 报文鉴别码(MAC):加密后的报文摘要,附加在报文后面用于报文鉴别的码串
- 好处:只对长度固定且比整个报文短得多的报文摘要进行加密,比对整个报文加密简单得多
- 密钥 K 仅在通信双方之间共享,没有第三方能用伪造报文产生出用密钥 K 加密的伪造报文摘要
3. 密码散列函数
报文摘要与之前介绍过的帧检验序列、首部检验和等都是散列函数的一种应用。散列函数又称为哈希函数。
散列函数的两个特点:
- 输入长度可变且可以很长,输出长度固定且较短(输出称为散列值,可简称为散列)
- 不同散列值对应不同输入,但不同输入可能得出相同散列值(输入与输出是多对一关系)
报文摘要算法必须满足的条件(用于抵御攻击者篡改):
- 对于任意给定的报文摘要值 H(x),想找到一个报文 y 使 H(y)=H(x),在计算上不可行
- 想找到任意两个报文 x 和 y 使 H(y)=H(x),在计算上不可行
满足上述条件的散列函数称为密码散列函数(或安全散列函数)。
- ⚠️ 重点:密码散列函数是一种单向函数,无法通过报文摘要还原出原文,可看作没有密钥的加密运算
- 满足上述条件表明:攻击者不可能伪造出另一个报文 y,使 y 与 x 具有同样的报文摘要
4. 实用的报文摘要算法
| 算法 | 提出者/发布时间 | 输出长度 | 安全性说明 |
|---|---|---|---|
| MD5 | Rivest,1991 年 | 128 比特 | 已被王小云团队攻破,最终被 SHA-1 替代 |
| SHA-1 | 1995 年发布 | 160 比特 | 比 MD5 安全但计算较慢,也被王小云团队攻破 |
| SHA-2 | — | — | 逐步替代 SHA-1 |
| SHA-3 | — | — | 新一代散列算法系列 |
MD5 的攻破:
- 2004 年,我国学者王小云发表轰动世界的密码学论文,证明可用系统方法找出一对具有相同 MD5 报文摘要的报文,仅需 15 分钟至不到一小时
- 这使"密码散列函数的逆变换不可能"这一传统观念受到颠覆性动摇
- 之后又有许多学者开发了对 MD5 的实际攻击方法,导致 MD5 最终被 SHA-1 替代
SHA-1 的演进:
- SHA-1 比 MD5 在安全性方面有很大提高,输出 160 比特报文摘要,但计算比 MD5 慢
- 后来也被证明其实际安全性未达设计目标,且曾被王小云教授研究团队攻破
- 微软已于 2017 年 1 月 1 日起停止支持 SHA-1 证书,以前签发的 SHA-1 证书必须更换为 SHA-2 证书
- 谷歌也宣布在 Chrome 浏览器中逐渐降低 SHA-1 证书的安全指示
5. 散列报文鉴别码(HMAC)
利用密码散列函数的特殊性质,可以设计出无需对报文摘要进行加密的报文鉴别方法,只要通信双方共享一个称为鉴别密钥的秘密比特串 s 即可。该技术称为散列报文鉴别码(HMAC)。
- 安全性:攻击者不知道仅由通信双方共享的鉴别密钥 s,也不能从截获的 HMAC 中计算出 s,因此不能伪造报文 m' 并产生 H(m' + s)
- 优势:无需加解密运算,仅靠散列函数即可实现报文鉴别,效率更高
💡 核心总结
- 报文摘要(MD)用于报文鉴别(验证完整性),比加密整个报文更高效
- 报文鉴别码(MAC)是加密后的报文摘要,附加在报文后用于鉴别真伪
- 密码散列函数是单向函数,满足给定摘要找原文、找同摘要不同原文均计算不可行
- MD5(128 位)已被王小云攻破,SHA-1(160 位)也被攻破,逐步被 SHA-2/SHA-3 替代
- 散列报文鉴别码(HMAC)利用共享鉴别密钥,无需加密即可实现报文鉴别
❓ 课后思考 / 经典考题
- 报文鉴别与报文加密有什么区别?为什么说对整个报文加密并非报文鉴别的最佳方法?
- 密码散列函数必须满足哪两个条件?为什么称其为单向函数?
- 简述 MD5、SHA-1、SHA-2 各自的输出长度及安全性现状。
- 画图说明使用加密的报文摘要进行报文鉴别的过程。
- 散列报文鉴别码(HMAC)是如何在不加密的情况下实现报文鉴别的?其安全性依据是什么?