Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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
PHP到Python3 HMAC签名不产生相同的签名_Php_Python - Fatal编程技术网

PHP到Python3 HMAC签名不产生相同的签名

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

我一直在尝试将一个php脚本转换为
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()