对请求进行签名 - Amazon S3 Glacier
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

如果您不熟悉 Amazon Simple Storage Service (Amazon S3) 中的归档存储功能,建议您先详细了解 Amazon S3 中的 S3 Glacier 存储类、S3 Glacier 即时检索S3 Glacier 灵活检索S3 Glacier 深度归档。有关更多信息,请参阅 Amazon S3 用户指南中的 S3 Glacier 存储类和用于存档对象的存储类。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

对请求进行签名

S3 Glacier 要求通过对请求进行签名,验证所发送的每个请求的身份。您使用加密哈希函数计算数字签名,从而对请求签名。加密哈西是根据输入内容返回唯一哈希值的函数。对哈希函数的输入内容包括您的请求文本和秘密访问密钥。哈希函数返回哈希值,您将该值包含在请求中,作为签名。该签名是您的请求的 Authorization 标头的一部分。

收到您的请求后,S3 Glacier 使用与您用于对该请求进行签名的相同哈希函数和输入重新计算签名。如果所得签名与该请求中的签名相匹配,则 S3 Glacier 处理该请求。否则,请求将被拒绝。

S3 Glacier 支持使用Amazon 签名版本 4 进行身份验证。计算签名的过程可分为三个任务:

  • 任务 1:创建规范请求

    将您的 HTTP 请求重新排列为规范格式。必须使用规范格式,因为 S3 Glacier 在重新计算签名以与您发送的签名进行比较时使用同一规范格式。

  • 任务 2:创建待签字符串

    创建一个字符串,将该字符串用作您的加密哈希函数输入值中的一项。该字符串称为待签字符串,是哈希算法名称、请求日期、凭证范围字符串以及来自上一任务的规范化请求的结合。凭证范围字符串本身是日期、Amazon 区域和服务信息的结合。

  • 任务 3:创建签名

    使用加密哈希函数为您的请求创建签名,该函数接受两种输入字符串:待签字符串派生密钥派生密钥的计算方法是,以您的秘密访问密钥为开始并使用凭证范围字符串来创建一系列 HMAC 散列消息认证码 (HMAC)。请注意,此签名步骤中使用的哈希函数不是上传数据的 S3 Glacier API 中使用的树形哈希算法。

实例签名计算

以下示例引导您了解为 创建文件库(设置文件库) 创建签名的详细信息。该示例可用作核查您的签名计算方法的参考。有关更多信息,请参阅《IAM 用户指南》中的签署 Amazon API 请求

示例假定以下各项:

  • 请求的时间戳为 Fri, 25 May 2012 00:24:53 GMT

  • 端点为美国东部(弗吉尼亚州北部)区域 us-east-1

通用请求语法 (包括 JSON 正文) 为:

PUT /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Fri, 25 May 2012 00:24:53 GMT Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

任务 1:创建规范请求计算的规范请求格式为:

PUT /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-date:20120525T002453Z x-amz-glacier-version:2012-06-01 host;x-amz-date;x-amz-glacier-version e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

规范请求的最后一行是请求正文的哈希值。另外,请注意规范请求的第三行是空的。这是因为此 API 没有查询参数。

任务 2:创建待签字符串待签字符串为:

AWS4-HMAC-SHA256 20120525T002453Z 20120525/us-east-1/glacier/aws4_request 5f1da1a2d0feb614dd03d71e87928b8e449ac87614479332aced3a701f916743

待签字符串的第一行是算法,第二行是时间戳,第三行是凭证范围,最后一行是来自任务 1:创建规范请求的规范请求的哈希。要在凭证范围中使用的服务名称为 glacier

对于任务 3:创建签名派生密钥可以表示为:

derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20120525"),"us-east-1"),"glacier"),"aws4_request")

如果使用秘密访问密钥 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY,则计算出的签名为:

3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

最终步骤是构造 Authorization 标头。对于示例访问密钥 AKIAIOSFODNN7EXAMPLE,标头(为了便于阅读,添加了换行符)为:

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120525/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-date;x-amz-glacier-version, Signature=3ce5b2f2fffac9262b4da9256f8d086b4aaf42eba5f111c21681a65a127b7c2a

为流式处理操作计算签名

上传档案(发布档案)上传段(设置上传 ID)为流式处理操作,这些操作要求您在对请求签名以及发送请求时包括一个附加标头 x-amz-content-sha256。流式处理操作的签名步骤与其他操作的签名步骤完全相同,只是要另外添加流式处理标头。

流式处理标头 x-amz-content-sha256 的计算基于要上传的整个内容(有效负载)的 SHA256 哈希。请注意,此计算不同于 SHA256 树形哈希 (计算校验和)。除了微不足道的案例以外,有效负载数据的 SHA256 哈希值将不同于有效负载数据的 SHA256 树形哈希。

如果将有效负载数据指定为字节数组,则您可以使用以下 Java 代码段来计算 SHA256 哈希。

public static byte[] computePayloadSHA256Hash2(byte[] payload) throws NoSuchAlgorithmException, IOException { BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream(payload)); MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); byte[] buffer = new byte[4096]; int bytesRead = -1; while ( (bytesRead = bis.read(buffer, 0, buffer.length)) != -1 ) { messageDigest.update(buffer, 0, bytesRead); } return messageDigest.digest(); }

类似地,在 C# 中,您可以计算有效负载数据的 SHA256 哈希,如以下代码段所示。

public static byte[] CalculateSHA256Hash(byte[] payload) { SHA256 sha256 = System.Security.Cryptography.SHA256.Create(); byte[] hash = sha256.ComputeHash(payload); return hash; }

流式处理 API 的示例签名计算

以下示例引导您了解为上传档案(发布档案)(S3 Glacier 中的两个流式处理 API 之一)创建签名的详细信息。示例假定以下各项:

  • 请求的时间戳为 Mon, 07 May 2012 00:00:00 GMT

  • 端点为美国东部(弗吉尼亚州北部)区域 。

  • 内容有效负载为字符串“Welcome to S3 Glacier”。

通用请求语法(包括 JSON 正文)显示在以下示例中。请注意,其中包括了 x-amz-content-sha256 标头。在此简化示例中,x-amz-sha256-tree-hashx-amz-content-sha256 是相同的值。但是,对于大于 1MB 的档案上传,情况就不是这样。

POST /-/vaults/examplevault HTTP/1.1 Host: glacier.us-east-1.amazonaws.com Date: Mon, 07 May 2012 00:00:00 GMT x-amz-archive-description: my archive x-amz-sha256-tree-hash: SHA256 tree hash x-amz-content-sha256: SHA256 payload hash Authorization: SignatureToBeCalculated x-amz-glacier-version: 2012-06-01

任务 1:创建规范请求计算的规范请求格式显示如下。请注意,其中包括了流式处理标头 x-amz-content-sha256 及其值。这意味着,您必须首先读取有效负载并计算 SHA256 哈希,然后再计算签名。

POST /-/vaults/examplevault host:glacier.us-east-1.amazonaws.com x-amz-content-sha256:726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628 x-amz-date:20120507T000000Z x-amz-glacier-version:2012-06-01 host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version 726e392cb4d09924dbad1cc0ba3b00c3643d03d14cb4b823e2f041cff612a628

签名计算的其余操作遵循实例签名计算中所述的步骤。使用秘密访问密钥 Authorization 和访问密钥 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYAKIAIOSFODNN7EXAMPLE 标头显示如下(为了便于阅读,添加了换行符):

Authorization=AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20120507/us-east-1/glacier/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-glacier-version, Signature=b092397439375d59119072764a1e9a144677c43d9906fd98a5742c57a2855de6