Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

通过使用客户提供的加密密钥的服务器端加密 (SSE-C) 保护数据

服务器端加密是为了保护静态数据。使用客户提供的加密密钥的服务器端加密 (SSE-C) 允许您设置自己的加密密钥。使用您作为请求的一部分提供的加密密钥,Amazon S3 在写入磁盘时管理加密并在您访问对象时管理解密。因此,您不需要维护任何代码来执行数据加密和解密。您只需管理您提供的加密密钥。

在您上传对象时,Amazon S3 将使用您提供的加密密钥对您的数据应用 AES-256 加密并从内存中移除加密密钥。

重要

Amazon S3 不存储您提供的加密密钥,而是存储加密密钥添加了随机数据的 HMAC 值来验证未来的请求。无法使用添加了随机数据的 HMAC 值来推导出加密密钥的值或解密加密对象的内容。这意味着,如果您丢失加密密钥,则会失去该对象。

在检索对象时,必须提供相同的加密密钥作为您请求的一部分。Amazon S3 在将对象数据返回给您之前,会首先验证您提供的加密密钥是否匹配,然后再解密对象。

SSE-C 的要点是:

  • 您必须使用 https。

    重要

    在使用 SSE-C 时,Amazon S3 会拒绝通过 http 提出的所有请求。出于安全原因,我们建议您考虑您错误地使用 http 发送的任何密钥都将被外泄。您应丢弃该密钥,并根据需要轮换密钥。

  • 响应中的 ETag 不是对象数据的 MD5。

  • 您管理哪个加密密钥用于加密哪个对象的映射。Amazon S3 不存储加密密钥。您负责跟踪为哪个对象提供了哪个加密密钥。

    • 如果您的存储桶启用了版本控制,则您使用此功能上传的每个对象版本可能都具有自己的加密密钥。您负责跟踪哪个加密密钥用于哪个对象版本。

    • 因为您在客户端管理加密密钥,所以也要在客户端管理所有额外的保护措施,例如密钥轮换。

    警告

    如果您丢失加密密钥,则针对某个对象的没有其加密密钥的任何 GET 请求都将失败,并且您将失去该对象。

使用 SSE-C

在使用具有客户提供的加密密钥的服务器端加密 (SSE-C) 时,您必须使用以下请求标头提供加密密钥信息。

名称 说明
x-amz-server-side​-encryption​-customer-algorithm

使用此标头来指定加密算法。标头值必须为“AES256”。

x-amz-server-side​-encryption​-customer-key

使用此标头来提供 256 位的 base64 编码的加密密钥以供 Amazon S3 用于加密或解密您的数据。

x-amz-server-side​-encryption​-customer-key-MD5

使用此标头根据 RFC 1321 提供加密密钥的 base64 编码的 128 位 MD5 摘要。Amazon S3 使用此标头进行消息完整性检查以确保加密密钥的传输无误。

您可以使用 AWS 开发工具包包装库将这些标头添加到您的请求中。如果需要,您可以直接在应用程序中调用 Amazon S3 REST API。

注意

不能使用 Amazon S3 控制台来上传对象和请求 SSE-C。也不能使用控制台来更新使用 SSE-C 存储的现有对象 (例如,更改存储类别或添加元数据)。

以下 Amazon S3 API 支持这些标头。

  • GET 操作 - 在使用 GET API 检索对象 (请参阅 GET Object) 时,您可以指定请求标头。使用 SSE-C 加密的对象不支持 Torrent。

  • HEAD 操作 - 要使用 HEAD API 检索对象元数据 (请参阅 HEAD Object),可以指定这些请求标头。

  • PUT 操作 - 使用 PUT API 上传数据 (请参阅 PUT Object) 时,可以指定这些请求标头。

  • Multipart Upload - 在使用分段上传 API 上传大对象时,可以指定这些标头。您在启动请求 (请参阅 Initiate Multipart Upload) 和每个后续分段上传请求 (Upload Part) 中指定这些标头。对于每个分段上传请求,加密信息必须与您在启动分段上传请求中提供的信息相同。

  • POST 操作 - 使用 POST 操作上传对象 (请参阅 POST Object) 时,可在表单字段而不是请求标头中提供相同的信息。

  • Copy 操作 - 复制对象 (请参阅 PUT Object - Copy) 时,您同时具有源对象和目标对象。因此,您需要考虑以下方面:

    • 如果您希望使用具有 AWS 托管密钥的服务器端加密对目标对象加密,则必须提供 x-amz-server-side​-encryption 请求标头。

    • 如果您希望使用 SSE-C 对目标对象加密,则必须使用上表中描述的三个标头提供加密信息。

    • 如果源对象是使用 SSE-C 加密的,则您必须使用以下标头提供加密密钥信息,以便 Amazon S3 可以解密对象以进行复制。

      名称 说明
      x-amz-copy-source​-server-side​-encryption​-customer-algorithm

      包括此标头以指定 Amazon S3 用于解密源对象的算法。此值必须是 AES256

      x-amz-copy-source​-server-side​-encryption​-customer-key

      包括此标头以提供 base64 编码的加密密钥,供 Amazon S3 用于解密源对象。此加密密钥必须是您在创建源对象时为 Amazon S3 提供的加密密钥;否则,Amazon S3 将无法解密对象。

      x-amz-copy-source-​server-side​-encryption​-customer-key-MD5

      包括此标头以根据 RFC 1321 提供加密密钥的 base64 编码的 128 位 MD5 摘要。

预签名 URL 和 SSE-C

您可以生成可用于上传新对象、检索现有对象或对象元数据等操作的预签名 URL。预签名 URL 支持 SSE-C,如下所示:

  • 在创建预签名 URL 时,您必须在签名计算中使用 x-amz-server-side​-encryption​-customer-algorithm 指定算法。

  • 在使用预签名 URL 上传新对象、检索现有对象或仅检索对象元数据时,您必须在您的客户端应用程序中提供所有加密标头。

有关更多信息,请参阅以下主题: