问题描述
在使用腾讯云的API接口签名中,按照官方示例开发PHP、Python的接口,发现PHP和Python生成的hmac-sha256不一致。
问题分析
对以下Json字符串加密的时候,PHP和Python加密结果不一样。
{"DvAuthMethod":"DNS_AUTO","DomainName":"www.77bx.com","DeleteDnsAutoRecord":true}
<?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 条评论