密码算法安全通信密钥交换协议教程 - 第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 单轮压缩函数数据流 SHA-256 单轮压缩函数(第 t 轮) a, b, c, d, e, f, g, h Wt (消息扩展) Kt (轮常数) Σ0(a) Maj(a,b,c) Σ1(e) Ch(e,f,g) + + T1 T2 更新 a, b, c, d, e, f, g, h Σ 表示循环右移与异或组合;Maj 为多数函数;Ch 为选择函数;所有运算均为 32 位模加
工程提示: 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 哈希-签名范式

实际系统中,数字签名并不直接对原始消息进行签名,而是先对消息计算哈希摘要,再对摘要进行签名。这种“哈希-签名”范式带来了显著的性能和安全优势:

  1. 效率提升:非对称签名运算只作用于固定长度的摘要(如 256 比特),而非整个大文件
  2. 兼容性:不同长度的消息都能统一处理
  3. 安全隔离:哈希函数将消息与签名算法解耦,即使签名算法存在弱点,哈希的抗碰撞性仍能提供保护
安全警告: 如果底层哈希函数被找到有效的碰撞攻击,攻击者可以构造两个不同消息但哈希值相同,从而让签名同时适用于两个消息。因此,数字签名系统的安全性直接依赖于哈希函数的抗碰撞性。2023 年之后,SHA-1 已被主流浏览器和 CA 完全弃用,所有新系统必须使用 SHA-256 或更高强度的哈希函数。

4.3.2 数字签名与消息认证码的对比

对比维度 消息认证码(HMAC) 数字签名
密钥类型 对称密钥(共享密钥) 非对称密钥对(私钥 + 公钥)
密钥分发 需要安全信道预先共享密钥 公钥可公开分发,私钥本地保管
不可否认性 不提供(双方都能生成相同的 MAC) 提供(只有私钥持有者能生成签名)
计算开销 快(对称运算 + 哈希) 慢(模幂或椭圆曲线运算)
典型算法 HMAC-SHA256 RSA-PSS、ECDSA、EdDSA

4.3.3 数字签名生成与验证流程

下图展示了基于哈希-签名范式的数字签名完整流程:

数字签名生成与验证流程 数字签名生成与验证流程 签名方(持有私钥 SK) 原始消息 m SHA-256 哈希 私钥 SK 签名 数字签名 σ 发送 (m, σ) 至验证方 验证方(持有公钥 PK) 接收消息 m SHA-256 哈希 接收签名 σ 公钥 PK 验证 验证通过 / 拒绝 签名方先对消息计算哈希摘要,再对摘要签名;验证方同样先计算消息哈希,再用公钥验证签名与哈希是否匹配 这种哈希-签名范式将非对称运算限制在固定长度摘要上,大幅提升了大文件签名的效率
实践建议: 在密钥交换协议中,HMAC 用于保护握手消息的完整性(如 TLS 1.3 中的 Finished 消息),而数字签名用于身份认证和证书验证。两者协同工作:HMAC 提供会话级的消息认证,数字签名提供长期身份的可信锚点。

4.4 本章小结

  • SHA-256 提供 256 比特的安全强度,满足抗原像性、抗第二原像性和抗碰撞性要求,是当前数字签名和 HMAC 的首选哈希函数。
  • HMAC 通过两次哈希和异或填充结构,解决了简单哈希认证方案中的长度扩展攻击和碰撞攻击问题,是 TLS、SSH、IPsec 等协议中消息认证的标准方案。
  • 数字签名 基于非对称密码学,提供不可否认性。哈希-签名范式将非对称运算限制在固定长度的摘要上,兼顾了安全性与效率。
  • 在密钥交换协议设计中,哈希函数、HMAC 和数字签名三者各司其职:哈希保证数据完整性,HMAC 保证会话消息的认证,数字签名保证通信实体的身份可信。