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