本文为您介绍签名机制的操作步骤。对于每一次HTTP或者HTTPS协议请求,我们会根据访问中的签名信息验证访问请求者身份。具体由使用AccessKeyID和AccessKeySecret对称加密验证实现。
AccessKey说明
AccessKeyID和AccessKeySecret可在控制台AccessKey管理页面获得。其中AccessKeyID是访问者身份,AccessKeySecret是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。
AccessKey的相关操作请参见获取AccessKey。
操作步骤
- 构造规范化请求字符串。
- 排序参数。排序规则以首字母顺序排序,排序参数包括公共参数接口自定义参数,不包括公共请求参数中的Signature参数。
说明 当使用GET方法提交请求时,这些参数就是请求URL中的参数部分。即URL中?
之后由&
连接的部分。
- 编码参数。使用UTF-8字符集按照RFC3986。
- 字符A~Z、a~z、0~9 以及字符
-
、_
_、.
、~
不编码。
- 其它字符编码成
%XY
的格式,其中XY
是字符对应ASCII码的16进制。
示例:半角双引号(")对应%22
。
- 扩展的UTF-8字符,编码成
%XY%ZA…
的格式。
- 空格()编码成
%20
,而不是加号(+)。该编码方式与application/x-www-form-urlencodedMIME格式编码算法相似,但又有所不同。如果您使用的是Java标准库中的java.net.URLEncoder
,可以先用标准库中percentEncode
编码,随后将编码后的字符中加号(+)替换为%20
、星号(*)替换为%2A
、%7E
替换为波浪号(~),即可得到上述规则描述的编码字符串。
- 使用等号(=)连接编码后的请求参数和参数取值。
- 使用与号(&)连接编码后的请求参数,注意参数排序与步骤1一致。
- 构造签名字符串。
- 构造待签名字符串Signature。
您可以同样使用
percentEncode处理上一步构造的规范化请求字符串,规则如下:
StringToSign=
HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。
percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。
percentEncode(CanonicalizedQueryString) //您的规范化请求字符串。
- 计算HMAC值。
按照RFC2104的定义,使用上述步骤得到的字符串计算签名HMAC值。
说明 计算签名时使用的Key就是您持有的AccessKeySecret并加上一个&
字符(ASCII:38),使用的哈希算法是SHA1。
- 计算签名值。
按照Base64 编码规则把上一步骤中的HMAC值编码成字符串,即得到签名值(Signature)。
- 添加签名。
将得到的签名值作为
Signature参数添加到请求参数中,即完成请求签名过程。
说明 得到的签名值在作为最后的请求参数值提交给服务器时,也要按照
RFC3986。