

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 将加密的数据上载到 Amazon S3
<a name="t_uploading-encrypted-data"></a>

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

## 服务器端加密
<a name="server-side-encryption"></a>

服务器端加密是静态数据加密，即，Amazon S3 在上载数据时对其进行加密，并在您访问时进行解密。当您使用 COPY 命令加载表时，在 Amazon S3 上从服务器端加密或解密的对象的加载方式没有不同。有关服务器端加密的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[使用服务器端加密](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingServerSideEncryption.html)。

## 客户端加密
<a name="client-side-encryption"></a>

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

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

要在 Amazon Redshift 中使用 Amazon S3 客户端加密数据，请按照《Amazon Simple Storage Service 用户指南》**中的[使用客户端加密保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingClientSideEncryption.html)所列的步骤操作，并满足您使用的其它要求：
+ **对称加密 –** Amazon 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 用户指南》**中的[使用 Amazon SDK for Java 指定客户端加密](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingClientSideEncryptionUpload.html)。

有关使用 COPY 命令将客户端加密的文件加载到 Amazon Redshift 表中的信息，请参阅[从 Amazon S3 中加载加密的数据文件](c_loading-encrypted-files.md)。

## 示例：上传客户端加密数据
<a name="client-side-encryption-example"></a>

有关如何使用 Amazon SDK for Java 上载客户端加密数据的示例，请转到《Amazon Simple Storage Service 用户指南》**中的[使用客户端加密保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/encrypt-client-side-symmetric-master-key.html)。

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

本示例代码使用 Amazon SDK for Java 创建 256 位 AES 对称根密钥并将它保存到文件。然后，本示例使用首先加密客户端上样本数据的 S3 加密客户端将一个对象上传到 Amazon S3。示例还将下载该对象，并验证数据是否相同。