腾讯云密钥API接口签名机制

用户在HTTP请求中添加签名(signature)信息,腾讯云才可以对请求进行身份验证。
 
接口的鉴权主要鉴定用户请求的URL是否在传输过程中被篡改过,
若签名校验通过,则认为请求没有被篡改,后台会将请求转发到具体的服务。
若签名校验失败,则被认为由于一些原因,导致当前请求是不安全的,例如用户请求的URL被篡改过,用户请求过期等,后台将拒绝提供服务。
在腾讯云门户注册主用户或创建子用户后,可以为每个用户生成一对AccessKey,AccessKey由AccessKeyId与AccessKeySecret组成。
 
通过AccessKeyId,可以在后台查出唯一对应的用户的详细信息;
AccessKeySecret则作为秘钥,用于对请求进行签名。AccessKeySecret需要用户严格保密,来防止被盗用后用于冒充用户进行签名。

签名步骤
 
构造规范化的请求字符串
 
1、 按照字母升序,对参数名称进行排序。
 
排序的参数包括action参数、公共参数及调用接口所需的业务请求参数,需要对每个请求参数的名称和值采用UTF-8字符集进行URL编码,并将编码后的字符串中‘+’替换成‘%20’、‘*’替换成‘%2A’、‘%7E’替换成‘~’、‘:’替换成‘%3A’,即java代码为:
 
    String encodedParamValue = URLEncoder.encode(paramValue, "UTF-8")
    .replace("+", "%20")
    .replace("*", "%2A")
    .replace("%7E", "~")
    .replace(":", "%3A");

2、 将参数名paramName转化为小写,编码后的参数值encodedParamValue转化为小写,最后将转为小写后的paramName按照字符升序排序,升序后组装请求字符串生成待签名字符串stringToSign。
 
3、 将上面用于签名的字符串stringToSign计算签名HMAC值。注意:计算签名时使用的Key就是用户持有的AccessKeySecret,使用的哈希算法是SHA1,即HmacSHA1(stringToSign)。然后按照Base64编码规则把上面的HMAC值编码成字符串,即得到签名值(signature)。将得到的签名值作为signature参数添加到请求参数中,即完成对请求签名的过程。
 
4、 拼接包含signature参数所有请求参数,得到规范化的请求字符串,并使用该请求字符串提交给KMS服务端进行接口请求。
 
示例(以EnableKey为例):
 
假如paramsString值为:accessKeyId=testId&action=EnableKey&keyId=keyId
 
&signatureMethod=HMAC-SHA1&signatureNonce=1542333462075&signatureVersion=1.0
 
&timestamp=1542333462075&version=2017-01-01
 
则stringToSign应该是:accesskeyid=testid&action=enablekey&keyid=keyid
 
&signaturemethod=hmac-sha1&signaturenonce=1542333462075&signatureversion=1.0
 
&timestamp=1542333462075&version=2017-01-01
 
假如使用的AccessKeyId对应的AccessKeySecret是testsecret,则计算得到的签名值是:caPjvsMXfd6oglEkahdq4Jo0yVA=
 
签名后的请求URL为(注意增加了signature参数):
 
    https://kms-cn-shanghai.yun.pingan.com/?action=EnableKey
    &keyId=<keyid>
    &timestamp=<timestamp>
    &signatureMethod=HMAC-SHA1
    &signatureNonce=<signaturenonce>
    &accessKeyId=<accesskeyid>
    &signatureVersion=1.0
    &signature=<signature value>
    &version=2017-01-01

标签