HMAC(基于哈希的消息认证码)算法
字数 1434 2025-10-29 00:00:25

HMAC(基于哈希的消息认证码)算法

HMAC是一种基于密码学哈希函数(如SHA-256或MD5)的消息认证码(MAC)算法。它的核心目标是在通信双方共享一个秘密密钥的前提下,验证消息的完整性和真实性。HMAC能够有效防止消息在传输过程中被篡改,并确保消息来源于合法的发送方。

1. HMAC的设计目标与背景

在网络安全中,单纯使用哈希函数(如计算消息的SHA-256摘要)并不能保证消息的真实性,因为攻击者可以同时修改消息和其哈希值。若双方共享一个密钥,则可将密钥与消息组合后哈希,但简单的组合(如H(key || message))可能受到长度扩展攻击等威胁。HMAC通过特定的填充和迭代结构,解决了这些潜在漏洞。

2. HMAC的算法结构

HMAC的定义如下:

HMAC(K, m) = H( (K ⊕ opad) || H( (K ⊕ ipad) || m ) )

其中:

  • H:选定的哈希函数(如SHA-256)。
  • K:共享的密钥。
  • m:待认证的消息。
  • opad(外填充):重复的字节0x5C
  • ipad(内填充):重复的字节0x36
  • ||:拼接操作。

3. 密钥处理步骤

HMAC要求密钥长度与哈希函数的输入块长度(如SHA-256的块长度为64字节)一致:

  1. 若密钥过长:先对密钥进行哈希H(K),使其长度等于哈希输出的长度(如SHA-256输出32字节),然后右侧补零至块长度。
  2. 若密钥过短:右侧补零至块长度。
  3. 生成填充密钥
    • K_ipad = K ⊕ ipad(密钥与ipad按位异或)。
    • K_opad = K ⊕ opad(密钥与opad按位异或)。

4. 计算过程详解

以SHA-256为例(块长度64字节):

  1. 内部哈希计算
    • 构造内填充数据:inner_data = (K_ipad) || message
    • 计算内部哈希值:H_inner = SHA-256(inner_data)
  2. 外部哈希计算
    • 构造外填充数据:outer_data = (K_opad) || H_inner
    • 计算最终HMAC值:HMAC = SHA-256(outer_data)

5. 示例说明

假设密钥K = "secret"(6字节),消息m = "Hello",使用SHA-256:

  1. 密钥处理
    • SHA-256块长度为64字节,密钥补零至64字节:
      K = "secret" + 58个零字节
  2. 生成填充密钥
    • ipad = 0x36重复64次,opad = 0x5C重复64次。
    • K_ipad = K ⊕ ipadK_opad = K ⊕ opad
  3. 分步计算
    • 内部哈希:输入为K_ipad || "Hello",计算SHA-256得到32字节的H_inner
    • 外部哈希:输入为K_opad || H_inner,最终输出32字节的HMAC值。

6. 安全性要点

  • 抵抗长度扩展攻击:由于内部哈希隐藏了密钥,攻击者无法在未知密钥时扩展输入。
  • 哈希函数依赖性:安全性依赖于底层哈希函数的抗碰撞性和单向性。
  • 密钥管理:密钥必须安全存储且定期更换。

7. 实际应用场景

HMAC广泛应用于:

  • TLS/SSL协议:验证数据传输完整性。
  • API认证:客户端和服务器通过共享密钥验证请求来源。
  • 数字签名辅助:与非对称密码结合使用(如HMAC-SHA256)。

通过这种结构,HMAC在保证效率的同时,有效利用了哈希函数的安全性,成为消息认证领域的标准算法。

HMAC(基于哈希的消息认证码)算法 HMAC是一种基于密码学哈希函数(如SHA-256或MD5)的消息认证码(MAC)算法。它的核心目标是在通信双方共享一个秘密密钥的前提下,验证消息的完整性和真实性。HMAC能够有效防止消息在传输过程中被篡改,并确保消息来源于合法的发送方。 1. HMAC的设计目标与背景 在网络安全中,单纯使用哈希函数(如计算消息的SHA-256摘要)并不能保证消息的真实性,因为攻击者可以同时修改消息和其哈希值。若双方共享一个密钥,则可将密钥与消息组合后哈希,但简单的组合(如 H(key || message) )可能受到长度扩展攻击等威胁。HMAC通过特定的填充和迭代结构,解决了这些潜在漏洞。 2. HMAC的算法结构 HMAC的定义如下: 其中: H :选定的哈希函数(如SHA-256)。 K :共享的密钥。 m :待认证的消息。 opad (外填充):重复的字节 0x5C 。 ipad (内填充):重复的字节 0x36 。 || :拼接操作。 3. 密钥处理步骤 HMAC要求密钥长度与哈希函数的输入块长度(如SHA-256的块长度为64字节)一致: 若密钥过长 :先对密钥进行哈希 H(K) ,使其长度等于哈希输出的长度(如SHA-256输出32字节),然后右侧补零至块长度。 若密钥过短 :右侧补零至块长度。 生成填充密钥 : K_ipad = K ⊕ ipad (密钥与ipad按位异或)。 K_opad = K ⊕ opad (密钥与opad按位异或)。 4. 计算过程详解 以SHA-256为例(块长度64字节): 内部哈希计算 : 构造内填充数据: inner_data = (K_ipad) || message 。 计算内部哈希值: H_inner = SHA-256(inner_data) 。 外部哈希计算 : 构造外填充数据: outer_data = (K_opad) || H_inner 。 计算最终HMAC值: HMAC = SHA-256(outer_data) 。 5. 示例说明 假设密钥 K = "secret" (6字节),消息 m = "Hello" ,使用SHA-256: 密钥处理 : SHA-256块长度为64字节,密钥补零至64字节: K = "secret" + 58个零字节 。 生成填充密钥 : ipad = 0x36 重复64次, opad = 0x5C 重复64次。 K_ipad = K ⊕ ipad , K_opad = K ⊕ opad 。 分步计算 : 内部哈希:输入为 K_ipad || "Hello" ,计算SHA-256得到32字节的 H_inner 。 外部哈希:输入为 K_opad || H_inner ,最终输出32字节的HMAC值。 6. 安全性要点 抵抗长度扩展攻击 :由于内部哈希隐藏了密钥,攻击者无法在未知密钥时扩展输入。 哈希函数依赖性 :安全性依赖于底层哈希函数的抗碰撞性和单向性。 密钥管理 :密钥必须安全存储且定期更换。 7. 实际应用场景 HMAC广泛应用于: TLS/SSL协议 :验证数据传输完整性。 API认证 :客户端和服务器通过共享密钥验证请求来源。 数字签名辅助 :与非对称密码结合使用(如HMAC-SHA256)。 通过这种结构,HMAC在保证效率的同时,有效利用了哈希函数的安全性,成为消息认证领域的标准算法。