nodejs 加密 js 与 python sha256

nodejs crypto-js vs python sha256

我对 crypto-js 和 python sha256 有疑问。它想为duplicati 编写一个nodejs 客户端。所以我尝试将一些 python 代码移植到 js.

https://github.com/Pectojin/duplicati-client/blob/master/auth.py#L136

Javascript

const CryptoJS = require('crypto-js');

function sha256(to_sign) {  
    var hash = CryptoJS.SHA256(to_sign.toString());
    var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
    return hashInBase64.toString('utf-8');
}

let salt = "ZAwQqEAAwR78oZOxFu0nVH2FLy/BnulVxhuu9IOnBwg="
let salt2 = "YQ=="
let password = "abc"

let saltedpwd = sha256(Buffer.concat([Buffer.from(password),Buffer.from(salt,'base64')]));
let saltedpwd2 = sha256(Buffer.concat([Buffer.from(password),Buffer.from(salt2,'base64')]));

let new_password = saltedpwd.toString('base64');
let new_password2 = saltedpwd2.toString('base64');
console.log(new_password)
console.log(new_password2)

returns:

pw1: 0udYFffMXd2QWW9dVXbFl3qp/6lnRcnspr4M1VEtgJA=
pw2: XD9nt/qE374RGDh8rRR5OSmEWlvHwAgMTYMJ03uqaNA=

Python

import base64
import hashlib
import sys

password = "abc"
salt = "ZAwQqEAAwR78oZOxFu0nVH2FLy/BnulVxhuu9IOnBwg="
salt2 = "YQ=="

salt_password = password.encode() + base64.b64decode(salt)
saltedpwd = hashlib.sha256(salt_password).digest()
print (base64.b64encode(saltedpwd).decode('utf-8'))

salt_password2 = password.encode() + base64.b64decode(salt2)
saltedpwd2 = hashlib.sha256(salt_password2).digest()
print (base64.b64encode(saltedpwd2).decode('utf-8'))

returns:

pw1: v9bAzxPatGzA2W7ORkraUvh+nyXotWXItAKpawGSo+A=
pw2: XD9nt/qE374RGDh8rRR5OSmEWlvHwAgMTYMJ03uqaNA=

如您所见,pw2 和非常简单的 base64 盐是相同的。 pw1的salt来自duplicati服务​​器,所以我无法控制它...

我已经尝试了很多编码组合、CryptoJS 选项,所以我很快就会停止 'project'... :(

你能给我任何建议吗,我做错了什么?如果有任何信息,我会很高兴。

此致, 本杰明

你已经完成了 99%,我认为修复是一个班轮(不是经常发生吗!)。

我们只需要改变

var hash = CryptoJS.SHA256(to_sign.toString());

var hash = CryptoJS.SHA256(CryptoJS.lib.WordArray.create(to_sign));

我相信这是因为我们想直接从我们通过连接密码和盐创建的缓冲区进行转换,而不是转换为字符串,这会导致计算出错误的哈希值。

无论如何,我们得到与Python代码相同的输出,这就是我们想要的,即

v9bAzxPatGzA2W7ORkraUvh+nyXotWXItAKpawGSo+A=
XD9nt/qE374RGDh8rRR5OSmEWlvHwAgMTYMJ03uqaNA=

新代码在 Node.js 中看起来像这样:

const CryptoJS = require('crypto-js');

function sha256(to_sign) {  
    var hash = CryptoJS.SHA256(CryptoJS.lib.WordArray.create(to_sign));
    var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
    return hashInBase64.toString('utf-8');
}

let salt = "ZAwQqEAAwR78oZOxFu0nVH2FLy/BnulVxhuu9IOnBwg="
let salt2 = "YQ=="
let password = "abc"

let saltedpwd = sha256(Buffer.concat([Buffer.from(password),Buffer.from(salt,'base64')]));
let saltedpwd2 = sha256(Buffer.concat([Buffer.from(password),Buffer.from(salt2,'base64')]));

let new_password = saltedpwd.toString('base64');
let new_password2 = saltedpwd2.toString('base64');
console.log(new_password)
console.log(new_password2)