全部产品
云市场

签名机制

更新时间:2019-04-11 14:50:45

图像搜索服务会对每个访问的请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求头中包含签名(Authorization)信息。图像搜索通过使用Access Key IDAccess Key Secret进行对称加密的方法来验证请求的发送者身份。Access Key IDAccess Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中Access Key ID用于标识访问者的身份;Access Key Secret是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。

签名操作

签名主要包含以下几部分内容:公共请求头(http协议header参数、阿里云协议header参数)、CanonicalizedResource(规范资源)、Body。

  1. 首先计算body的MD5值,然后再对其进行base64编码,编码后的值设置到 Header中。
  2. 使用请求中的Header参数构造规范化的Header字符串。
    1. headerStringToSign =
    2. HTTP-Verb + "\n" + //HTTP_Verb为POST或者GET
    3. Accept + \n + //Accept为application/json
    4. Content-MD5 + "\n" + //第1步中计算出来的MD5值
    5. Content-Type + "\n" + //Content-Type值为application/octet-stream;chrset=utf-8
    6. Date + "\n" + //Date值为GMT时间
    7. x-acs-signature-method:HMAC-SHA1\n +
    8. x-acs-signature-nonce:” + ${x-acs-signature-nonce} + "\n" +
    9. x-acs-version:2018-01-20" + "\n";
  3. CanonicalizedResource 表示客户想要访问资源的规范描述,需要将子资源和qurey一同按照字典序,从小到大排列并以 & 为分隔符生成子资源字符串(?后的所有参数),示例如下。
    1. resourceStringToSign =
    2. URI + "?instanceName=" + ${instanceName};
  4. 将上两步构造的规范化字符串按照下面的规则构造成待签名的字符串。
    1. stringToSign = headerStringToSign + resourceStringToSign;
  5. 按照 RFC2104的定义,计算待签名字符串StringToSign的 HMAC 值,按照 Base64 编码规则把上面的 HMAC 值编码成字符串,并在前面加上AccessKeyId,即得到签名值(Authorization),示例如下:
    1. Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
    2. Authorization = "acs " + AccessKeyId + ":" + Signature

    注意:计算签名时使用的 Key 就是您持有的Access Key Secret,使用的哈希算法是 SHA1。

示例

假定用户请求如下:

  1. curl -X POST
  2. -H "date:Sat 27 Jan 2018 17:53:28 GMT"
  3. -H "content-md5:MACiECZtnLiNkNS1v5ZCAA=1"
  4. -H "content-type:application/x-www-form-urlencoded;charset=utf-8"
  5. -H "x-acs-signature-method:HMAC-SHA1"
  6. -H "x-acs-signature-nonce:123212345678231234"
  7. -H "x-acs-version:2019-03-25"
  8. -H "accept:application/json"
  9. -d "..."
  10. "http://imagesearch.cn-shanghai.aliyuncs.com/v2/image/search"

计算得到的stringToSign为:

  1. POST
  2. application/json
  3. MACiECZtnLiNkNS1v5ZCAA==
  4. application/x-www-form-urlencoded;charset=utf-8
  5. Sat 27 Jan 2018 19:54:26 GMT
  6. x-acs-signature-method:HMAC-SHA1
  7. x-acs-signature-nonce:123212345678231235
  8. x-acs-version:2019-03-25
  9. /v2/image/search

假定 accessKeyId 为 testAccessKey,accessSecrect 为 testKeySecrect,计算得到的签名值为:

  1. acs testAccessKey:31nTIpResD/0C8gb+ChUeuvsxlw=

最后将得到的签名值加入到 Header 的 Authorization 当中。