我有一个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正在做的事情。或者它可能还是其他的东西。