密码算法安全通信密钥交换协议教程 - 第4节
4.1 哈希函数与 SHA-256
哈希函数(Hash Function)是密码学中最基础的构建块之一。它将任意长度的输入数据映射为固定长度的输出值(称为哈希值或摘要)。一个安全的密码学哈希函数必须满足以下核心特性:
| 特性 | 描述 | 重要性 |
|---|---|---|
| 抗原像性 | 给定哈希值 h,在计算上无法找到任何输入 x 使得 H(x) = h | 防止从摘要反推原始消息 |
| 抗第二原像性 | 给定输入 x,在计算上无法找到另一个输入 x'(x' ≠ x)使得 H(x) = H(x') | 防止伪造相同摘要的不同消息 |
| 抗碰撞性 | 在计算上无法找到任意两个不同的输入 x 和 y 使得 H(x) = H(y) | 保证哈希值的唯一性,防止签名伪造 |
| 雪崩效应 | 输入微小的改变(如翻转1比特)会导致输出中约50%的比特发生变化 | 确保哈希值对输入变化高度敏感 |
SHA-256 核心参数: 输出长度 256 比特(32 字节),消息块大小 512 比特(64 字节),采用 Merkle-Damgård 结构,共执行 64 轮压缩函数运算。
4.1.1 SHA-256 压缩函数流程
SHA-256 的处理过程分为三个主要阶段:消息填充与解析、初始化向量设置、以及 64 轮迭代压缩。下图展示了单轮压缩函数的内部数据流:
工程提示: SHA-256 的 64 轮迭代并非简单的重复,每轮使用的消息字 Wt 由前 16 轮的消息字通过循环扩展生成,这种扩散机制保证了即使输入只有 1 比特差异,最终哈希值也会完全不同。
4.2 消息认证码(HMAC)
哈希函数本身不提供密钥,因此无法直接用于消息认证。消息认证码(MAC)通过引入共享密钥,解决了“消息是否被篡改”以及“消息是否来自声称的发送方”这两个核心问题。HMAC(Hash-based Message Authentication Code)是目前最广泛使用的 MAC 构造方式。
4.2.1 HMAC 构造原理
HMAC 的核心思想是将密钥与消息通过两次哈希运算混合,其标准定义如下:
HMAC(K, m) = H( (K' ⊕ opad) || H( (K' ⊕ ipad) || m ) )
其中:
K' = 对密钥 K 进行填充或哈希处理,使其长度等于哈希函数的分组长度(SHA-256 为 64 字节)
ipad = 0x36 重复 64 次(内填充)
opad = 0x5C 重复 64 次(外填充)
|| = 字符串连接操作
⊕ = 按位异或操作
H = 底层哈希函数(此处为 SHA-256)
安全优势: HMAC 的安全性依赖于底层哈希函数的抗碰撞性。即使 MD5 已被破解,HMAC-MD5 在特定场景下仍被认为安全,因为 HMAC 结构本身提供了额外的密钥保护层。实践中推荐使用 HMAC-SHA256。
4.2.2 HMAC 与简单哈希认证对比
| 方案 | 构造方式 | 安全性 | 典型应用 |
|---|---|---|---|
| H(m || K) | 消息后拼接密钥再哈希 | 易受长度扩展攻击 | 不推荐使用 |
| H(K || m) | 密钥后拼接消息再哈希 | 易受碰撞攻击 | 不推荐使用 |
| HMAC | 两次哈希 + 异或填充 | 抗长度扩展,抗碰撞 | TLS、SSH、IPsec、JWT |
4.3 数字签名基础
消息认证码(MAC)要求通信双方共享同一个密钥,这带来了密钥分发难题。数字签名使用非对称密码学解决了这个问题:发送方使用私钥签名,接收方使用公钥验证。数字签名必须满足:
- 不可伪造性:只有持有私钥的签名者才能生成有效签名
- 不可否认性:签名者无法否认自己签署过的消息
- 可验证性:任何持有对应公钥的实体都能验证签名的真实性
4.3.1 哈希-签名范式
实际系统中,数字签名并不直接对原始消息进行签名,而是先对消息计算哈希摘要,再对摘要进行签名。这种“哈希-签名”范式带来了显著的性能和安全优势:
- 效率提升:非对称签名运算只作用于固定长度的摘要(如 256 比特),而非整个大文件
- 兼容性:不同长度的消息都能统一处理
- 安全隔离:哈希函数将消息与签名算法解耦,即使签名算法存在弱点,哈希的抗碰撞性仍能提供保护
安全警告: 如果底层哈希函数被找到有效的碰撞攻击,攻击者可以构造两个不同消息但哈希值相同,从而让签名同时适用于两个消息。因此,数字签名系统的安全性直接依赖于哈希函数的抗碰撞性。2023 年之后,SHA-1 已被主流浏览器和 CA 完全弃用,所有新系统必须使用 SHA-256 或更高强度的哈希函数。
4.3.2 数字签名与消息认证码的对比
| 对比维度 | 消息认证码(HMAC) | 数字签名 |
|---|---|---|
| 密钥类型 | 对称密钥(共享密钥) | 非对称密钥对(私钥 + 公钥) |
| 密钥分发 | 需要安全信道预先共享密钥 | 公钥可公开分发,私钥本地保管 |
| 不可否认性 | 不提供(双方都能生成相同的 MAC) | 提供(只有私钥持有者能生成签名) |
| 计算开销 | 快(对称运算 + 哈希) | 慢(模幂或椭圆曲线运算) |
| 典型算法 | HMAC-SHA256 | RSA-PSS、ECDSA、EdDSA |
4.3.3 数字签名生成与验证流程
下图展示了基于哈希-签名范式的数字签名完整流程:
实践建议: 在密钥交换协议中,HMAC 用于保护握手消息的完整性(如 TLS 1.3 中的 Finished 消息),而数字签名用于身份认证和证书验证。两者协同工作:HMAC 提供会话级的消息认证,数字签名提供长期身份的可信锚点。
4.4 本章小结
- SHA-256 提供 256 比特的安全强度,满足抗原像性、抗第二原像性和抗碰撞性要求,是当前数字签名和 HMAC 的首选哈希函数。
- HMAC 通过两次哈希和异或填充结构,解决了简单哈希认证方案中的长度扩展攻击和碰撞攻击问题,是 TLS、SSH、IPsec 等协议中消息认证的标准方案。
- 数字签名 基于非对称密码学,提供不可否认性。哈希-签名范式将非对称运算限制在固定长度的摘要上,兼顾了安全性与效率。
- 在密钥交换协议设计中,哈希函数、HMAC 和数字签名三者各司其职:哈希保证数据完整性,HMAC 保证会话消息的认证,数字签名保证通信实体的身份可信。