HMAC 你是谁
HMAC 又称哈希运算消息认证码
运算利用 哈希算法 (MD5、SHA1 等),输入密钥和消息,生成消息摘要
HMAC 发送方和接收方只有拥有认证码也就是秘钥方能进行认证。
类型
MAC算法可选以下多种算法
- HmacMD5
- HmacSHA1
- HmacSHA256
- HmacSHA384
- HmacSHA512
这里以 HmacMD5 为例
HmacMD5作用
- HmacMD5使用的key长度是64字节,更安全;
- Hmac是标准算法,同样适用于SHA-1等其他哈希算法;
- Hmac输出和原有的哈希算法长度一致。
coding
import lombok.extern.slf4j.Slf4j;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* hmac 帮助类
* HMAC 算法实例mac在多线程环境下是不安全的。需要在多线程访问时,使用ThreadLocal为每个线程缓存一个实例可解决
*/
@Slf4j
public class HMacHelper {
private Mac mac;
/**
* MAC算法可选以下多种算法
* HmacMD5/HmacSHA1/HmacSHA256/HmacSHA384/HmacSHA512
*/
private static final String KEY_MAC = "HmacMD5";
/**
* 构造秘钥 获取摘要算法实例
*/
public HMacHelper(String key) {
try {
SecretKey secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), KEY_MAC);
mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
log.info("init HMacHelper failed", e);
}
}
/**
* 获取签名
*/
public byte[] sign(byte[] content) {
return mac.doFinal(content);
}
/**
* 验证签名是否正确
*/
public boolean verify(byte[] signature, byte[] content) {
byte[] result = mac.doFinal(content);
return Arrays.equals(signature, result);
}
}







网友评论