最近更新时间:2024-04-11 17:37:45
第一步:请求参数排序
请求参数包括公共参数和业务参数,不包含公共参数Signature。
排序规则以参数名按照字典排序。
第二步:请求参数编码
使用UTF-8字符集按照RFC3986规则编码请求参数和参数取值,编码规则如下:
对于字符A ~ Z、a ~ z、0 ~ 9以及字符-、_、.和~不编码。
对于其他字符编码成%XY的格式,其中XY是字符对应ASCII码的16进制(大写)。
不同语言实现的URLEncode方式不同,为了得到RFC3986规则的编码,分别说明如下:
如果您使用的是Java中的java.net.URLEncoder,可以先用URLEncoder.encode方法编码,随后将编码后的字符中加号(+)替换为%20、星号(*)替换为%2A、%7E替换为波浪号(~)即可;
如果您使用的是golang中的net/url,可以用url.Values.Encode方法编码,随后将编码后的字符中加号(+)替换为%20即可;
如果您使用的是php中的rawurlencode方法,不需要替换;
如果您使用的是python3中的urllib.request,可以用urllib.request.quote方法,需要指定字符串中的波浪号(~)不编码,例如urllib.request.quote(str, ‘~’),str为待编码字符串;
第三步:请求参数拼接成CanonicalizedQueryString
每对URLEncode后的参数名称和参数值,用=进行连接。每对之间使用&进行连接。得到规范化请求字符串CanonicalizedQueryString。
sign = hash_hmac(‘sha256’, CanonicalizedQueryString, sk)
sign值为签名算法返回的16进制格式小写字符串
签名样例:
5346bfebeb3f2162e2459e09a52b640584e5f1aa5012b15c6b85388680d4663e
计算签名时使用的sk为Accesskey对应的秘钥,使用的哈希算法是:HMAC-SHA256。
该样例以iam服务的CreateUser为例
1、构造规范化请求字符串:CanonicalizedQueryString
//请求参数数组:
array (
'Accesskey'=> 'AKLTXQVF0pOmS6aahIrD5r0B3Q', //公共参数
'Service'=> 'iam', //公共参数
'Action'=> 'CreateUser', //公共参数
'Version'=> '2015-11-01', //公共参数
'Timestamp'=> '2021-08-12T02:47:36Z', //公共参数
'SignatureVersion'=> '1.0', //公共参数
'SignatureMethod'=> 'HMAC-SHA256', //公共参数
'UserName' => 'Ttest', //业务参数
'RealName' => '周四测试', //业务参数
'Email' => 'zsce@kkingsoft.com', //业务参数
'Remark' => '~ce shi*%#|+', //业务参数
)
第一步:请求参数排序
//排序结果如下:
array (
'Accesskey' => 'AKLTXQVF0pOmS6aahIrD5r0B3Q',
'Action' => 'CreateUser',
'Email' => 'zsce@kkingsoft.com',
'RealName' => '周四测试',
'Remark' => '~ce shi*%#|+',
'Service' => 'iam',
'SignatureMethod' => 'HMAC-SHA256',
'SignatureVersion' => '1.0',
'Timestamp' => '2021-08-12T02:47:36Z',
'UserName' => 'Ttest',
'Version' => '2015-11-01',
)
第二步:请求参数编码
//编码结果如下:
array (
'Accesskey' => 'AKLTXQVF0pOmS6aahIrD5r0B3Q',
'Action' => 'CreateUser',
'Email' => 'zsce%40kkingsoft.com',
'RealName' => '%E5%91%A8%E5%9B%9B%E6%B5%8B%E8%AF%95',
'Remark' => '~ce%20shi%2A%25%23%7C%2B',
'Service' => 'iam',
'SignatureMethod' => 'HMAC-SHA256',
'SignatureVersion' => '1.0',
'Timestamp' => '2021-08-12T02%3A47%3A36Z',
'UserName' => 'Ttest',
'Version' => '2015-11-01',
)
第三步:请求参数拼接成CanonicalizedQueryString
//拼接结果如下
Accesskey=AKLTXQVF0pOmS6aahIrD5r0B3Q&Action=CreateUser&Email=zsce%40kkingsoft.com&RealName=%E5%91%A8%E5%9B%9B%E6%B5%8B%E8%AF%95&Remark=~ce%20shi%2A%25%23%7C%2B&Service=iam&SignatureMethod=HMAC-SHA256&SignatureVersion=1.0&Timestamp=2021-08-12T02%3A47%3A36Z&UserName=Ttest&Version=2015-11-01
2、计算签名
sk = 'OMovU5PTLh6y9E9Ioe3K411jt99VqyQSBXgAcDYlo49R3lvUIzb6e/efZCFDmtFlzw=='
CanonicalizedQueryString = "Accesskey=AKLTXQVF0pOmS6aahIrD5r0B3Q&Action=CreateUser&Email=zsce%40kkingsoft.com&RealName=%E5%91%A8%E5%9B%9B%E6%B5%8B%E8%AF%95&Remark=~ce%20shi%2A%25%23%7C%2B&Service=iam&SignatureMethod=HMAC-SHA256&SignatureVersion=1.0&Timestamp=2021-08-12T02%3A47%3A36Z&UserName=Ttest&Version=2015-11-01"
//sign = hash_hmac('sha256', CanonicalizedQueryString, sk)
sign: fc9088ab845949dac4040be9b7ce7859068b5c21d4c400fec8ee0cefb777f659
3、将签名值作为Signature参数值添加到请求参数中
//请求示例:
curl -s -L -X POST 'iam.api.ksyun.com' \
-H 'Accept: application/json' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'Accesskey=AKLTXQVF0pOmS6aahIrD5r0B3Q' \
--data-urlencode 'Service=iam' \
--data-urlencode 'Action=CreateUser' \
--data-urlencode 'Version=2015-11-01' \
--data-urlencode 'Timestamp=2021-08-12T02:47:36Z' \
--data-urlencode 'SignatureVersion=1.0' \
--data-urlencode 'SignatureMethod=HMAC-SHA256' \
--data-urlencode 'UserName=Ttest' \
--data-urlencode 'RealName=周四测试' \
--data-urlencode 'Email=zsce@kkingsoft.com' \
--data-urlencode 'Remark=~ce shi*%#|+' \
--data-urlencode 'Signature=fc9088ab845949dac4040be9b7ce7859068b5c21d4c400fec8ee0cefb777f659'
提供php、java、go、python四种语言的签名demo,请点击此处查看。
纯净模式