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.

使用客户端加密保护数据

客户端加密是指在将数据发送到 Amazon S3 之前对其进行加密。对于数据加密密钥的使用,您有以下两种选择:

  • 使用 AWS KMS 托管客户主密钥

  • 使用客户端主密钥

选项 1:使用 AWS KMS 托管客户主密钥 (CMK)

在将 AWS KMS 托管客户主密钥用于客户端数据加密时,您无需考虑向 Amazon S3 加密客户端提供任何加密密钥 (例如适用于 Java 的 AWS 开发工具包中的 AmazonS3EncryptionClient)。而是只需提供 AWS KMS 客户主密钥 ID (CMK ID),然后客户端将负责剩余的工作。以下是具体工作原理:

  • 上传对象时 – 通过使用 CMK ID,客户端首先会向 AWS KMS 发送一个请求,申请一个可用于加密您的对象数据的密钥。作为响应,AWS KMS 会返回一个随机生成的数据加密密钥。事实上,AWS KMS 会返回两种版本的数据加密密钥:

    • 客户端用于加密对象数据的明文版本。

    • 客户端会作为对象元数据上传到 Amazon S3 的同一数据加密密钥的密码 blob。

    注意

    客户端为其上传的每个对象获取一个唯一的数据加密密钥。

    要了解可工作的示例,请参阅示例:客户端加密 (选项 1:使用 AWS KMS 托管客户主密钥 - 适用于 Java 的 AWS 开发工具包)

  • 下载对象时 – 客户端首先从 Amazon S3 下载加密的对象以及作为对象元数据存储的数据加密密钥的密码 blob 版。然后,客户端将密码 blob 发送到 AWS KMS,以获取同一密钥的明文版本,以便其解密对象数据。

有关 AWS KMS 的更多信息,请转到什么是 AWS 密钥管理服务? (在 AWS Key Management Service Developer Guide 中)。

选项 2:使用客户端主密钥

此部分显示在客户端数据加密过程中如何为您提供客户端主密钥。

重要

不会将您的客户端主密钥和未加密的数据发送到 AWS;因此,请您务必妥善管理您的加密密钥。如果您丢失了加密密钥,将无法解密数据。

以下是具体工作原理:

  • 上传对象时 – 您会向 Amazon S3 加密客户端提供一个客户端主密钥 (例如,使用适用于 Java 的 AWS 开发工具包时为 AmazonS3EncryptionClient)。客户端只使用此主密钥加密其随机生成的数据加密密钥。该过程的工作方式如下所示:

    1. Amazon S3 加密客户端会在本地生成一个一次性的对称密钥 (也称为“数据加密密钥”或“数据密钥”)。它使用此数据密钥来加密单个 S3 对象的数据 (针对每个对象,客户端会生成单独的数据密钥)。

    2. 客户端使用您所提供的主密钥来加密数据加密密钥。

      客户端会将加密的数据密钥及其材料说明作为对象元数据的一部分上传。之后,材料说明会帮助客户端确定使用哪个客户端主密钥解密 (当您下载对象时,客户端会将其解密)。

    3. 然后客户端会将加密数据上传到 Amazon S3,同时在 Amazon S3 中将加密数据默认保存为对象元数据 (x-amz-meta-x-amz-key)。

  • 下载对象时 – 客户端首先从 Amazon S3 下载加密的对象以及元数据。通过使用元数据中的材料说明,客户端首先会确定使用哪个主密钥解密加密的数据密钥。客户端使用此主密钥来解密数据密钥,并使用它来解密对象。

您所提供的客户端主密钥可以是对称密钥,也可以是公有/私有密钥对。有关示例,请参阅 示例:客户端加密 (选项 2:使用客户端主密钥 - 适用于 Java 的 AWS 开发工具包)

有关更多信息,请参阅使用 AWS SDK for Java 和 Amazon S3 进行的客户端数据加密文章。

以下 AWS 开发工具包支持客户端加密: