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

将加密数据上传到 Amazon S3

Amazon S3 支持服务器端加密和客户端加密。本主题将讨论服务器端加密和客户端加密的区别,并介绍将客户端加密用于 Amazon Redshift 的步骤。服务器端加密对 Amazon Redshift 是透明的。

服务器端加密

服务器端加密是静态数据加密,即,Amazon S3 在上传数据时对其进行加密,并在您访问时进行解密。当您使用 COPY 命令加载表时,在 Amazon S3 上从服务器端加密或解密的对象的加载方式没有不同。有关服务器端加密的更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的使用服务器端加密

客户端加密

在客户端加密中,您的客户端应用程序管理数据的加密、加密密钥和相关的工具。您可以使用客户端加密将数据上传到 Amazon S3 存储桶,然后使用带有 ENCRYPTED 选项的 COPY 命令和私有加密密钥加载数据,以实现更强的安全性。

您使用信封加密来加密您的数据。借助信封加密,您的应用程序可专门处理所有加密。您的私有加密密钥和未加密的数据从来不会发送到 AWS,因此请您务必妥善管理好您的加密密钥。如果您丢失了加密密钥,您将无法解密数据,而且,您无法从 AWS 找回您的加密密钥。信封加密结合了快速对称加密的性能,同时保持了使用非对称密钥进行密钥管理所获得的更强的安全性。Amazon S3 加密客户端生成一次性对称密钥(信封对称密钥)来加密数据,然后由您的主密钥对其进行加密并与您的数据一起存储在 Amazon S3 中。在加载过程中,当 Amazon Redshift 访问您的数据时,将检索加密的对称密钥并使用您的实际密钥对其进行加密,然后解密数据。

要在 Amazon Redshift 中使用 Amazon S3 客户端加密数据,请按照 Amazon Simple Storage Service 开发人员指南 中的使用客户端加密保护数据中概述的步骤操作,其中包括您使用的一些额外要求:

  • 对称加密 - 适用于 Java 的 AWS 开发工具包的 AmazonS3EncryptionClient 类使用信封加密,如前所述,信封加密是基于对称密钥加密的。使用此类可创建要上传客户端加密数据的 Amazon S3 客户端。

  • 256 位 AES 主对称密钥 - 主密钥将对信封密钥进行加密。您将主密钥传递给 AmazonS3EncryptionClient 类的实例。保存此密钥,因为您将需要用它来将数据复制到 Amazon Redshift 中。

  • 存储加密信封密钥的对象元数据 - 默认情况下,Amazon S3 将信封密钥存储为 AmazonS3EncryptionClient 类的对象元数据。存储为对象元数据的加密信封密钥将在加密过程中使用。

注意

首次使用加密 API 时,如果您收到密码加密错误消息,则您的 JDK 版本可能带有一个 Java Cryptography Extension (JCE) 区域策略文件,该文件将加密和解密转换的最大密钥长度限制为 128 位。有关解决该问题的信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的使用适用于 Java 的 AWS 开发工具包指定客户端加密

有关使用 COPY 命令将客户端加密的文件加载到 Amazon Redshift 表中的信息,请参阅从 Amazon S3 加载加密数据文件

示例:上传客户端加密数据

有关如何使用适用于 Java 的 AWS 开发工具包上传客户端加密数据的示例,请参阅 Amazon Simple Storage Service 开发人员指南 中的示例 1:使用客户端对称主密钥加密和上传文件

该示例展示了您若要在 Amazon Redshift 中加载数据而必须在客户端加密期间做出的选择。具体来讲,该示例展示了使用对象元数据来存储加密信封密钥和 256 位 AES 主对称密钥的使用。

本示例代码使用适用于 Java 的 AWS 开发工具包创建 256 位 AES 对称主密钥并将它保存到文件。然后,本示例使用首先加密客户端上示例数据的 S3 加密客户端将一个对象上传到 Amazon S3。示例还将下载该对象,并验证数据是否相同。