请求参数排序 按照参数名称的字典顺序对请求中的参数进行排序。(请求参数有:AccessKeyId、Action、Format、JsonStr、RegionId、SignatureMethod、SignatureNonce、SignatureVersion、Timestamp、Version) 对每个请求参数的名称和值进行编码 名称和值要使用UTF-8字符集进行URL编码(需要编码的字段至少包括:JsonStr、Timestamp),URL编码的编码规则是: 对于字符 A-Z、a-z、0-9以及字符“-”、“_”、“.”、“~”不编码; 对于其他字符编码成“%XY”的格式,其中XY是字符对应ASCII码的16进制表示。比如英文的双引号(”)对应的编码是%22 对于扩展的UTF-8字符,编码成“%XY%ZA…”的格式; 需要说明的是英文空格( )要被编码是%20,而不是加号(+)。 注:一般支持URL编码的库(比如Java中的java.net.URLEncoder)都是按照“application/x-www-form-urlencoded”的MIME类型的规则进行编码的。实现时可以借助该方法,把编码后的字符串中加号(+)替换成%20、星号(*)替换成%2A、%7E替换回波浪号(~),即可得到上述规则描述的编码字符串。 参考代码(java):
public String percentEncode(String o) throws UnsupportedEncodingException { return URLEncoder.encode(o, "utf8").replace("+", "%20") .replace("*", "%2A") .replace("%7E", "~"); } 对编码后的参数名称和值使用英文等号(=)进行连接。 将英文等号连接得到的字符串按参数名称的字典顺序依次使用&符号连接,即得到规范化请求字符串。 编码后的字符串( CanonicalizedQueryString )如下: &AccessKeyId=lFKEO3Q10JCIGvNv&Action=GetAudioDataStatus&Format=JSON&JsonStr=%7B%22appKey%22%3A1733149043164104%2C%22taskId%22%3A%22B8578666-7136-49A9-9DA0-3B3732DAFF62%22%7D&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=1c550238-8a54-46a0-b8c4-666237b1e399&SignatureVersion=1.0&Timestamp=2018-02-06T08%3A50%3A58Z&Version=2016-08-01 计算签名签名 ( StringToSign )的构造规则为: HTTPMethod + “&” + percentEncode(“/”) + ”&” + percentEncode(CanonicalizedQueryString) 其中, HTTPMethod是提交请求用的HTTP方法,比如:GET、POST。 percentEncode(“/”)是按照URL编码规则对字符“/”进行编码得到的值,即“%2F”。 percentEncode(CanonicalizedQueryString)是对上步中CanonicalizedQueryString的字符串按URL编码规则编码后得到的字符串。 按照RFC2104的定义,使用上面用于签名的字符串计算签名HMAC值。 注意:计算签名时使用的Key就是用户持有的Access Key Secret并加上一个“&”字符(ASCII:38),使用的哈希算法是SHA1。 按照Base64编码规则把上面的HMAC值编码成字符串,即得到签名值(Signature)。 示例代码 Java:
public String signString(String StringToSign, String accessSecret)
{
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(new SecretKeySpec(
accessSecret.getBytes("UTF-8"),"HmacSHA1"));
byte[] signData = mac.doFinal(StringToSign.getBytes("UTF-8"));
return Base64Helper.encode(signData);
}
python2:
import hashlib import string from hashlib import sha1 import base64 import hmac from hmac import new as hmac
def hash_hmac(ac_key, text):
h = hmac(ac_key, text, sha1) d = h.digest() print 'd: ' + d return str(d.encode('base64')) python3:
import base64 import hmac from hashlib import sha1
def hash_hmac(code, key, sha1): hmac_code = hmac.new(key.encode(), code.encode(), sha1).digest() return base64.b64encode(hmac_code).decode() 将得到的签名值作为Signature参数添加到请求参数中,即完成对请求签名的过程。 注意:得到的签名值在作为最后的请求参数值提交时,要和其他参数一样,按照RFC3986的规则进行URL编码)。 示例 签名前的请求URL为:
http://qualitycheck.cn-hangzhou.aliyuncs.com/?JsonStr={"appKey":1733149043164104,"taskId":"B8578666-7136-49A9-9DA0-3B3732DAFF62"}&SignatureVersion=1.0 &Action=GetAudioDataStatus&Format=JSON&SignatureNonce=1c550238-8a54-46a0-b8c4-666237b1e399 &Version=2016-08-01&AccessKeyId=testid&SignatureMethod=HMAC-SHA1&RegionId=cn-hangzhou &Timestamp=2018-02-06T08:50:58Z 那么StringToSign为:
GET&%2F&AccessKeyId%3Dtestid&Action%3DGetAudioDataStatus&Format%3DJSON&JsonStr%3D%257B%2522appKey%2522%253A%25221733149043164104%2522%252C%2522taskId%2522%253A%2522B8578666-7136-49A9-9DA0-3B3732DAFF62%2522%257D&RegionId%3Dcn-hangzhou&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D1c550238-8a54-46a0-b8c4-666237b1e399&SignatureVersion%3D1.0&Timestamp%3D2018-02-06T08%253A50%253A58Z&Version%3D2016-08-01 如使用的Access Key Id是“testid”,Access Key Secret是“testsecret”,用于计算HMAC的Key就是“testsecret&”,则计算得到的签名值是:
MQIWlE70sNCpDsRRKTpOvdQcME8= 签名后的请求URL为(注意增加了Signature参数):
http://qualitycheck.cn-hangzhou.aliyuncs.com/ ?JsonStr={"appKey":1733149043164104,"taskId":"B8578
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。