繁体   English   中英

Javascript HMAC 和 Python HMAC 不返回相同 hash

[英]Javascript HMAC and Python HMAC not returning same hash

我目前有一个看起来像这样的 Javascript 代码

var CryptoJS = require("crypto-js");

var key = "bookbookbook";
var msg = "2020-06-16 20:03:19";

var signature = CryptoJS.HmacSHA1(msg, key);
var checksum = CryptoJS.enc.Utf8.parse(signature);

console.log("checksum: " + CryptoJS.enc.Base64.stringify(checksum));

校验和为 ODNjOWY5NThmYzUxODNkYWM1MjhjZTY3ZTYzYmQxNjE1ZDRkZDQ5Zg==

我试图将其转换为 Python

import base64
import time
import hmac
import hashlib

key = "bookbookbook".encode(encoding='utf-8')
msg = "2020-06-16 20:03:19".encode(encoding='utf-8')

digest = hmac.new(key, msg, hashlib.sha1).digest()
checksum = base64.b64encode(digest).decode('utf-8')

print(checksum)

但返回的校验和是这个 g8n5WPxRg9rFKM5n5jvRYV1N1J8=

我如何使它返回相同?

此步骤是不必要的,并且会转换您的数据,从而导致结果错误: var checksum = CryptoJS.enc.Utf8.parse(signature); Utf8.parse用于将 UTF-8 字符串转换为 wordsArray,但由于CryptoJS.HmacSHA1的调用,您已经有了 wordsArray)

您的代码应该是:(负责将变量名称更改为更合适的名称)

var CryptoJS = require("crypto-js");

var key = "bookbookbook";
var msg = "2020-06-16 20:03:19";

var encrypted = CryptoJS.HmacSHA1(msg, key);

console.log("encrypted in Base64: " + CryptoJS.enc.Base64.stringify(encrypted));

在小提琴中看到它,你会看到与 python 代码相同的结果

我找到了解决方案。 虽然我同意 Kaddath 的 Javascript 很烂,但我无法更改它,因为 1)它已经使用并运行了好几年,2)我正在做一个 Python 的端口,而不是修复/更新原始代码和3)“da bossman”说只是端口不修复

这是产生相同 output 的 Python 代码:

import base64
import time
import hmac
import hashlib
import binascii

key = "bookbookbook".encode(encoding='utf-8')
msg = "2020-06-16 20:03:19".encode(encoding='utf-8')

digest = hmac.new(key, msg, hashlib.sha1).digest()

checksum = base64.b64encode(binascii.hexlify(bytearray(digest)))
print("checksum: ", checksum.decode('utf-8'))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM