2017-03-12 24 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),但""绝对应该工作。

相关问题