开发者社区 问答 正文

hmac值的计算

hmac值的计算是怎样的啊, server string to sign 值都是一样的但是返回Specified signature is not matched with our calculation 这个信息 我用的是hmac.new(AccessKeySecret,text,hashlib.sha1).digest().encode("base64") 这样对吗

展开
收起
6oordvsjrsg2s 2021-07-15 17:40:21 378 分享 版权
阿里云 AI 助理回答

在计算HMAC值时,您的代码片段使用了Python的hmac库,这基本是正确的方向。但是,根据参考资料中的说明,有几点需要注意和调整以确保签名计算与阿里云的要求一致:

  1. 确保Key格式正确:计算HMAC时,AccessKey Secret后面需要加上一个"&"字符。因此,您应该使用 hmac.new(bytes(AccessKeySecret+'&', 'utf-8'), text, hashlib.sha1) 来构造HMAC对象。

  2. Base64编码处理:您提到的.digest().encode("base64") 需要修正为首先使用 .digest() 获取原始的二进制HMAC结果,然后使用 base64.b64encode() 进行Base64编码,并考虑去除末尾的换行符(如果有的话)。正确的做法应为 base64.b64encode(hmac.digest()).strip() 或在Python 3中更简洁地使用 base64.b64encode(hmac.digest()).decode('utf-8') 转换为字符串。

  3. StringToSign一致性检查:您提到服务器端的StringToSign值看起来一样,但仍然出现不匹配错误。请确保:

    • 参数排序:CanonicalQueryString中的参数需按字符升序排列。
    • 空格和编码:所有空格被替换为%20,并且其他特殊字符也进行了正确的URL编码。
    • Headers处理:如果涉及到SignedHeaders,它们也需要按照规则排序并正确反映在Signature计算中。

综上所述,调整后的代码示例应该是:

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,因为这些也是常见的导致签名不匹配的原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: