本文實例講述了Python實現的HMacMD5加密算法。分享給大家供大家參考,具體如下:
什么是 HMAC-MD5?
1、比如你和對方共享了一個密鑰K,現在你要發消息給對方,既要保證消息沒有被篡改,又要能證明信息確實是你本人發的,那么就把原信息和使用K計算的HMAC的值一起發過去。對方接到之后,使用自己手中的K把消息計算一下HMAC,如果和你發送的HMAC一致,那么可以認為這個消息既沒有被篡改也沒有冒充。
2、MD5就是通過散列對要輸出的數據進行摘要,接收到數據時,再同樣進行MD5散列,與給定的MD5散列值比較,一致不一致就很清楚了。通常來說,傳輸的數據和MD5是不同的渠道給出的,比如網頁上顯示MD5,下載鏈接是某個鏡像網站的。如果要通過同一個渠道發送數據和散列值的話(比如消息認證碼),就要考慮數據和MD5同時被篡改的問題,如果第三方修改了數據,然后進行MD5散列,并一塊發給接收方,接收方并不能察覺到數據被篡改。HMAC-MD5就可以用一把發送方和接收方都有的key進行計算,而沒有這把key的第三方是無法計算出正確的散列值的,這樣就可以防止數據被篡改。
python 版:
1
2
3
4
5
6
7
8
9
10
11
12
|
#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版:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
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程序設計有所幫助。
原文鏈接:https://blog.csdn.net/u013421629/article/details/78355711