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


PHP to Python3 HMAC signature not resulting in the same signature

我一直在尝试将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);
?>
Python 3 Code
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)的输出:

{"t":"2015-10-26 04:53:49 EDT","secret":"mkdaklmdflfkdsmaflkdmsfdkasmfdsmflks"}

Python json.dumps(payload)输出:

{"t": "2015-10-26 04:53:49 EDT", "secret": "mkdaklmdflfkdsmaflkdmsfdkasmfdsmflks"}

你可以通过指定分隔符来修复这个问题,例如:

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

另外,您可以通过使用OrderedDict而不是普通字典来控制元素的顺序:

from collections import OrderedDict
payload = OrderedDict()