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>