hmac 512 从 Node.js 迁移到 Python 3.6 结果不匹配

The hmac 512 migration from Node.js to Python 3.6 results does not match

现在我正在开发从 Node.js 到 Python 3.6 的 hmac 512 迁移。两种代码产生不同的结果。 Node.js 结果是正确的。目标是生成 Python 3.6 代码。我应该在哪里解决这个问题?

(1) Node.js

var crypto = require('crypto');

var data = {
    'request' : '/api/v1/account/balances',
    'nonce'   : 1589963590749
 };

secret = "SECRET";
data = JSON.stringify(data);
payload = Buffer.from(data).toString('base64');

signature = crypto.createHmac('sha512', secret).update(payload).digest('hex');
console.log(signature);

“94e40c0ad3d14746e7a15c31d3b4f8e4060d4cec81cbc529bce2ae02a45bf2b0b8ed3ad0a7842b6b3d26fe9bec045a3cedc8b546bb1c4a921416f03ed98815fb”

(2) Python3.6

import hmac, hashlib, json, base64

data = {
    'request': '/api/v1/account/balances',
    'nonce'  : 1589963590749
}

secret = "SECRET"
data = json.dumps(data)
payload = base64.b64encode(data.encode())
secret = secret.encode()
signature = hmac.new(secret, payload, hashlib.sha512).hexdigest()
print(signature)

“9aaa9f01dd2ab21bfc46bb1e369748afc5f638fa157578078472219b9bc615f4796d7a9502efcf7c4fdc5208a52470c5b850257d0c36050c9b2650d277fa8f=8c][=14

您可以逐步找到问题:

1)比较base64编码的字符串:

JS: eyJyZXF1ZXN0IjoiL2FwaS92MS9hY2NvdW50L2JhbGFuY2VzIiwibm9uY2UiOjE1ODk5NjM1OTA3NDl9 这是(解码):

{"request":"/api/v1/account/balances","nonce":1589963590749}

但是Python的时间是一样的: eyJyZXF1ZXN0IjogIi9hcGkvdjEvYWNjb3VudC9iYWxhbmNlcyIsICJub25jZSI6IDE1ODk5NjM1OTA3NDl9 这是(解码):

{"request": "/api/v1/account/balances", "nonce": 1589963590749}

你能看出区别吗?

2) 找到摆脱尾随空格的方法,在你的情况下你可以通过以下方式转储:

data = json.dumps(data, separators=(',', ':'))