当前位置:首页 > 技术问答 > PHP与Python生成hmac-sha256签名不匹配

PHP与Python生成hmac-sha256签名不匹配

技术问答 / 星之宇 / 2021-11-27 19:38 / 浏览:163 / 评论:0

问题描述

在使用腾讯云的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 条评论

    • 昵称
    • 邮箱
    • 网址