package com.security.hmac;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* @author Administrator
* hmac加密
*/
public class Hmac {
private final static String KEY_MAC = "HmacMD5";
/**
* 全局数组
*/
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
/**
* 测试方法
* @param args
*/
public static void main(String[] args) throws Exception {
String key = Hmac.init();
System.out.println("Mac密钥___:" + key);
String generalStr = "123456";
System.out.println(hmacEncode(key,generalStr));
}
/**
* 初始化HMAC密钥
* 转十六进制的字符串秘钥太他妈长 主要说明个意思
* 基本都选用base编码一下 在解码
* @return
*/
public static String init() {
String key="";
try {
KeyGenerator generator = KeyGenerator.getInstance(KEY_MAC);
SecretKey secretKey= generator.generateKey();
key = bytesToHexString(secretKey.getEncoded());
} catch (Exception e) {
e.printStackTrace();
}
return key;
}
/**
* hmac 加密
* @param key hmac秘钥
* @param generalStr 明文
* @return
*/
public static String hmacEncode(String key,String generalStr){
String hmacStr="";
try {
SecretKey secretKey=new SecretKeySpec(key.getBytes("UTF-8"), KEY_MAC);
Mac mac=Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
byte[]bytes=generalStr.getBytes("UTF-8");
hmacStr=bytesToHexString(mac.doFinal(bytes));
} catch (Exception e) {
e.printStackTrace();
}
return hmacStr;
}
/**
* 转换字节数组为十六进制字符串
* @param bytes字节数组
* @return 十六进制字符串
*/
@SuppressWarnings("unused")
private static String bytesToHexString(byte[] bytes) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
int ret = bytes[i];
if (ret < 0) {
ret += 256;
}
int n = ret % 16;
int m = ret / 16;
sb.append(hexDigits[m] + hexDigits[n]);
}
return sb.toString();
}
}
//运行结果
//摘要后对比