HMAC 的用途
HMAC 算法主要應用于身份驗證,用法如下:
1.客戶端發出登錄請求
2.服務器返回一個隨機值,在會話記錄中保存這個隨機值
3.客戶端將該隨機值作為密鑰,用戶密碼進行 hmac 運算,遞交給服務器
4.服務器讀取數據庫中的用戶密碼,利用密鑰做和客戶端一樣的 hmac運算,然后與用戶發送的結果比較,如果一致,則用戶身份合法。
這么做有什么好處呢? 如果我們在登錄的過程中,黑客截獲了我們發送的數據,他也只能得到 hmac 加密過后的結果,由于不知道密鑰,根本不可能獲取到用戶密碼,從而保證了安全性。
HMAC 的種類
算法種類 摘要長度HmacMD5 128
HmacSHA1 160
HmacSHA256 256
HmacSHA384 384
HmacSHA512 512
HMAC 的使用
1 . 剛才也看到了,想要使用 HMAC 算法,那么我們需要生成一個密鑰,這個密鑰怎么生成呢?自己隨便瞎填嗎? JDK 中自帶了一個密鑰生成器 KeyGenerator
用于幫助我們生成密鑰,示例如下
public static byte[] getSecretKey() throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5"); // 可填入 HmacSHA1,HmacSHA256 等SecretKey key = keyGenerator.generateKey();byte[] keyBytes = key.getEncoded();return keyBytes;
}
2 . 既然已經得到了密鑰,那么下面就開始執行消息摘要算法,在這之前,由于我們生成的密鑰是以 byte 數組返回的,所以我們需要將其還原成 SecretKey
,具體過程如下
public static String encryptHmac(byte[] key, byte[] data) throws Exception {SecretKey secretKey = new SecretKeySpec(key, "HmacMD5");Mac mac = Mac.getInstance("HmacMD5");mac.init(secretKey);byte[] resultBytes = mac.doFinal(data);String resultString = byteToHexString(resultBytes);return resultString;
}
如果想使用其他的算法,可以將填入 HmacMD5
的所有字段改為你想使用的算法即可,比如 HmacSHA1
, HmacSHA256
等。
下面對 helloworld
執行算法查看結果
1efd5e8d4d0c20f68bdc732fd7a79677
鏈接:http://www.jianshu.com/p/3fe2add1eb42