Hmac介绍
Hmac,全称为“Hash Message Authentication Code”,中文名“散列消息鉴别码”,
主要是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
一般的,消息鉴别码用于验证传输于两个共同享有一个密钥的单位之间的消息。
Hmac可以与任何迭代散列函数捆绑使用。MD5 和 SHA-1 就是这种散列函数。HMAC 还可以使用一个用于计算和确认消息鉴别值的密钥。
随着Internet的不断发展,网络安全问题日益突出。为了确保接收方所接收到的报文数据的完整性,人们采用消息认证来验证上述性质。
Hmac算法主要确保接收方接收的数据是完整的,是没有被篡改的。
Hmac算法
在不引入第三方库的情况下,JDK支持有限的摘要算法:
provider | 算法 |
---|---|
SunJCE | HmacMD5 |
SunJCE | HmacSHA1 |
SunJCE | HmacSHA224 |
SunJCE | HmacSHA256 |
SunJCE | HmacSHA384 |
SunJCE | HmacSHA512 |
BouncyCastle是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法,如HmacSM3
使用Hmac的好处
HmacMD5可以看作带有一个安全的key的MD5。使用HmacMD5而不是用MD5加salt,有如下好处:
- HmacMD5使用的key长度是64字节,更安全;
- Hmac是标准算法,同样适用于SHA-1等其他哈希算法;
- Hmac输出和原有的哈希算法长度一致。
使用示例
基于hutool 及 原生写法,演示如何使用HmacMD5算法
代码示例
import cn.hutool.crypto.digest.HMac;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigInteger;
public class HmacMD5Util {
public static void main(String[] args) throws Exception {
String testStr = "HTTP上传输的内容";
// 此处密钥如果有非ASCII字符,考虑编码
byte[] key = "!@#123KK".getBytes();
HMac mac = new HMac("HmacMD5", key);
System.out.println(mac.digestHex(testStr));
mac = new HMac("HmacSM3", key);
System.out.println(mac.digestHex(testStr));
hmacMD5(key,testStr.getBytes());
}
public static void hmacMD5(byte[] key,byte[] content) throws Exception {
SecretKey skey = new SecretKeySpec(key, "HmacMD5");
Mac mac = Mac.getInstance("HmacMD5");
mac.init(skey);
mac.update(content);
byte[] result = mac.doFinal();
System.out.println(new BigInteger(1, result).toString(16));
}
}
导入maven依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.9</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>