1. 程式人生 > >【驗籤演算法 HMAC-MD5】實現HMacMD5加密

【驗籤演算法 HMAC-MD5】實現HMacMD5加密

什麼是 HMAC-MD5?

1、比如你和對方共享了一個金鑰K,現在你要發訊息給對方,既要保證訊息沒有被篡改,又要能證明資訊確實是你本人發的,那麼就把原資訊和使用K計算的HMAC的值一起發過去。對方接到之後,使用自己手中的K把訊息計算一下HMAC,如果和你傳送的HMAC一致,那麼可以認為這個訊息既沒有被篡改也沒有冒充。

2、MD5就是通過雜湊對要輸出的資料進行摘要,接收到資料時,再同樣進行MD5雜湊,與給定的MD5雜湊值比較,一致不一致就很清楚了。通常來說,傳輸的資料和MD5是不同的渠道給出的,比如網頁上顯示MD5,下載連結是某個映象網站的。如果要通過同一個渠道傳送資料和雜湊值的話(比如訊息認證碼),就要考慮資料和MD5同時被篡改的問題,如果第三方修改了資料,然後進行MD5雜湊,並一塊發給接收方,接收方並不能察覺到資料被篡改。HMAC-MD5就可以用一把傳送方和接收方都有的key進行計算,而沒有這把key的第三方是無法計算出正確的雜湊值的,這樣就可以防止資料被篡改。

python 版:

#coding:utf-8

import sys
reload(sys)
sys.setdefaultencoding('utf-8')


import hmac
import hashlib

####################設定Key值##############
ekey = 'laidefa'

###############輸入資料############
to_enc = '{"name":"zhangsan"}'

enc_res = hmac.new(ekey, to_enc, hashlib.md5).hexdigest()
print enc_res

輸出結果:

"D:\Program Files\Python27\python.exe" D:/PycharmProjects/learn2017/hmacmd5.py
2cbb94ce78b35e4030851c4d40dacf12

Process finished with exit code 0

java版:

package tom;

import java.security.MessageDigest;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import
javax.crypto.spec.SecretKeySpec; /** * 基礎加密元件 * @version 1.0 */ public class Hmacmd5 { /** * MAC演算法可選以下多種演算法 * * <pre> * HmacMD5 * HmacSHA1 * HmacSHA256 * HmacSHA384 * HmacSHA512 * </pre> */ public static final String KEY_MAC = "HmacMD5"; /** * HMAC加密 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptHMAC(byte[] data, String key) throws Exception { SecretKey secretKey = new SecretKeySpec(key.getBytes(), KEY_MAC); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); return mac.doFinal(data); } /*byte陣列轉換為HexString*/ public static String byteArrayToHexString(byte[] b) { StringBuffer sb = new StringBuffer(b.length * 2); for (int i = 0; i < b.length; i++) { int v = b[i] & 0xff; if (v < 16) { sb.append('0'); } sb.append(Integer.toHexString(v)); } return sb.toString(); } public static void main(String[] args)throws Exception{ String inputStr = "{\"name\":\"zhangsan\"}"; byte[] inputData = inputStr.getBytes(); String key = "laidefa"; System.out.println(Hmacmd5.byteArrayToHexString(Hmacmd5.encryptHMAC(inputData, key))); } }

輸出結果:

2cbb94ce78b35e4030851c4d40dacf12

跟python一樣。