NodeJS python和javascript中的散列返回不同的结果

uurv41yg  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(108)

我有一些遗留的python脚本,用于单向加密数据库存储的密码

import base64, hashlib

def encrypt(passw):

    secret = "SECRET_KEY_HERE"
    passw = secret + passw
    passw = passw.encode('utf-8')
    m = hashlib.sha256()
    m.update(passw)
    encoded = base64.b64encode(m.digest()).decode('utf-8')
    return (encoded)

我设法为我们正在使用的现有第三方软件包整合了一个c#版本

private static string Encrypt(string clearText)
        {
            SHA256 sHA256 = SHA256.Create();

            byte[] sourceArray = sHA256.ComputeHash(Encoding.UTF8.GetBytes(EncryptionKey + clearText));

            return Convert.ToBase64String(sourceArray);
        }

这两个都返回相同的结果。我正在尝试使用Next组合一个Web前端,并在注册/登录页面中添加了一个加密函数

const crypto = require('crypto');

export const encrypt = (password: string) :string => {
    const key = process.env.PASS_KEY;
    return crypto.createHash('sha256').update(key + password).digest('base64')  
}

这向其它两个函数返回不同的结果。
我已经检查了所有通常的来源,所有我发现的是,我已经放在一起应该工作正常。
有谁能解释一下为什么这不起作用
更新:
为了增加我的困惑,我将js函数添加到codesandbox的react表单中,它返回正确的结果。
该函数当前仅通过nextauth authorize函数调用,以验证用户的登录,如下所示

const confirmPasswordHash = (plainPassword: string , hashedPassword: string) => {
    
        const res = plainPassword && hashedPassword.localeCompare(encrypt(plainPassword))
        return res === 0 ? true:false
    
}
ctehm74n

ctehm74n1#

Jonathan Ciapetti为我指出了解决这个问题的正确方向。问题确实存在于process.env调用中。
使用的键包括一个美元符号,它反过来又截断了传入的字符串的一部分。我通过转义键中的美元符号解决了这个问题,现在一切都按预期工作。

相关问题