问题描述

使用腾讯云的API接口签名中,按照官方示例开发PHP、Python的接口,发现PHP和Python生成的hmac-sha256不一致。

问题分析

对以下Json字符串加密的时候,PHP和Python加密结果不一样。

{"DvAuthMethod":"DNS_AUTO","DomainName":"www.77bx.com","DeleteDnsAutoRecord":true}

PHP代码:

<?php
$params = ['DvAuthMethod'=>'DNS_AUTO','DomainName'=>'www.77bx.com','DeleteDnsAutoRecord'=>True];
$payload = json_encode($params);
$hashed_request_payload = hash("SHA256", $payload);
echo $hashed_request_payload;
//8a283c1a4e51f542b7f81599c92c10168b755af9a041f489014dea39d83af2d9

Python代码:

import hashlib, hmac, json

params = {'DvAuthMethod':'DNS_AUTO','DomainName':'www.77bx.com','DeleteDnsAutoRecord':True}
payload = json.dumps(params)
hashed_request_payload = hashlib.sha256(payload.encode("utf-8")).hexdigest()
print(hashed_request_payload)
#765ddf3a6780b736775efbd9014e2102a0a0c2a870c07026ec501b5ef52d2d68

php得出8a283c1a4e51f542b7f81599c92c10168b755af9a041f489014dea39d83af2d9和python得出765ddf3a6780b736775efbd9014e2102a0a0c2a870c07026ec501b5ef52d2d68,看到hmac-sha256加密不一样了。通过json字符串直接给python加密又得出php一样的加密字符串,那么应该就是dumps的问题了。

通过查询官方文档得知:为了美观默认会加上逗号空格和冒号空格。按照文档里说的,我们只需要加上separators=(‘,’,’:’)这个参数就可以决了。就是这个导致加密不一致的元凶。

解决方法

修改Pyhton代码即可。

import hashlib, hmac, json

params = {'DvAuthMethod':'DNS_AUTO','DomainName':'www.77bx.com','DeleteDnsAutoRecord':True}
payload = json.dumps(params, separators=(',', ':'))
hashed_request_payload = hashlib.sha256(payload.encode("utf-8")).hexdigest()
print(hashed_request_payload)
#8a283c1a4e51f542b7f81599c92c10168b755af9a041f489014dea39d83af2d9
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。