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=(',', ':'))
现在我正在开发从 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=(',', ':'))