hash_hmac and bin2hex in Python3



我得到了与加密功能相关的PHP代码,该代码使用hash_macbin2hex。 逻辑很简单。我必须消化我的key然后将二进制转换为十六进制字符串,仅此而已

这是我的PHP

$reqBody = '{
"citizenNo":"9990601821487",
"birthDate":"2520-02-24"
}'; // Put JSON body into reqBody parameter
$obj = json_decode($reqBody,true);
$transformBody = json_encode($obj); // Convert JSON into string without any whitespace
$secret = "idkfaiddqd";
$hashmac = hash_hmac('sha256', $transformBody, $secret, true);
$signature = bin2hex(hash_hmac('sha256', $transformBody, $secret, true)); 
echo "X-API-key : ",$signature,"n";  

PHP28d28fd2cecc10a5d1e98a03dbec23844780d1609e7eaedba72e7c3a8e0e84e1n

我实现Python版本

SECRET = "idkfaiddqd"
data = {
"citizenNo": "9990601821487",
"birthDate": "2520-02-24",
}
transform_body = str(data).replace(' ', '')
aaa = hmac.new(bytes(SECRET, 'utf-8'), transform_body.encode('utf-8'), hashlib.sha256).hexdigest()

Python2e3dff89bef78489c4f42e1e54a40b257e908aaa2d1aa46b5873acb53c51c9ac

问:
我错在哪里?

错误在transform_body字符串中。

当你查看PHP字符串时,你可以看到这个:

{"citizenNo":"9990601821487","birthDate":"2520-02-24"}

python 字符串如下所示:

{'citizenNo':'9990601821487','birthDate':'2520-02-24'}

你看出区别了吗?Python使用单引号,PHP使用普通引号。

为了使 python 脚本完全像 PHP 脚本一样工作,您必须在 python 版本中用普通引号替换为单引号。

import hmac
import hashlib
SECRET = "idkfaiddqd"
data = {
"citizenNo": "9990601821487",
"birthDate": "2520-02-24",
}
transform_body = str(data).replace(' ', '')
transform_body = transform_body.replace(''', '"')
aaa = hmac.new(SECRET.encode(), transform_body.encode(), hashlib.sha256).hexdigest()
print(aaa)

输出:

28d28fd2cecc10a5d1e98a03dbec23844780d1609e7eaedba72e7c3a8e0e84e1

而且你在 php 脚本的输出中有一个额外的"n"。我想这应该是n

最新更新