使用Authorization请求头验证 签名过程 签名过程如下图所示: 下表描述了图中显示的功能。用户需要为这些函数实现代码。 功能 描述 :: Lowercase() 将字符串转换为小写。 Hex() 小写16进制编码。 SHA256Hash() 安全散列算法(SHA)加密散列函数。 HMACSHA256() 使用签名密钥,根据SHA256算法计算出的签名值。 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 ))+":"+Trim( )+"n" Lowercase(Trim( ))+":"+Trim( )+"n" ... Lowercase(Trim( ))+":"+Trim( )+"n" CanonicalHeaders列表必须包括以下内容:HTTP Host标头。如果存在ContentType请求头,则必须将其添加到CanonicalHeaders列表中。所有xamz请求头,例如,如果您使用的是临时安全凭据,则需要在请求中包含xamzsecuritytoken,必须将此标题添加到CanonicalHeader列表中。 以下是CanonicalHeaders的示例,请求头名称为小写并已排序。 host:ooscn.ctyunapi.cn xamzcontentsha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 xamzdate:20130708T220855Z 5. SignedHeaders是按字母顺序排序的,以分号分隔的小写请求头名称列表。列表中的请求头与用户在CanonicalHeaders字符串中包含的请求头相同。例如,对于前面的示例,SignedHeaders的值为: host;xamzcontentsha256;xamzdate 6. RequestPayload 是请求负载的SHA256哈希的十六进制值。 如果请求中没有负载,则计算空字符串的哈希值,如下所示: Hex(SHA256Hash("")) 哈希返回以下值: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 例如:当用户使用PUT请求上传文件时,用户可以在请求体中提供文件数据。使用GET请求检索文件时,没有请求体,所以计算空字符串的哈希。 2. 创建待签名字符串 待签名的字符串格式如下: "AWS4HMACSHA256" + "n" + timeStampISO8601Format + "n" + + "n" + Hex(SHA256Hash( )) 常量字符串AWS4HMACSHA256指定用户使用的哈希算法HMACSHA256。 timeStamp是ISO 8601格式的当前UTC时间(例如20180501T000000Z)。 Scope是将生成的签名绑定到指定日期,OOS区域和服务。 date.Format( ) + "/" + + "/" + + "/aws4request" 3. 计算签名 使用SecretAccessKey作为初始哈希操作的密钥,对请求日期、区域和服务执行一系列加密哈希操作(HMAC 操作),从而派生签名密钥。伪代码如下: DateKey HMACSHA256("AWS4"+" ", " ") DateRegionKey HMACSHA256( , " ") DateRegionServiceKey HMACSHA256( , " ") SigningKey HMACSHA256( , "aws4request") 最终签名是使用签名密钥作为密钥,对待签名字符串计算得到HMACSHA256哈希值。伪代码如下: HMACSHA256(SigningKey, StringToSign) 4. 将签名信息添加到请求头 在计算签名后,将其添加到请求的HTTP请求头或查询字符串中。 将签名信息添加到Authorization标头的伪代码如下: Authorization: Credential / , SignedHeaders , Signature