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

java的HMACSHA1加密演算法

前期做一個和Q+相關的專案時,雙方要進行一些資料的校驗,對方規定的校驗規則是通過hmac-sha1演算法(fcg語言採用hash_hmac方法),並給出了一個例子:sig=hash_hmac("sha1","app_id=10001app_lang=2052app_nonce=%E6%B5%8B%E8%AF%95app_ts=1287729243", "myappsecret")=8ba33c7db1ae3d3bd7b1f85edfb42345f840b23c。

上網查了下這是PHP的一個函式,好像java中還沒有現成的,費了挺大勁,查了好半天,最後搞定了,故記錄下來,程式碼如下:

畢竟這方面接觸的還是比較少,先比葫蘆畫瓢的用下吧,感覺這種根據約定的key進行加密的方式還是不錯的。

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;


public class HMACSHA1 {   
  
    private static final String HMAC_SHA1 = "HmacSHA1";   
   
     /**  
      * 生成簽名資料  
      *   
      * @param data 待加密的資料  
      * @param key  加密使用的key  
      * @throws InvalidKeyException  
      * @throws NoSuchAlgorithmException  
      */  
     public static String getSignature(String data,String key) throws Exception{
      byte[] keyBytes=key.getBytes();
         SecretKeySpec signingKey = new SecretKeySpec(keyBytes, HMAC_SHA1);   
         Mac mac = Mac.getInstance(HMAC_SHA1);   
         mac.init(signingKey);   
         byte[] rawHmac = mac.doFinal(data.getBytes());
         StringBuilder sb=new StringBuilder();
         for(byte b:rawHmac){
          sb.append(byteToHexString(b));
         }
         return sb.toString();   
     }
     
     private static String byteToHexString(byte ib){
      char[] Digit={
        '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'
      };
      char[] ob=new char[2];
      ob[0]=Digit[(ib>>>4)& 0X0f];
      ob[1]=Digit[ib & 0X0F];
      String s=new String(ob);
      return s;         
     }     
 }