mac(Message Authentication Code,消息認證碼算法)是含有密鑰散列函數算法,相容了MD和SHA算法的特性,并在此基礎上加上了密鑰。
甲乙雙方進行資料交換可以采取如下流程完成
1、甲方向乙方公布摘要算法(就是指定要使用的摘要算法名)
2、甲乙雙方按照約定構造密鑰,雙方擁有相同的密鑰(一般是一方構造密鑰後通知另外一方,此過程不需要通過程式實作,就是雙方約定個字元串,但是這個字元串可不是随便設定的,也是通過相關算法擷取的)
3、甲方使用密鑰對消息做摘要處理,然後将消息和生成的摘要消息一同發送給乙方
import java.nio.charset.Charset;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* MAC消息摘要元件
*
* */
public class MACCoder {
private static final Charset UTF_8 = Charset.forName("UTF-8");
/**
* 初始化HmacSHA256的密鑰
* @return byte[] 密鑰
*
* */
public static byte[] initHmacSHA256Key() throws Exception{
//初始化KeyGenerator
KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA256");
//産生密鑰
SecretKey secretKey=keyGenerator.generateKey();
//擷取密鑰
return secretKey.getEncoded();
}
public static byte[] encodeHmacSHA256_2(byte[] data1,byte[] key) throws Exception{
SecretKey secretKey=new SecretKeySpec(key,"HmacSHA256");
Mac mac=Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
mac.update(data1);
return mac.doFinal();
}
/**
* 進行相關的摘要算法的處理展示
* @throws Exception
* **/
public static void main(String[] args) throws Exception {
String str="2019-12-09T02:27:42-07:00";
System.out.println("原文="+str);
byte[] key=MACCoder.initHmacSHA256Key();
//byte[] key="0X84NSTAokzW1iWCCLFIzP1JYv1utSUT".getBytes(UTF_8);
byte[] datas=MACCoder.encodeHmacSHA256_2(str.getBytes(UTF_8), key);
System.out.println("HmacSHA256的密鑰:"+key.toString());
System.out.println("HmacSHA256算法摘要:"+new String(datas));
System.out.println();
}
}
原文=2019-12-09T02:27:42-07:00
HmacSHA256的密鑰:[B@1ff8b8f
HmacSHA256算法摘要:�