- mac: 消息认证码,是一种带有密钥的hash函数.
与md5和sha-256,shs-512的不同在于后者不可以带有密钥. - 分别使用jdk原生的方法和codec分别实现
import com.yutu.pwd.util.MessageUtils;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
public class MacTest {
private static final String UTF8 = StandardCharsets.UTF_8.name();
/**
* 使用codec实现mac编码
*/
@Test
public void S() throws Exception{
String key = "123";
String str = "小汪学java";
//Hmac_MD5
String hmacMD5 = new HmacUtils(HmacAlgorithms.HMAC_MD5, key.getBytes(UTF8))
.hmacHex(str.getBytes(UTF8));
System.out.println("hmacMD5: " + hmacMD5);
//hmacMD5: 37410e4694b2a06e44389499640c7a3d
String hmacHex256 = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, key.getBytes(UTF8))
.hmacHex(str.getBytes(UTF8));
System.out.println("hmacHex256: " + hmacHex256);
//hmacHex256: 67af93ae1d37f975e3ab8660900430d82b3fd55819540407eebcb70de0628452
String hmacHex512 = new HmacUtils(HmacAlgorithms.HMAC_SHA_512, key.getBytes(UTF8))
.hmacHex(str.getBytes(UTF8));
System.out.println("hmacHex512: " + hmacHex512);
//hmacHex512: 0805bd75e61c3b6f83f293e8a99140a17833b5a2bd463d84b129cfdcf9423be3424ae0c51396f84e539dbda1f9eaaa69ad934329f3f9f69bf54e10c687db8c80
}
/**
* 使用jdk原生的api实现mac
* @throws Exception
*/
@Test
public void test1() throws Exception{
//指定密钥(salt)
String key = "123";
String str = "小汪学java";
String algorithm = "HmacMD5";//算法名对象
String hmacStr = MessageUtils.doMacDigest(str,key,algorithm);
System.out.println("hexStr: " + hmacStr);
//hexStr: 37410e4694b2a06e44389499640c7a3d
}
/**
* HmacSHA256
* @throws Exception
*/
@Test
public void test2() throws Exception{
//指定密钥(salt)
String key = "123";
String str = "小汪学java";
String algorithm = "HmacSHA256";//算法名对象
String hmacStr = MessageUtils.doMacDigest(str,key,algorithm);
System.out.println("hexStr: " + hmacStr);
//hexStr: 67af93ae1d37f975e3ab8660900430d82b3fd55819540407eebcb70de0628452
}
/**
* HmacSHA512
* @throws Exception
*/
@Test
public void test3() throws Exception{
//指定密钥(salt)
String key = "123";
String str = "小汪学java";
String algorithm = "HmacSHA512";//算法名对象
String hmacStr = MessageUtils.doMacDigest(str,key,algorithm);
System.out.println("hexStr: " + hmacStr);
//hexStr: 0805bd75e61c3b6f83f293e8a99140a17833b5a2bd463d84b129cfdcf9423be3424ae0c51396f84e539dbda1f9eaaa69ad934329f3f9f69bf54e10c687db8c80
}
}
补充了一下工具类:
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
public class MessageUtils {
private static final String UTF8 = StandardCharsets.UTF_8.name();
/**
* 实现mac编码
* @param originalContent 原始字符串
* @param key mac算法的key
* @param algorithm 算法名字,如MAC,SHA-256,SHA-512,MD5等
* @return
*/
public static String doMacDigest(String originalContent,String key,String algorithm){
try{
//获取消息摘要算法对象
Mac mac = Mac.getInstance(algorithm);
//获取key对象并初始化mac
SecretKey secretKey = new SecretKeySpec(key.getBytes(UTF8), algorithm);
//使用key初始化mac对象
mac.init(secretKey);
//获取原始内容的字节数组
byte[] originalBytes = originalContent.getBytes(UTF8);
//获取摘要结果
byte[] bytes = mac.doFinal(originalBytes);
String hexStr = HexUtils.covertBytes2HexStr(bytes);
return hexStr;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 执行消息摘要
* @param originalContent 原始字符串
* @param algorithm 算法名,如MD5
* @return 摘要内容
*/
public static String doDigest(String originalContent,String algorithm){
try{
//获取消息摘要算法对象
MessageDigest md = MessageDigest.getInstance(algorithm);
//获取原始内容的字节数组
byte[] bytes = originalContent.getBytes(UTF8);
//获取摘要结果
byte[] digestBytes = md.digest(bytes);
String hexStr = HexUtils.covertBytes2HexStr(digestBytes);
return hexStr;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}