

# 对请求进行身份验证：使用 Authorization 标头（Amazon 签名版本 4）
<a name="sigv4-auth-using-authorization-header"></a>

**Topics**
+ [概述](#sigv4-auth-header-overview)
+ [Authorization 标头的签名计算：在单个分块中传输有效载荷（Amazon 签名版本 4）](sig-v4-header-based-auth.md)
+ [Authorization 标头的签名计算：在多个分块中传输有效载荷（分块上传）（Amazon 签名版本 4）](sigv4-streaming.md)
+ [尾随标头的签名计算（分块上传）（Amazon 签名版本 4）](sigv4-streaming-trailers.md)



## 概述
<a name="sigv4-auth-header-overview"></a>

使用 HTTP `Authorization` 标头是提供身份验证信息的最常用方法。除了 [POST 请求](RESTObjectPOST.md)和使用查询参数签名的请求外，所有 Amazon S3 操作都使用 `Authorization` 请求标头来提供身份验证信息。

以下是 `Authorization` 标头值的示例：为便于阅读，此示例中添加了换行符：

 

```
Authorization: AWS4-HMAC-SHA256 
Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, 
SignedHeaders=host;range;x-amz-date,
Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024
```



 下表介绍了上述示例中 `Authorization` 标头值的各个组成部分：


| 组件 | 说明 | 
| --- | --- | 
| AWS4-HMAC-SHA256 | 用于计算签名的算法。使用 Amazon 签名版本 4 进行身份验证时必须提供此值。<br />该字符串指定 Amazon 签名版本 4 (`AWS4`) 和签名算法 (`HMAC-SHA256`)。 | 
| Credential | 您的访问密钥 ID 和范围信息，包括用于计算签名的日期、区域和服务。<br />该字符串具有以下形式：<br /> <pre><your-access-key-id>/<date>/<aws-region>/<aws-service>/aws4_request</pre><br />其中：<br /> +  {{<date>}} 值使用 `YYYYMMDD` 格式指定。 <br />+  向 Amazon S3 发送请求时，{{<aws-service>}} 值为 `s3`。  | 
| SignedHeaders |  用于计算 `Signature` 的请求标头的分号分隔列表。该列表仅包含标头名称，并且标头名称必须为小写。例如：<pre>host;range;x-amz-date</pre> | 
| Signature | 256 位签名以 64 个小写十六进制字符表示。例如：<pre>fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024</pre>请注意，签名计算因所选择的传输有效负载的选项而异。 | 

签名计算因您选择用于传输请求有效载荷的方法而异。S3 支持以下选项：

 
+ **在单个分块中传输有效载荷**：在这种情况下，您可以使用以下签名计算选项：

   
  + **签名的有效载荷选项**：您可以选择计算整个有效载荷校验和并将其包含在签名计算中。这增加了安全性，但您需要读取两次有效载荷或将其缓冲到内存中。

    例如，为了上传文件，您需要先读取文件以计算签名计算的有效载荷哈希值，然后在创建请求时再次读取文件以进行传输。对于较小的有效载荷，这种方法可能更可取。但是，对于大型文件，读取文件两次可能效率低下，因此您可能需要改为分块上传数据。

    为了提高安全性，我们建议您包含有效载荷校验和。
  + **未签名的有效载荷选项**：不在签名计算中包含有效载荷校验和。

  有关计算签名和构造 Authorization 标头值的分步说明，请参阅 [Authorization 标头的签名计算：在单个分块中传输有效载荷（Amazon 签名版本 4）](sig-v4-header-based-auth.md)。
+ **在多个分块中传输有效载荷（分块上传）**：在这种情况下，您可以分块传输有效载荷。无论有效载荷大小如何，您都可以分块传输有效载荷。

  您可以将有效载荷分成多个分块。这些分块可以是固定大小，也可以是可变大小。通过分块上传数据，可以避免读取整个有效载荷来计算签名。相反，对于第一个分块，您可以计算仅使用请求标头的种子签名。第二个分块包含第一个分块的签名，随后的每个分块都包含其前一个分块的签名。在上传结束时，您将发送一个包含 0 字节数据的最后一个分块，其中包含有效载荷的最后一个分块的签名。有关更多信息，请参阅 [Authorization 标头的签名计算：在多个分块中传输有效载荷（分块上传）（Amazon 签名版本 4）](sigv4-streaming.md)。

签署请求时，您可以使用 Amazon 签名版本 4 或 Amazon 签名版本 4A。两者之间的关键区别取决于签名的计算方式。对于 Amazon 签名版本 4A，签名不包含区域特定的信息，并且使用 `AWS4-ECDSA-P256-SHA256` 算法计算得出。

除了这些选项外，您还可以选择在请求中加入尾部。为了在请求中包含尾部，您需要通过将 `x-amz-content-sha256` 设置为适当的值来在标头中指定该尾部。如果您使用的是尾随标头，则必须在标头中包含 `x-amz-trailer`，并将尾随标头名称指定为逗号分隔列表中的字符串。所有尾随标头都在最后一个分块之后写入。如果您要将数据分成多个分块进行上传，则在发送尾随标头之前，必须发送包含 0 字节数据的最后一个分块。

发送请求时，您必须通过添加带有以下值之一的 `x-amz-content-sha256` 标头，来告诉 Amazon S3 您在签名计算中选择了上述哪个选项：

 


| 标头值 | 说明 | 
| --- | --- | 
| 实际有效载荷校验和值 | 此值是对象的实际校验和，仅当您在单个分块中上传数据时才适用。 | 
| UNSIGNED-PAYLOAD | 当您将对象作为单个未签名的分块上传时，使用此值。 | 
| STREAMING-UNSIGNED-PAYLOAD-TRAILER | 在通过多个分块发送未签名的有效载荷时，使用此值。在这种情况下，在上传分块后，您还有一个尾随标头。 | 
| STREAMING-AWS4-HMAC-SHA256-PAYLOAD | 在通过多个分块发送有效载荷并使用 `AWS4-HMAC-SHA256` 对分块进行签名时，使用此值。这会生成一个 SigV4 签名。 | 
| STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER | 在通过多个分块发送有效载荷并使用 `AWS4-HMAC-SHA256` 对分块进行签名时，使用此值。这会生成一个 SigV4 签名。此外，分块的摘要作为尾随标头包含在内。 | 
| STREAMING-AWS4-ECDSA-P256-SHA256-PAYLOAD | 在通过多个分块发送有效载荷并使用 `AWS4-ECDSA-P256-SHA256` 对分块进行签名时，使用此值。这会生成一个 SigV4A 签名。 | 
| STREAMING-AWS4-ECDSA-P256-SHA256-PAYLOAD-TRAILER | 在通过多个分块发送有效载荷并使用 `AWS4-ECDSA-P256-SHA256` 对分块进行签名时，使用此值。这会生成一个 SigV4A 签名。此外，分块的摘要作为尾随标头包含在内。 | 



收到请求后，Amazon S3 使用 `Authorization` 标头和 `date` 标头中的信息重新创建待签字符串。然后，它使用身份验证服务来验证签名是否匹配。可以使用 HTTP `Date` 或 `x-amz-date` 标头来指定请求日期。如果两个标头都存在，则 `x-amz-date` 优先。

如果签名匹配，Amazon S3 会处理您的请求；否则，您的请求将失败。



有关更多信息，请参阅以下主题：

[Authorization 标头的签名计算：在单个分块中传输有效载荷（Amazon 签名版本 4）](sig-v4-header-based-auth.md)

[Authorization 标头的签名计算：在多个分块中传输有效载荷（分块上传）（Amazon 签名版本 4）](sigv4-streaming.md)

[尾随标头的签名计算（分块上传）（Amazon 签名版本 4）](sigv4-streaming-trailers.md)