签名机制

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

电话咨询

400-151-8800

邮件咨询

cloud@pingan.com

在线客服

工单支持

解决云产品相关技术问题