Javascript 如何使SJCL和Python hashlib生成相同的pdkdf2输出

Javascript 如何使SJCL和Python hashlib生成相同的pdkdf2输出,javascript,python,hmac,Javascript,Python,Hmac,我有一个JavaScript应用程序和一个Python应用程序,它们使用从使用pbdkf2的密码派生的密钥进行通信。问题是,生成的密钥不匹配。我为每一个都生成了一个最小的测试用例 Python import hashlib, binascii bytes = hashlib.pbkdf2_hmac('sha256', "password".encode(), b'', 100000) print(binascii.hexlify(bytes).decode()) 生成:64A868D4B23A

我有一个JavaScript应用程序和一个Python应用程序,它们使用从使用pbdkf2的密码派生的密钥进行通信。问题是,生成的密钥不匹配。我为每一个都生成了一个最小的测试用例

Python

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

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>

var hmacSHA256=函数(键){
var hasher=new sjcl.misc.hmac(key,sjcl.hash.sha256);
this.encrypt=函数(){
返回hasher.encrypt.apply(hasher,参数);
};
};
hash=sjcl.misc.pbkdf2(“密码”[0],100000,256,hmacSHA256);
log(sjcl.codec.hex.fromBits(散列));
生成:
41c04f824d843d5be0ae66b3f621d3f05db7d47e7c46ee0e9171b5cbff7f3631


我现在经常挠头。我认为
b'
[0]
是等效的盐,但我不确定。我想他们都使用utf-8编码密码,但我不确定。我不相信JavaScript hmacSHA256函数与Python的功能完全匹配。或者可能是别的什么东西。

从我的头顶,你检查过了吗

hash = sjcl.misc.pbkdf2("password", "", 100000, 256);
给出正确的结果

据我所知,如果您没有显式地为SJCL的PBKDF2实现指定PRF,那么它的PBKDF2实现默认为HMAC-SHA256。如果进行更改修复了错误,那么您的
hmacSHA256
包装器可能有问题


另外,我不确定将空盐指定为
[0]
是否真的有效(或者保证在未来的版本中有效,因为SJCL的位数组的格式是),但是
肯定会有效。

这是基于我最近的经验为其他人分享的

我的目标:

使用Python生成PBKDF2密码。客户端将是Android(Java),后端将是Flask(Python)

问题:

在测试过程中,我发现两个版本(Java和Python)产生了不同的散列输出(所有其他参数都是相同的——SHA2561000次迭代,类似SALT)

我发现: 使用互联网上可用的PBKDF2生成工具,Android的结果是完全匹配的,而Python则不是。因此,Python的结果很有可能是有偏差的

问题已解决:

在寻找SO中可能的解释时,我发现我在Python中将字符串转换为字节的方式并不完全正确:

原始代码:

dk = hashlib.pbkdf2_hmac('sha256', b'base64_message', b'salt', 1000)
工作代码:

dk = hashlib.pbkdf2_hmac('sha256', base64_message.encode(), salt.encode(), 1000)
这可能是因为我缺乏Python方面的经验。希望本说明对其他人有用,尤其是对Python不熟悉的人