与 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
在开头和结尾添加双引号,并将所有换行符(和大多数其他空白字符)替换为两个字符 \n
。 msg
的长度为 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)
这里可以看到msg
和JSON.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);
我一生都被困在这个问题上。
我在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
在开头和结尾添加双引号,并将所有换行符(和大多数其他空白字符)替换为两个字符 \n
。 msg
的长度为 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)
这里可以看到msg
和JSON.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);