java的HMACSHA1加密演算法
阿新 • • 發佈:2019-02-14
前期做一個和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; } }