签名机制
<p>用户在HTTP请求中添加签名(signature)信息,平安金融云才可以对请求进行身份验证。</p>
<p>接口的鉴权主要鉴定用户请求的URL是否在传输过程中被篡改过,</p>
<ul>
<li>若签名校验通过,则认为请求没有被篡改,后台会将请求转发到具体的服务。</li>
<li>若签名校验失败,则被认为由于一些原因,导致当前请求是不安全的,例如用户请求的URL被篡改过,用户请求过期等,后台将拒绝提供服务。</li>
</ul>
<p>在平安金融云门户注册主用户或创建子用户后,可以为每个用户生成一对AccessKey,AccessKey由AccessKeyId与AccessKeySecret组成。</p>
<ul>
<li>通过AccessKeyId,可以在后台查出唯一对应的用户的详细信息;</li>
<li>AccessKeySecret则作为秘钥,用于对请求进行签名。AccessKeySecret需要用户严格保密,来防止被盗用后用于冒充用户进行签名。</li>
</ul>
<p><strong>签名步骤</strong></p>
<p>构造规范化的请求字符串</p>
<p>1、 按照字母升序,对参数名称进行排序。</p>
<p>排序的参数包括action参数、公共参数及调用接口所需的业务请求参数,需要对每个请求参数的名称和值采用UTF-8字符集进行URL编码,并将编码后的字符串中‘+’替换成‘%20’、‘*’替换成‘%2A’、‘%7E’替换成‘~’、‘:’替换成‘%3A’,即java代码为:</p>
<pre>
<code>String encodedParamValue = URLEncoder.encode(paramValue, "UTF-8")
.replace("+", "%20")
.replace("*", "%2A")
.replace("%7E", "~")
.replace(":", "%3A");</code></pre>
<p><img src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" />2、 将参数名paramName转化为小写,编码后的参数值encodedParamValue转化为小写,最后将转为小写后的paramName按照字符升序排序,升序后组装请求字符串生成待签名字符串stringToSign。</p>
<p>3、 将上面用于签名的字符串stringToSign计算签名HMAC值。注意:计算签名时使用的Key就是用户持有的AccessKeySecret,使用的哈希算法是SHA1,即HmacSHA1(stringToSign)。然后按照Base64编码规则把上面的HMAC值编码成字符串,即得到签名值(signature)。将得到的签名值作为signature参数添加到请求参数中,即完成对请求签名的过程。</p>
<p>4、 拼接包含signature参数所有请求参数,得到规范化的请求字符串,并使用该请求字符串提交给KMS服务端进行接口请求。</p>
<p>示例(以EnableKey为例):</p>
<p>假如paramsString值为:accessKeyId=testId&action=EnableKey&keyId=keyId</p>
<p>&signatureMethod=HMAC-SHA1&signatureNonce=1542333462075&signatureVersion=1.0</p>
<p>&timestamp=1542333462075&version=2017-01-01</p>
<p>则stringToSign应该是:accesskeyid=testid&action=enablekey&keyid=keyid</p>
<p>&signaturemethod=hmac-sha1&signaturenonce=1542333462075&signatureversion=1.0</p>
<p>&timestamp=1542333462075&version=2017-01-01</p>
<p>假如使用的AccessKeyId对应的AccessKeySecret是testsecret,则计算得到的签名值是:caPjvsMXfd6oglEkahdq4Jo0yVA=</p>
<p>签名后的请求URL为(注意增加了signature参数):</p>
<pre>
<code>https://kms-cn-shanghai.ocftcloud.com/?action=EnableKey
&keyId=<keyid>
&timestamp=<timestamp>
&signatureMethod=HMAC-SHA1
&signatureNonce=<signaturenonce>
&accessKeyId=<accesskeyid>
&signatureVersion=1.0
&signature=<signature value>
&version=2017-01-01</code></pre>
<p> </p>
提交成功!非常感谢您的反馈,我们会继续努力做到更好!