将加密的数据上载到 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 用户指南》中的使用客户端加密保护数据所列的步骤操作,并满足您使用的其它要求:
-
对称加密 – AWS SDK for Java
AmazonS3EncryptionClient
类使用信封加密,如前所述,信封加密是基于对称密钥加密的。使用此类可创建要上载客户端加密数据的 Amazon S3 客户端。 -
256 位 AES 根对称密钥 – 根密钥将对信封密钥进行加密。您将根密钥传递给
AmazonS3EncryptionClient
类的实例。保存此密钥,因为您将需要用它来将数据复制到 Amazon Redshift 中。 -
存储加密信封密钥的对象元数据 – 预设情况下,Amazon S3 将信封密钥存储为
AmazonS3EncryptionClient
类的对象元数据。存储为对象元数据的加密信封密钥将在加密过程中使用。
注意
首次使用加密 API 时,如果您收到密码加密错误消息,则您的 JDK 版本可能带有一个 Java Cryptography Extension (JCE) 区域策略文件,该文件将加密和解密转换的最大密钥长度限制为 128 位。有关解决此问题的信息,请转到《Amazon Simple Storage Service 用户指南》中的使用 AWS SDK for Java 指定客户端加密。
有关使用 COPY 命令将客户端加密的文件加载到 Amazon Redshift 表中的信息,请参阅从 Amazon S3 中加载加密的数据文件。
示例:上传客户端加密数据
有关如何使用 AWS SDK for Java 上载客户端加密数据的示例,请转到《Amazon Simple Storage Service 用户指南》中的使用客户端加密保护数据。
第二个选项展示了您若要在 Amazon Redshift 中加载数据而必须在客户端加密期间做出的选择。具体来讲,该示例展示了使用对象元数据来存储加密信封密钥和 256 位 AES 根对称密钥的使用。
本示例代码使用 AWS SDK for Java 创建 256 位 AES 对称根密钥并将它保存到文件。然后,本示例使用首先加密客户端上样本数据的 S3 加密客户端将一个对象上传到 Amazon S3。示例还将下载该对象,并验证数据是否相同。