2015-06-22 84 views
2

與不同:OpenSSL的HMAC蟒蛇HMAC

KEY='7vgd39eyxald9sucClM7' 
DATA='POST\nmultipart/form-data\nWed, 10 Jun 2015 07:27:43 GMT\n/1/classes/item\nx-wbs-uid:f886a495220975d724ff3679a5cc9cef04343076' 
在命令行

HASH_BIN=`echo -n "$DATA" | openssl dgst -sha256 -mac HMAC -macopt key:$KEY -binary` 
openssl enc -e -base64 <<< $HASH_BIN 
result: VmBdzRcNg0OJZVVLSgg1zcViflug9iqtb6Gsnjqf9F8K 

在Python

import hmac, hashlib, base64 
hash = hmac.new(KEY, DATA, hashlib.sha256).digest() 
base64.encodestring(hash).strip() 
result: u6Poj7Jqrz6+wvXDNyK88pVm5iKUF6RUmq2P2LtHmuE= 

有人可以給我一個幫助???非常感謝。

+0

你能粘貼整個Python代碼包括鍵和數據定義? –

+0

好問題。我做了實驗,發現了和你一樣的問題。當我試圖使用另一個更簡單的DATA字符串(不帶'\ n')時,openssl和python可以產生相同的結果。所以我發現問題是由python中的字符串定義引起的。 –

回答

2

它應該是由Python代碼中的DATA字符串定義引起的。

您需要添加r治療DATA作爲原始的字符串,如

DATA=r'POST\nmultipart/form-data\nWed, 10 Jun 2015 07:27:43 GMT\n/1/classes...' 

隨着r,在DATA所有的轉義碼將被忽略。也就是說,'\ n'將被視爲換行符,但r'\ n'將被視爲字符\,後跟n。在Python,

'\n' // 0x0d 

r'\n' // 0x5c 0x6e 

隨着r,將輸出結果等於通過OpenSSL的輸出,

VmBdzRcNg0OJZVVLSgg1zcViflug9iqtb6Gsnjqf9F8K