开发者社区 问答 正文

签名机制说明都讲了什么?


您的应用服务器访问认证服务器申请和管理 Token 时,需要将请求参数按照指定方式排序拼接,组织成待签名字符串,然后使用秘钥 secretKey 加密得到签名。
具体约束规则如下:

  • 参数对使用 key=value 格式;
  • 参数对之间使用“&”分隔;
  • 参数对内部,即同名参数,使用逗号“,”分隔;
  • 计算签名时,需要将参数对按照 key 的字典序排序,参数对内部,也需要使用字典序排序。


示例


比如原始请求的 HTTP 方法是:
  1. [backcolor=transparent]https[backcolor=transparent]:[backcolor=transparent]//mqauth.aliyuncs.com/token/apply

参数列表有:
  1. [backcolor=transparent]parama[backcolor=transparent]=[backcolor=transparent]a
  2. [backcolor=transparent]paramc[backcolor=transparent]=[backcolor=transparent]c2[backcolor=transparent],[backcolor=transparent]c1
  3. [backcolor=transparent]paramb[backcolor=transparent]=[backcolor=transparent]b2[backcolor=transparent],[backcolor=transparent]b1[backcolor=transparent],[backcolor=transparent]b3

那么先将参数按照 key 排序,得到:
  1. [backcolor=transparent]parama[backcolor=transparent]=[backcolor=transparent]a
  2. [backcolor=transparent]paramb[backcolor=transparent]=[backcolor=transparent]b2[backcolor=transparent],[backcolor=transparent]b1[backcolor=transparent],[backcolor=transparent]b3
  3. [backcolor=transparent]paramc[backcolor=transparent]=[backcolor=transparent]c2[backcolor=transparent],[backcolor=transparent]c1

再将同一参数内的值也按照字典序排序,参数内部用逗号分隔,得到:
  1. [backcolor=transparent]parama[backcolor=transparent]=[backcolor=transparent]a
  2. [backcolor=transparent]paramb[backcolor=transparent]=[backcolor=transparent]b1[backcolor=transparent],[backcolor=transparent]b2[backcolor=transparent],[backcolor=transparent]b3
  3. [backcolor=transparent]paramc[backcolor=transparent]=[backcolor=transparent]c1[backcolor=transparent],[backcolor=transparent]c2

最终拼接得到待签名字符串:
  1. [backcolor=transparent]parama[backcolor=transparent]=[backcolor=transparent]a[backcolor=transparent]&[backcolor=transparent]paramb[backcolor=transparent]=[backcolor=transparent]b1[backcolor=transparent],[backcolor=transparent]b2[backcolor=transparent],[backcolor=transparent]b3[backcolor=transparent]&[backcolor=transparent]paramc[backcolor=transparent]=[backcolor=transparent]c1[backcolor=transparent],[backcolor=transparent]c2

然后使用 secretKey 作为密钥,HmacSHA1 算法计算得到签名。
[backcolor=transparent]注意:
  • HTTP 管理 Token 时,可以选用 HTTP 或者 HTTPS,应用自行选择。
  • HTTP 方法可以选择 GET 或者 POST,建议生产环境使用 POST,测试环境可以使用 GET。

展开
收起
猫饭先生 2017-10-27 10:40:58 1533 分享 版权
阿里云 AI 助理回答

&”分隔; 所有参数(包括签名本身)都需要参与排序; 排序规则为参数名的字典序升序(ASCII码顺序); 如果参数值为空字符串,则不包括此参数对; 签名生成的最终格式应为:signature=加密后的签名值

以阿里云的AccessKey ID和AccessKey Secret为例,进行Token申请时,一个典型的签名过程如下:

  1. 收集请求参数:首先,你需要收集所有请求的参数,包括但不限于AccessKeyId、Action、SignatureMethod、SignatureNonce、SignatureVersion、Timestamp等。其中,SignatureNonce是一个随机数,用于防止重放攻击;Timestamp是请求的时间戳。

  2. 排序参数:将所有参数按照其key的字典序进行排序。例如,如果参数有Action=DescribeInstancesAccessKeyId=YourAccessKeyIdSignatureVersion=1.0SignatureMethod=HMAC-SHA1Timestamp=2023-04-05T12:00:00ZSignatureNonce=RandomNonce,则排序后保持原顺序(因为它们已经按字典序排列)。

  3. 构造待签名字符串:按照排序后的顺序,将每个参数的key和value用等号连接,各参数之间用"&"连接。注意,最后要加上你的签名方法,如SignatureMethod=HMAC-SHA1&,但实际签名计算时不包含这个Signature本身。所以,构造的字符串应该是这样的(Signature字段除外):

    AccessKeyId=YourAccessKeyId&Action=DescribeInstances&SignatureMethod=HMAC-SHA1&SignatureNonce=RandomNonce&SignatureVersion=1.0&Timestamp=2023-04-05T12:00:00Z
    
  4. 生成签名:使用排序并构造好的字符串,结合你的SecretKey,通过指定的签名算法(如HMAC-SHA1或HMAC-SHA256)计算签名。在Python中,这可以通过hmac库完成,示例代码片段如下:

    import hmac
    import hashlib
    import base64
    
    # 假设secret_key是你的密钥
    secret_key = 'YourSecretKey'
    # 上面构造的待签名字符串
    string_to_sign = 'AccessKeyId=YourAccessKeyId&Action=DescribeInstances&SignatureMethod=HMAC-SHA1&SignatureNonce=RandomNonce&SignatureVersion=1.0&Timestamp=2023-04-05T12:00:00Z'
    # 使用HMAC-SHA1算法生成签名
    signature = hmac.new(secret_key.encode('utf-8'), string_to_sign.encode('utf-8'), hashlib.sha1).digest()
    # 对签名结果进行Base64编码
    signature_b64 = base64.b64encode(signature).decode('utf-8')
    
  5. 拼接最终请求参数:将计算得到的签名Base64编码值作为Signature参数添加到请求中,确保Signature位于所有其他参数之后,并且其值前面有signature=前缀。

完成上述步骤后,你就可以使用这个包含了签名的请求参数集去访问认证服务器,获取或管理Token了。

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