对于每一次HTTP或者HTTPS协议请求,我们会根据访问中的签名信息验证访问请求者身份。具体由使用AccessKeyID和AccessKeySecret对称加密验证实现。

说明 AccessKey相当于您的密码,AccessKey用于调用API。其中AccessKeyID是访问者身份,AccessKeySecret是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。更多详情请参见创建AccessKey

签名操作

签名主要包含以下几部分内容:公共请求头(http协议header参数、阿里云协议header参数)、CanonicalizedResource(规范资源)、Body。
  1. 首先计算body的MD5值,然后再对其进行base64编码,编码后的值设置到Header中。
  2. 使用请求中的Header参数构造规范化的Header字符串。
    headerStringToSign = 
        HTTP-Verb + "\n" +         //HTTP_Verb为POST或者GET
        Accept + “\n” +            //Accept为application/json
        Content-MD5 + "\n" +       //第1步中计算出来的MD5值
        Content-Type + "\n" +      //Content-Type值为application/octet-stream;chrset=utf-8
        Date + "\n" +              //Date值为GMT时间
        “x-acs-signature-method:HMAC-SHA1\n” + 
        “x-acs-signature-nonce:” + ${x-acs-signature-nonce} + "\n" +
        “x-acs-version:2018-01-20" + "\n";
  3. CanonicalizedResource表示您想要访问资源的规范描述,需要将子资源和qurey一同按照字典序,从小到大排列并以 & 为分隔符生成子资源字符串(?后的所有参数),示例如下。
    resourceStringToSign = 
        URI + "?instanceName=" + ${instanceName};
  4. 将前两步构造的规范化字符串按照下面的规则构造成待签名的字符串。
    stringToSign = headerStringToSign + resourceStringToSign;
  5. 按照RFC2104
    Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
    Authorization = "acs " + AccessKeyId + ":" + Signature
    说明 计算签名时使用的Key就是您持有的AccessKeySecret,使用的哈希算法是SHA1。

签名示例

假设您的请求如下:
curl -X POST 
     -H "date:Sat 27 Jan 2018 17:53:28 GMT" 
     -H "content-md5:MACiECZtnLiNkNS1v5ZCAA=1" 
     -H "content-type:application/x-www-form-urlencoded;charset=utf-8" 
     -H "x-acs-signature-method:HMAC-SHA1" 
     -H "x-acs-signature-nonce:123212345678231234" 
     -H "x-acs-version:2019-03-25"
     -H "accept:application/json" 
     -d "..." 
     "http://imagesearch.cn-shanghai.aliyuncs.com/v2/image/search"
计算得到的stringToSign为:
POST
application/json
MACiECZtnLiNkNS1v5ZCAA==
application/x-www-form-urlencoded;charset=utf-8
Sat 27 Jan 2018 19:54:26 GMT
x-acs-signature-method:HMAC-SHA1
x-acs-signature-nonce:123212345678231235
x-acs-version:2019-03-25
/v2/image/search
假定accessKeyId为testAccessKey,accessSecrect为testKeySecrect,计算得到的签名值为:
acs testAccessKey:31nTIpResD/0C8gb+ChUeuvsxlw=

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