天天看點

HmacSHA256摘要算法

  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算法摘要:�