PHP到Python3 HMAC签名不产生相同的签名
我一直在尝试将一个php脚本转换为PHP到Python3 HMAC签名不产生相同的签名,php,python,Php,Python,我一直在尝试将一个php脚本转换为python3脚本,并在解决问题后未能成功发送签名 下面的PHP示例代码成功通过,因此我复制了发送的时间戳和签名,尝试在python3代码中复制它 PHP代码 <? $nonce = "2015-10-26 04:53:49 EDT"; $secret = "mkdaklmdflfkdsmaflkdmsfdkasmfdsmflks"; $req = array(); $req['t'] = $nonce; $req
python3
脚本,并在解决问题后未能成功发送签名
下面的PHP
示例代码成功通过,因此我复制了发送的时间戳和签名,尝试在python3代码中复制它
PHP代码
<?
$nonce = "2015-10-26 04:53:49 EDT";
$secret = "mkdaklmdflfkdsmaflkdmsfdkasmfdsmflks";
$req = array();
$req['t'] = $nonce;
$req['secret'] = $secret;
$post_data = json_encode($req);
$post_data = bin2hex($post_data);
$sign = hash_hmac("sha256", $post_data, $secret);
print($sign);
?>
import json
import hmac
import binascii
import hashlib
nonce = "2015-10-26 04:53:49 EDT"
secret = "mkdaklmdflfkdsmaflkdmsfdkasmfdsmflks"
payload = {}
payload["t"] = nonce
payload["secret"] = secret
payload_json = json.dumps(payload)
post_data = binascii.b2a_hex(payload_json.encode('utf-8'))
sign = hmac.new(bytes(secret, "utf-8"), post_data, hashlib.sha256).hexdigest()
print(sign)
根据使用PHP的成功请求,我的签名应为:
'c30ddc5878ff7b1a9b1c9078ccbdc38afef25ed510681a3d3bfc56f6c9e2f26a'
相反,我得到的是:
'f9fc8749389137252e7f207468d88a5c871110403ec533496720efd715541ec2'
如果您能帮助我解决这个问题,我将不胜感激,因为我是
Python
新手。您的问题是,默认情况下,Python会在JSON字符串中插入空格。PHP json_encode($req)的输出:
Python json.dumps(有效负载)的输出:
您可以通过指定分隔符来解决此问题,即:
json.dumps(payload, separators=(',', ':'))
此外,您还可以使用OrderedDict而不是普通字典来控制元素的顺序:
from collections import OrderedDict
payload = OrderedDict()
请发布一些我们可以用来重现此问题的虚拟数据?这很可能是由于unicode数据,PHP的hmac函数可以很好地处理unicode数据,而另一方面Python的hmac函数只能处理字节。您可以在Python和PHP中使用bin-2-hex函数将
postdata
转换为类似的形式。Python3:binascii.b2a_hex(postdata.encode('utf-8'))
PHP:bin2hex(postdata)
您应该能够输入任何数据,只要机密和时间相同,我们应该在php和python上获得相同的签名,以便根据我的理解,身份验证能够成功。我尝试使用上述代码并得到以下结果“8c79bb3f7a5db920b601a6b9643b212f26451d2b0d7e79f2fd04a476f03e2f68”,我认为这不是数据类型错误,因为我在使用签名之前已将str转换为字节<代码>字节(payload_json,'utf-8')感谢您迄今为止的帮助。。。我一直被这个问题难住了这是我试图发送的请求的api文档
json.dumps(payload, separators=(',', ':'))
from collections import OrderedDict
payload = OrderedDict()