问题描述
在使用腾讯云的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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)