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字节)一致:
- 若密钥过长:先对密钥进行哈希
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个零字节。
- SHA-256块长度为64字节,密钥补零至64字节:
- 生成填充密钥:
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在保证效率的同时,有效利用了哈希函数的安全性,成为消息认证领域的标准算法。