2017-03-12 55 views
3

我有一個JavaScript應用程序和一個Python應用程序,使用pbdkf2從密碼派生的密鑰進行通信。問題是,生成的密鑰不匹配。我爲每個人製作了一個最小的測試用例。如何使SJCL和Python hashlib生成相同的pdkdf2輸出

的Python

import hashlib, binascii 
bytes = hashlib.pbkdf2_hmac('sha256', "password".encode(), b'', 100000) 
print(binascii.hexlify(bytes).decode()) 

生成:64a868d4b23af696d3734d0b814d04cdd1ac280128e97653a05f32b49c13a29a

的JavaScript

<script src="lib/sjcl.js"></script> 
<script> 
var hmacSHA256 = function (key) { 
    var hasher = new sjcl.misc.hmac(key, sjcl.hash.sha256); 
    this.encrypt = function() { 
     return hasher.encrypt.apply(hasher, arguments); 
    }; 
}; 
hash = sjcl.misc.pbkdf2("password", [0], 100000, 256, hmacSHA256); 
console.log(sjcl.codec.hex.fromBits(hash)); 
</script> 

生成:41c04f824d843d5be0ae66b3f621d3f05db7d47e7c46ee0e9171b5cbff7f3631

我現在很抓我的頭。我認爲b''[0]是等效鹽,但我不確定。我認爲他們都使用utf-8來編碼密碼,但我不確定。而且我不相信JavaScript hmacSHA256函數完全符合Python正在做的事情。或者它可能還是其他的東西。

回答

4

關閉我的頭頂,你檢查,如果

hash = sjcl.misc.pbkdf2("password", "", 100000, 256); 

給出正確的結果?

據我所知,從docs,SJCL的PBKDF2實現默認爲HMAC-SHA256,如果你沒有明確給它一個PRF。如果進行修改可以修復錯誤,那麼您的hmacSHA256包裝可能有問題。

而且,我不知道,如果指定一個空鹽[0]真正的作品(或保證在未來版本中的工作,因爲SJCL的bitArrays的格式爲explicitly subject to change),但""絕對應該工作。

相關問題