Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么使用Python和Node.js';s HMAC结果在该代码中是否不同?_Python_Node.js_Hmac - Fatal编程技术网

为什么使用Python和Node.js';s HMAC结果在该代码中是否不同?

为什么使用Python和Node.js';s HMAC结果在该代码中是否不同?,python,node.js,hmac,Python,Node.js,Hmac,最近,我有一项任务,让HMAC与API服务器通信。 我得到了node.js版本的示例代码,它可以生成消息的HMAC。使用概念和示例,我必须编写一个与node.js版本等效的python代码,但结果不同,但我不知道为什么 请查看这两个代码并帮助查找差异 Python 3.0 import hmac import string import hashlib import base64 secret = 'PYPd1Hv4J6' message = '1515928475.417' key = ba

最近,我有一项任务,让HMAC与API服务器通信。 我得到了node.js版本的示例代码,它可以生成消息的HMAC。使用概念和示例,我必须编写一个与node.js版本等效的python代码,但结果不同,但我不知道为什么

请查看这两个代码并帮助查找差异

Python 3.0

import hmac
import string
import hashlib
import base64

secret = 'PYPd1Hv4J6'
message = '1515928475.417'
key = base64.b64encode(secret.encode('utf-8'))

hmac_result = hmac.new(key, message.encode('utf-8'), hashlib.sha512)
print(base64.b64encode(hmac_result.digest()))
结果(Python 3.6)

Node.JS

var crypto = require('crypto');

var secret = 'PYPd1Hv4J6';
var message = '1515928475.417'
var key = Buffer(secret, 'base64');

var hmac = crypto.createHmac('sha512', key);
var hmac_result = hmac.update(message).digest('base64');
console.log(hmac_result)
结果(Node.JS 6.11)


我可以通过去掉
base64
ing中的所有内容使它们匹配:

Python:

import hmac
import string
import hashlib
import base64

secret = 'PYPd1Hv4J6'
message = '1515928475.417'
key = secret.encode('utf-8')

hmac_result = hmac.new(key, message.encode('utf-8'), hashlib.sha512)
print(base64.b64encode(hmac_result.digest()))
输出:

b'jezLNuBz37FoACm4LdLSqOQ5C93cuGID9a8MQmOZntXklDV3SvWdNfqndzK0a54awKeHY+behFiv4FYyILRoGQ=='
jezLNuBz37FoACm4LdLSqOQ5C93cuGID9a8MQmOZntXklDV3SvWdNfqndzK0a54awKeHY+behFiv4FYyILRoGQ==
Javascript

var crypto = require('crypto');

var secret = 'PYPd1Hv4J6';
var message = '1515928475.417'

var hmac = crypto.createHmac('sha512', secret);
var hmac_result = hmac.update(message).digest('base64');
console.log(hmac_result)
输出:

b'jezLNuBz37FoACm4LdLSqOQ5C93cuGID9a8MQmOZntXklDV3SvWdNfqndzK0a54awKeHY+behFiv4FYyILRoGQ=='
jezLNuBz37FoACm4LdLSqOQ5C93cuGID9a8MQmOZntXklDV3SvWdNfqndzK0a54awKeHY+behFiv4FYyILRoGQ==

您的输入键不同,因此输出将不同

节点:


下面是等效/预期的python代码

import hmac
import string
import hashlib
import base64

secret = 'PYPd1Hv4J6=='
message = '1515928475.417'
key = base64.b64decode (secret.encode('utf-8'))

hmac_result = hmac.new(key, message.encode('utf-8'), hashlib.sha512)
print(base64.b64encode(hmac_result.digest()))
将“=”填充到目标和解码部分很重要。
谢谢。

Sample Node.JS代码具有
var key=Buffer(secret,'base64')看起来很重要。Python能遵循这个惯例吗?
Buffer(secret,'base64')
意味着将
secret
解码为'base64'。我误解了代码,花了一些时间。现在我可以修复它了。我尝试将base64编码为
secret
,所以我使用了
base64.b64encode
。B64解码有一个错误,即
binascii。错误:不正确的填充
base64字符串长度必须是3个字符的倍数,因此将
secret
更改为
'PYPd1Hv4J6='
应该可以与
B64解码
一起使用。节点的
Buffer
似乎并不关心它是否收到了不正确的填充:)
secret='PYPd1Hv4J6='
key=base64.b64解码(secret.encode('utf-8'))
工作正常,谢谢。我可以先走一步。节点填充计算的故障令我惊讶,python可以检查。这是一种bug?RFC4648说“除非引用本文档的规范明确说明了其他情况,否则实现必须在编码数据的末尾包含适当的pad字符。”所以这取决于节点如何记录其行为。
secret = 'PYPd1Hv4J6'
message = '1515928475.417'
key = base64.b64encode(secret.encode('utf-8')) # did you mean b64decode here?
import hmac
import string
import hashlib
import base64

secret = 'PYPd1Hv4J6=='
message = '1515928475.417'
key = base64.b64decode (secret.encode('utf-8'))

hmac_result = hmac.new(key, message.encode('utf-8'), hashlib.sha512)
print(base64.b64encode(hmac_result.digest()))