java HMAC_SHA1加密算法
CreationTime--2018年7月14日16点46分
Author:Marydon
1.准备工作
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.log4j.Logger;
/**
* HMAC_SHA1加密算法工具类
* @explain 不可逆算法
* @author Marydon
* @creationTime 2018年7月7日上午11:06:58
* @version 1.0
* @since
* @email
*/
public class HMAC_SHA1Utils {
private static Logger log = Logger.getLogger(HMAC_SHA1Utils.class);
// 加密方法
private static final String MAC_NAME = "HmacSHA1";
// 定义字符集
private static final String ENCODING = "UTF-8";
}
2.HMAC_SHA1加密
/**
* 使用HMAC_SHA1算法进行加密
* @explain
* @param paramStr
* 待加密字符串
* @param key
* 密钥(长度不限、可以为中文、英文、16进制字符串)
* @return 16进制加密字符串,长度固定为40
* @throws Exception
*/
public static String encrypt(String paramStr, String key) {
// 用于存储加密后的16进制字符串
String cipher = "";
try {
//
byte[] data = key.getBytes(ENCODING);
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
// 生成HmacSHA1专属密钥
SecretKey secretKey = new SecretKeySpec(data, MAC_NAME);
// 生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance(MAC_NAME);
// 用给定密钥初始化 Mac 对象
mac.init(secretKey);
byte[] text = paramStr.getBytes(ENCODING);
// 完成 Mac 操作
byte[] encryptByte = mac.doFinal(text);
// 将byte[]-->hexString
cipher = ByteUtils.toHex(encryptByte);
} catch (Exception e) {
e.printStackTrace();
log.error("HMACSHA1加密失败:" + e.getMessage());
}
log.info("HMACSHA1加密结果:" + cipher);
return cipher;
}
3.校验
/**
* 判断源数据与加密数据是否一致
* @explain
* @param srcStr
* 原字符串
* @param secretStr
* 16进制加密字符串
* @param key
* 密钥
* @return 校验结果
*/
public static boolean verify(String srcStr, String secretStr, String key) {
boolean flag = false;
String cipherText = encrypt(srcStr, key);
if (cipherText.equals(secretStr))
flag = true;
return flag;
}
4.测试
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String json = "{"name":"Marydon","website":"http://www.cnblogs.com/Marydon20170307"}";
String key = "测试";
String cipher = HMAC_SHA1Utils.encrypt(json, key);
System.out.println(cipher);
System.out.println(HMAC_SHA1Utils.verify(json, cipher, key));
}