1. 程式人生 > >HMACSHA1 加密演算法

HMACSHA1 加密演算法

https://blog.csdn.net/z69183787/article/details/78393216

***********************************************************

HMACSHA1 是從 SHA1 雜湊函式構造的一種鍵控雜湊演算法,被用作 HMAC(基於雜湊的訊息驗證程式碼)。 此 HMAC 程序將金鑰與訊息資料混合,使用雜湊函式對混合結果進行雜湊計算,將所得雜湊值與該金鑰混合,然後再次應用雜湊函式。 輸出的雜湊值長度為 160 位。

在傳送方和接收方共享機密金鑰的前提下,HMAC 可用於確定通過不安全通道傳送的訊息是否已被篡改。 傳送方計算原始資料的雜湊值,並將原始資料和雜湊值放在一個訊息中同時傳送。 接收方重新計算所接收訊息的雜湊值,並檢查計算所得的 HMAC 是否與傳送的 HMAC 匹配。

因為更改訊息和重新生成正確的雜湊值需要金鑰,所以對資料或雜湊值的任何更改都會導致不匹配。 因此,如果原始的雜湊值與計算得出的雜湊值相匹配,則訊息通過身份驗證。

SHA-1(安全雜湊演算法,也稱為 SHS、安全雜湊標準)是由美國政府釋出的一種加密雜湊演算法。 它將從任意長度的字串生成 160 位的雜湊值。

HMACSHA1 接受任何大小的金鑰,併產生長度為 160 位的雜湊序列。

package com.hujl.oauth.signature;
 
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
 
public class HMACSHA1 {
 
	private static final String MAC_NAME = "HmacSHA1";  
    private static final String ENCODING = "UTF-8";  
    
	/*
	 * 展示了一個生成指定演算法金鑰的過程 初始化HMAC金鑰 
	 * @return 
	 * @throws Exception
	 * 
	  public static String initMacKey() throws Exception {
	  //得到一個 指定演算法金鑰的金鑰生成器
	  KeyGenerator KeyGenerator keyGenerator =KeyGenerator.getInstance(MAC_NAME); 
	  //生成一個金鑰
	  SecretKey secretKey =keyGenerator.generateKey();
	  return null;
	  }
	 */
    
    /** 
     * 使用 HMAC-SHA1 簽名方法對對encryptText進行簽名 
     * @param encryptText 被簽名的字串 
     * @param encryptKey  金鑰 
     * @return 
     * @throws Exception 
     */  
    public static byte[] HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception   
    {         
    	byte[] data=encryptKey.getBytes(ENCODING);
    	//根據給定的位元組陣列構造一個金鑰,第二引數指定一個金鑰演算法的名稱
        SecretKey secretKey = new SecretKeySpec(data, MAC_NAME); 
        //生成一個指定 Mac 演算法 的 Mac 物件
        Mac mac = Mac.getInstance(MAC_NAME); 
        //用給定金鑰初始化 Mac 物件
        mac.init(secretKey);  
        
        byte[] text = encryptText.getBytes(ENCODING);  
        //完成 Mac 操作 
        return mac.doFinal(text);  
    }  
}

***************************************

password=`echo -en "$date" | openssl dgst -sha1 -hmac $apiKey -binary | openssl enc -base64`

等價於

HmacSHA1Encrypt(String $date, String $apiKey) 然後base64編碼