【问题标题】:nodejs crypto-js vs python sha256nodejs crypto-js vs python sha256
【发布时间】:2020-12-16 02:41:40
【问题描述】:

我对 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)

返回:

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'))

返回:

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

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

我已经尝试了许多编码组合、CryptoJS 选项,所以我即将停止我的“项目”... :(

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

问候, 本杰明

【问题讨论】:

    标签: python node.js sha256


    【解决方案1】:

    您已经完成了 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 2021-03-13
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多