与 JS 和 Python 中的 sha1 不同的摘要?

Different digest from sha1 in JS and Python?

我一生都被困在这个问题上。

我在python3

中有这个东西
msg = "6NmByERB9ZDJX9OKDtIzpGl8ei7KBiYI"+"\n"+"1623776851607"+"\n"+"/api2/v2/users/me"+"\n"+"0"
message = msg.encode('utf-8')
hash_object = hashlib.sha1(message)
sha_1_sign = hash_object.hexdigest()
print(sha_1_sign)
# 4ff521a9b87ddd0dea00a842f8f5d72819f9df0a

但我无法在 NodeJS 中获取相同的哈希值,我尝试了很多解决方案; 起初我以为这是第一部分,编码为 utf-8,因为打印返回不同的结果,但似乎不是这样,它只是同一字符串的不同表示。

我在 JS 中的方法:

const crypto = require('crypto') // maybe another library that works in browser? 
const msg = "6NmByERB9ZDJX9OKDtIzpGl8ei7KBiYI"+"\n"+"1623776851607"+"\n"+"/api2/v2/users/me"+"\n"+"0"
let shasum = crypto.createHash('sha1')
shasum.update(JSON.stringify(msg))
let hashed_string = shasum.digest('hex')
console.log(hashed_string)
// c838ca6f79551d828d6e4a810bd49c1df07b54a3

感谢您的帮助:)

不要JSON.stringify 消息。 JSON.stringify 在开头和结尾添加双引号,并将所有换行符(和大多数其他空白字符)替换为两个字符 \nmsg 的长度为 66,JSON.stringify(msg) 的长度为 71。此代码生成预期的 SHA1 值:

const crypto = require('crypto') // maybe another library that works in browser? 
const msg = "6NmByERB9ZDJX9OKDtIzpGl8ei7KBiYI"+"\n"+"1623776851607"+"\n"+"/api2/v2/users/me"+"\n"+"0"
let shasum = crypto.createHash('sha1')
shasum.update(msg)
let hashed_string = shasum.digest('hex')
console.log(hashed_string)

这里可以看到msgJSON.stringify(msg)的区别:

const msg = "6NmByERB9ZDJX9OKDtIzpGl8ei7KBiYI"+"\n"+"1623776851607"+"\n"+"/api2/v2/users/me"+"\n"+"0"

console.log(msg)
console.log(JSON.stringify(msg));
console.log(msg.length)
console.log(JSON.stringify(msg).length);
console.log(JSON.stringify(msg) === msg);