HMAC-MD5 是一种基于 MD5 哈希函数的消息认证码(MAC)算法。它用于确保消息的完整性和认证,通常用于数据传输和 API 请求。其基本步骤如下:
-
密钥准备:选择一个密钥(K),如果 K 的长度超过 MD5 的块大小(64 字节),则先对 K 进行 MD5 哈希处理,得到一个新的 K'。如果 K 的长度小于 64 字节,则用零填充至 64 字节。
-
创建内外填充:
- 内填充(ipad):对 K' 每个字节与 0x36 进行异或操作,得到内填充。
- 外填充(opad):对 K' 每个字节与 0x5C 进行异或操作,得到外填充。
-
计算 HMAC:
- 先计算内层哈希:
inner_hash = MD5(ipad || message)
,其中||
表示拼接操作。 - 然后计算外层哈希:
HMAC = MD5(opad || inner_hash)
。
- 先计算内层哈希:
最终得到的 HMAC 值可以用作消息的签名,以验证消息的完整性和真实性。
以下是一个使用 Java 实现 HMAC-MD5 签名算法的示例:
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.util.Base64;
public class HmacMd5Demo {
public static void main(String[] args) {
String secretKey = "your_secret_key"; // 替换为你的密钥
String message = "your_message"; // 替换为你的消息
try {
String hmacMd5 = hmacMd5(secretKey, message);
System.out.println("HMAC-MD5: " + hmacMd5);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String hmacMd5(String key, String data) throws NoSuchAlgorithmException, InvalidKeyException {
Mac mac = Mac.getInstance("HmacMD5");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "HmacMD5");
mac.init(secretKeySpec);
byte[] hmacBytes = mac.doFinal(data.getBytes());
// 将字节数组转换为十六进制字符串
StringBuilder hexString = new StringBuilder();
for (byte b : hmacBytes) {
String hex = Integer.toHexString(0xFF & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString().toUpperCase(); // 返回大写的十六进制字符串
}
}