文档简介:
签名过程
下图说明了签名计算过程。
下表描述了图中显示的功能。用户需要为这些功能实现代码。
功能 |
描述 |
Lowercase() |
将字符串转换为小写。 |
Hex() |
小写十六进制编码。 |
SHA256Hash() |
安全散列算法(SHA)加密散列函数。 |
HMAC-SHA256() |
使用提供的签名密钥的SHA256算法计算HMAC。这是最后的签名。 |
Trim() |
删除任何前导或尾随空格。 |
UriEncode() |
URI编码每个字节。UriEncode()必须强制执行以下规则: l URI编码除了下面字符之外的每个字节:'A' - 'Z','a' - 'z','0' - '9',' - ','.','_'和'〜'。 l 空格字符是保留字符,必须编码为“%20”(而不是“+”)。 l 每个URI编码字节由'%'和两位十六进制值组成。 l 十六进制值中的字母必须为大写,例如“%1A”。 l 除了对象名之外,对正斜杠字符'/'进行编码。例如,如果对象名称为 photos/Jan/sample.jpg,则不对键名称中的正斜杠进行编码。 我们建议您编写自己的自定义UriEncode函数,以确保您的编码可以正常工作。 以下是Java中的示例UriEncode()函数。 public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); } |
使用参数的签名过程与使用请求头的签名过程类似,如下所示:
1、由于创建预签名URL的时候,并不知道有效负载的内容,所以设置常量UNSIGNED-PAYLOAD。2、规范查询字符串(Canonical Query String)必须包括除了X-Amz-Signature之外的所有上述查询字符串。
3、规范标头必须包括HTTP Host标头。如果用户想包含x-amz-*请求头,这些标头都将参与签名计算。用户可以选择其他的请求头是否参与签名计算。安全起见,让尽可能多的请求头参与签名计算。