1. HMAC-SHA1 是什么?
HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码)是一种消息认证算法。它结合了哈希函数(如 SHA1)和密钥,用于验证消息的完整性和真实性。
HMAC-SHA1 就是以 SHA1 为哈希函数的 HMAC 算法。
2. HMAC 原理
HMAC 的核心思想是:
用一个密钥和哈希函数,对消息进行两次哈希,得到一个消息认证码。
具体公式如下:
HMAC(K, M) = H((K' ⊕ opad) || H((K' ⊕ ipad) || M))
K:密钥M:消息H:哈希函数(这里是 SHA1)K':密钥 K,如果长度不足 block size(SHA1 的 block size 为 64 字节),则补零;如果超出则先哈希再补零opad:外部填充字节(0x5c 重复 64 次)ipad:内部填充字节(0x36 重复 64 次)⊕:按位异或||:拼接
步骤简述
- 对密钥 K 进行预处理,得到 K'(长度为 block size)
- K' 与 ipad 进行异或,拼接消息 M,做一次哈希
- K' 与 opad 进行异或,拼接上一步哈希结果,再做一次哈希
- 最终得到 HMAC 值
3. HMAC-SHA1 算法流程
详细步骤:
- 密钥处理
- 如果密钥长度 > 64 字节,先用 SHA1 哈希一次
- 如果密钥长度 < 64 字节,末尾补零到 64 字节
- 计算 K' ⊕ ipad
- ipad = 0x36 * 64
- 计算 K' ⊕ opad
- opad = 0x5c * 64
- 第一轮哈希
- 先将 (K' ⊕ ipad) 和消息 M 拼接
- 用 SHA1 哈希,得到结果 H1
- 第二轮哈希
- 将 (K' ⊕ opad) 和 H1 拼接
- 用 SHA1 哈希,得到最终 HMAC 值
4. Java HMAC-SHA1 实现
Java 标准库 javax.crypto.Mac 和 javax.crypto.spec.SecretKeySpec 就可以实现 HMAC-SHA1。
4.1 生成 HMAC-SHA1 签名
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
{
[] hmacSHA1([] key, [] message) Exception {
(key, );
Mac.getInstance();
mac.init(signingKey);
mac.doFinal(message);
}
String Exception {
[] hmac = hmacSHA1(key.getBytes(), message.getBytes());
Base64.getEncoder().encodeToString(hmac);
}
Exception {
hmacSHA1Base64(key, message);
MessageDigest.isEqual(expected.getBytes(), signatureBase64.getBytes());
}
Exception {
;
;
hmacSHA1Base64(key, message);
System.out.println( + signature);
verify(key, message, signature);
System.out.println( + valid);
}
}


