Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中生成与在Python 3中相同的SHA256编码字符串?_Javascript_Python_Node.js_Python 3.x_Cryptography - Fatal编程技术网

如何在Javascript中生成与在Python 3中相同的SHA256编码字符串?

如何在Javascript中生成与在Python 3中相同的SHA256编码字符串?,javascript,python,node.js,python-3.x,cryptography,Javascript,Python,Node.js,Python 3.x,Cryptography,我有一个Python脚本,它生成正确的输出: 导入hashlib 用户名=“登录用户” password=“LoginPass” nonce=“1234567890” def LowerCase(s):返回s.lower() def Hex(s):返回“”。加入([Hex(char)[2:]表示s中的字符) defsha1(s):h=hashlib.SHA1();h、 更新;返回h.摘要() def SHA1Raw(s):h=hashlib.sha1();h、 更新;返回h.hexdigest(

我有一个Python脚本,它生成正确的输出:

导入hashlib
用户名=“登录用户”
password=“LoginPass”
nonce=“1234567890”
def LowerCase(s):返回s.lower()
def Hex(s):返回“”。加入([Hex(char)[2:]表示s中的字符)
defsha1(s):h=hashlib.SHA1();h、 更新;返回h.摘要()
def SHA1Raw(s):h=hashlib.sha1();h、 更新;返回h.hexdigest()
defsha256(s):h=hashlib.SHA256();h、 更新;返回h.摘要()
def SHA256Raw(s):h=hashlib.sha256();h、 更新;返回h.hexdigest()
def UTF8Encode(s):返回str.encode(s)
step1=SHA256((UTF8Encode(用户名)))
步骤2=SHA1((UTF8Encode(密码)))
步骤3=SHA256Raw(步骤1+步骤2)
step1=SHA256Raw((UTF8Encode(用户名)))
步骤2=SHA1Raw((UTF8Encode(密码)))
打印(“”)
SHA256(用户名={username})={step1}
SHA1(密码={password})={step2}
SHA256((用户名+密码)={username}{password})={step3}
“”格式(
用户名=用户名,
密码=密码,
步骤1=步骤1,
步骤2=步骤2,
步骤3=步骤3
))
输出:

PS D:\project> python .\test.py
SHA256(username=LoginUser)                            =    7981673b2c73a6bdb665f347dc89e9d324f542b1fa1c4a700bc523d8a9a6f565  
SHA1(password=LoginPass)                              =    df703733447469593d39a125ca93462eade53cab
SHA256((username + password)=LoginUserLoginPass)     =    cf3066e157468d6a9d59f9ff0662e4f8f8432be4e07c68320a8b6a031d0c022b
PS D:\project> node .\test.js


SHA256(username=LoginUser)                            =    7981673b2c73a6bdb665f347dc89e9d324f542b1fa1c4a700bc523d8a9a6f565
SHA1(password=LoginPass)                              =    df703733447469593d39a125ca93462eade53cab
SHA256((username + password)=LoginUserLoginPass)      =    757101f0fd2628ce12dc039146f56da14a1e85a27fda5d68c2623f616c4fc3cc
现在在Javascript中,我尝试镜像Python中的函数。我一辈子都不能。在这种情况下,我试图快速理解缓冲区和流,但我相信我只是因为没有扎根于某些东西而使自己更加困惑

无论如何,这里是Javascript版本及其输出:

const crypto=require('crypto'))
const username=“登录用户”
const password=“LoginPass”
const nonce=“1234567890”
const LowerCase=s=>s.toLowerCase()
常量Hex=s=>Buffer.from(s,'utf8').toString('Hex'))
const SHA1=s=>crypto.createHash('SHA1').update(s,'utf8').digest('hex'))
const SHA1Raw=s=>crypto.createHash('sha1').update(s,'utf8').digest()
常量SHA256=s=>crypto.createHash('SHA256')。更新(s,'utf8')。摘要('hex'))
const SHA256Raw=s=>crypto.createHash('sha256').update(s,'utf8').digest()
const UTF8Encode=s=>Buffer.from(s,'utf8');
让step1=SHA256(用户名)
让步骤2=SHA1(密码)
设步骤3=SHA256Raw(步骤1.concat(步骤2))
console.log(`
SHA256(用户名=${username})=${step1}
SHA1(密码=${password})=${step2}
SHA256((用户名+密码)=${username+密码})=${step3.toString('hex')}
`)
输出:

PS D:\project> python .\test.py
SHA256(username=LoginUser)                            =    7981673b2c73a6bdb665f347dc89e9d324f542b1fa1c4a700bc523d8a9a6f565  
SHA1(password=LoginPass)                              =    df703733447469593d39a125ca93462eade53cab
SHA256((username + password)=LoginUserLoginPass)     =    cf3066e157468d6a9d59f9ff0662e4f8f8432be4e07c68320a8b6a031d0c022b
PS D:\project> node .\test.js


SHA256(username=LoginUser)                            =    7981673b2c73a6bdb665f347dc89e9d324f542b1fa1c4a700bc523d8a9a6f565
SHA1(password=LoginPass)                              =    df703733447469593d39a125ca93462eade53cab
SHA256((username + password)=LoginUserLoginPass)      =    757101f0fd2628ce12dc039146f56da14a1e85a27fda5d68c2623f616c4fc3cc

有人能帮忙吗?

您只需要做一个很小的修改,就可以在Node.js中实现这一点

我建议将散列计算为缓冲区对象,这使得组合散列更容易计算(因为我们不需要从十六进制解析)

我们通过使用来连接前面散列的输出来实现这一点

const crypto = require('crypto')

const username = "LoginUser"
const password = "LoginPass"
const nonce = "1234567890"

const LowerCase = s => s.toLowerCase()
const Hex = s => Buffer.from(s, 'utf8').toString('hex')

const SHA1 = s => crypto.createHash('sha1').update(s, 'utf8').digest('hex')
const SHA1Raw = s => crypto.createHash('sha1').update(s, 'utf8').digest()

const SHA256 = s => crypto.createHash('sha256').update(s, 'utf8').digest('hex')
const SHA256Raw = s => crypto.createHash('sha256').update(s, 'utf8').digest()

const UTF8Encode = s => Buffer.from(s, 'utf8');


let step1 = SHA256Raw(username) // Get the SHA256 as a buffer.
let step2 = SHA1Raw(password) // Get the SHA1 as a buffer.
let step3 = SHA256Raw(Buffer.concat([step1, step2])) // Get the SHA256 of the previous steps concatenated as a buffer.

console.log(`
SHA256(username=${username})                            =    ${step1.toString('hex')}
SHA1(password=${password})                              =    ${step2.toString('hex')}
SHA256((username + password)=${username+password})      =    ${step3.toString('hex')}
`)
这将给出正确的结果,例如

SHA256(username=LoginUser)                            =    7981673b2c73a6bdb665f347dc89e9d324f542b1fa1c4a700bc523d8a9a6f565
SHA1(password=LoginPass)                              =    df703733447469593d39a125ca93462eade53cab
SHA256((username + password)=LoginUserLoginPass)      =    cf3066e157468d6a9d59f9ff0662e4f8f8432be4e07c68320a8b6a031d0c022b

无论你在做什么,都不要像那样保存密码。使用合适的密码散列函数,如Argon2。这是5的前3个阶段,用于散列第三方API AuthenticationRequest的密码。您的原始和十六进制编码的散列看起来很混乱
757101F0FD2628CE12DC039146F56DA14A1E85A27FDA5D68C2623F616C4FC3C是十六进制字符串的sha256散列
7981673b2c73a6bdb665f347dc89e9d324f542b1fa1c4a700bc523d8a9a6f565
+
DF70373344474695D39A125CA93462EADE53CAB
。您的Python代码正在计算相应字节数组的哈希值[0x79、0x81、0x67、0x2c、0x73、0xa6等]@r3mainer在javascript中如何计算字节数组的哈希值?我试着创建一个缓冲区并循环更新散列,但这给了我相同的输出。为什么不在计算散列之前呢?谢谢!工作完美无瑕。我尝试了前面提到的将step1+2字符串转换为字节数组的方法,但得到了错误的结果。我想我没有看到这里的解决方案是Buffer.concat()方法。我再次表示最衷心的感谢。我将阅读Javascript中的缓冲区类型,并尝试更清楚地了解这里发生了什么。从十六进制解析似乎是一个多余/不必要的步骤,因此我必须进一步理解为什么会这样。很高兴听到这个消息,Python似乎可以更无缝地处理连接。Buffer.concat是一个真正的节点。在任何情况下,这都是一个小小的改变,但是是的,试图找到最后一行代码可能会令人沮丧!