2014-10-09 92 views
0

我試圖在javascript中生成一個hmac哈希。用python代碼在Javascript中生成Hmac

這裏是一些Python代碼我想在Javascript中複製:

mac = hmac.new("33fsfsdgvwrg2g223f4f42gf4f34f43f", digestmod=hashlib.sha1) 
mac.update(method) 
mac.update(url) 
mac.update(data) 
mac.update(str(timestamp)) 

r = requests.request(method, url, data=data, headers={ 
    'Content-Type': 'application/json', 
    'Authorization': " signature="'mac.hexdigest()'" ", 
}) 

這是我迄今爲止,它似乎並沒有被我所需要的:

var message = "shah me"; 
var secret = "33fsfsdgvwrg2g223f4f42gf4f34f43f"; 
var crypto = CryptoJS.HmacSHA1(message, secret).toString(CryptoJS.enc.Base64); 

var shaObj = new jsSHA('shah me', "ASCII"); 
var jssha = shaObj.getHMAC('33fsfsdgvwrg2g223f4f42gf4f34f43f', "ASCII", "SHA-1", "B64"); 

回答

2

它看起來像你的「當前的解決方案」只是一個jsSHA, CryptoJS and OpenSSL libraries giving different results與您的密鑰替換的複製粘貼。

無論如何,你不需要同時使用CryptoJS和jsSHA。你應該選擇一個並堅持下去。

根據the docs,python mac.update函數等同於將數據附加到消息。我相信這是你的問題的關鍵,因爲CryptoJS和jsSHA都沒有相同的更新功能,而是期望你有完整的信息開始。

下面的Python代碼和它後面的Javascript代碼是相同的:

import hashlib 
import hmac 

method = 'method' 
url = 'url' 
data = 'data' 
timestamp = 'timestamp' 

mac = hmac.new("33fsfsdgvwrg2g223f4f42gf4f34f43f", digestmod=hashlib.sha1) 
mac.update(method) 
mac.update(url) 
mac.update(data) 
mac.update(timestamp) 

print mac.hexdigest() 

這裏是JavaScript:

<script src="sha.js"></script> 
<script> 
    var secret = '33fsfsdgvwrg2g223f4f42gf4f34f43f'; 
    var message = 'methodurldatatimestamp'; 
    var shaObj = new jsSHA(message, "ASCII"); 
    document.write(shaObj.getHMAC(secret, "ASCII", "SHA-1", "HEX")); 
</script> 

注意,Javascript代碼放在完整的消息('methodurldatatimestamp')在jsSHA的構造函數。我相信這是你的問題的關鍵。希望這可以幫助!