hmac值的计算是怎样的啊, server string to sign 值都是一样的但是返回Specified signature is not matched with our calculation 这个信息 我用的是hmac.new(AccessKeySecret,text,hashlib.sha1).digest().encode("base64") 这样对吗
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在计算HMAC值时,您的代码片段使用了Python的hmac
库,这基本是正确的方向。但是,根据参考资料中的说明,有几点需要注意和调整以确保签名计算与阿里云的要求一致:
确保Key格式正确:计算HMAC时,AccessKey Secret后面需要加上一个"&"字符。因此,您应该使用 hmac.new(bytes(AccessKeySecret+'&', 'utf-8'), text, hashlib.sha1)
来构造HMAC对象。
Base64编码处理:您提到的.digest().encode("base64")
需要修正为首先使用 .digest()
获取原始的二进制HMAC结果,然后使用 base64.b64encode()
进行Base64编码,并考虑去除末尾的换行符(如果有的话)。正确的做法应为 base64.b64encode(hmac.digest()).strip()
或在Python 3中更简洁地使用 base64.b64encode(hmac.digest()).decode('utf-8')
转换为字符串。
StringToSign一致性检查:您提到服务器端的StringToSign
值看起来一样,但仍然出现不匹配错误。请确保:
%20
,并且其他特殊字符也进行了正确的URL编码。综上所述,调整后的代码示例应该是:
import hmac
import hashlib
import base64
# 假设 AccessKeySecret 是从安全渠道获取的
AccessKeySecret = "your_access_key_secret"
text = "your_string_to_sign" # 这里应该是你根据规范构造的StringToSign
# 注意AccessKeySecret后加"&"
key = bytes(AccessKeySecret+'&', 'utf-8')
hmac_obj = hmac.new(key, bytes(text, 'utf-8'), hashlib.sha1)
signature = base64.b64encode(hmac_obj.digest()).decode('utf-8')
# 确保比较时使用的StringToSign与服务器端完全一致
如果以上步骤都确认无误,但问题依旧,请检查系统时间是否同步以及字符编码设置是否为UTF-8,因为这些也是常见的导致签名不匹配的原因。