AWS Encryption SDK 的最佳实践 - AWS Encryption SDK

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

AWS Encryption SDK 的最佳实践

AWS Encryption SDK 旨在让您轻松使用行业标准和最佳实践来保护数据。虽然在默认值中为您选择了许多最佳实践,但有些做法是可选的,建议在实际可行时使用。

使用最新版本

开始使用 AWS Encryption SDK 时,请使用以您的首选编程语言提供的最新版本。如果您一直在使用 AWS Encryption SDK,请尽快升级为最新版本。这样可以确保您使用推荐的配置并利用新的安全属性来保护您的数据。有关支持的版本的详细信息,包括迁移和部署指南,请参阅 支持和维护的版本 AWS Encryption SDK

如果新版本弃用了您代码中的元素,请尽快将其替换。弃用警告和代码注释中通常会推荐不错的替代方案。

为了简化重大升级并减少出错的可能性,我们偶尔会提供临时或过渡版本。使用这些版本及其随附的文档,确保您可以在不中断生产工作流的情况下升级应用程序。

使用默认值

AWS Encryption SDK 将最佳实践设计为其默认值。只要可行,就应使用默认值。对于默认值不可行的情况,我们提供替代方案,例如无需签名的算法套件。我们还为高级用户提供定制机会,例如自定义密钥环、主密钥提供程序和加密材料管理器(CMM)。请谨慎使用这些高级替代方案,并尽可能让安全工程师验证您的选择。

使用加密上下文

为了提高加密操作安全性,请在所有加密数据的请求中包含具有有意义的值的加密上下文。使用加密上下文是可选的,但这是我们建议遵守的加密最佳实践。加密上下文为 AWS Encryption SDK 中的身份验证加密提供额外验证数据(AAD)。尽管这不是密钥,但加密上下文可以帮助您保护加密数据的完整性和真实性

在 AWS Encryption SDK 中,只有在加密时才能指定加密上下文。解密时,AWS Encryption SDK 使用 AWS Encryption SDK 返回的加密消息标头中的加密上下文。在应用程序返回明文数据之前,请验证在解密消息时使用的加密上下文中是否包含加密消息使用的加密上下文。有关详细信息,请参阅您的编程语言的示例。

当您使用命令行界面时,AWS Encryption SDK 会为您验证加密上下文。

保护包装密钥

AWS Encryption SDK 生成一个唯一的数据密钥来加密每条明文消息。然后,使用您提供的包装密钥对数据密钥进行加密。如果您的包装密钥丢失或删除,则您的已加密数据将无法恢复。如果您的密钥不安全,您的数据可能会受到攻击。

使用受安全密钥基础设施保护的包装密钥,例如 AWS Key Management Service(AWS KMS)。使用原始 AES 或原始 RSA 密钥时,请使用符合安全要求的随机源和持久存储。最佳实践是生成包装密钥并将其存储在硬件安全模块(HSM)或提供 HSM 的服务(例如 AWS CloudHSM)中。

使用密钥基础设施的授权机制限制包装密钥的访问,只有需要的用户才能访问。实施最佳实践原则,例如最低权限。使用 AWS KMS keys 时,请使用实施最佳实践原则的密钥政策和 IAM policy。

指定包装密钥

解密和加密时明确指定包装密钥始终是最佳实践。当您这样做时,AWS Encryption SDK 仅使用您指定的密钥。这种做法可确保仅使用想要的加密密钥。对于 AWS KMS 包装密钥,还可以防止您无意中使用其他 AWS 账户 或区域的密钥,或者尝试使用您无权使用的密钥进行解密,从而提高性能。

加密时,AWS Encryption SDK 提供的密钥环和主密钥提供程序要求您指定包装密钥。这些程序仅使用您指定的全部包装密钥。在使用原始 AES 密钥环、原始 RSA 密钥环和 JCEMasterKeys 进行加密和解密时,您还需要指定包装密钥。

但是,使用 AWS KMS 密钥环和主密钥提供程序进行解密时,您无需指定包装密钥。AWS Encryption SDK 可以从加密数据密钥的元数据中获取密钥标识符。但是指定包装密钥是我们推荐的最佳实践。

为了在使用 AWS KMS 包装密钥时支持最佳实践,我们建议采取以下措施:

  • 使用指定包装密钥的 AWS KMS 密钥环。加密和解密时,这些密钥环仅使用您指定的指定包装密钥。

  • 使用 AWS KMS 主密钥和主密钥提供程序时,请使用 AWS Encryption SDK 的 版本 1.7.x 中引入的严格模式构造函数。这些函数创建的提供程序仅使用您指定的包装密钥进行加密和解密。始终使用任何包装密钥进行解密的主密钥提供程序的构造函数在版本 1.7.x 中被弃用,在版本 2.0.x 中被删除。

当指定用于解密的 AWS KMS 包装密钥不切实际时,您可以使用发现提供程序。C 和 JavaScript 中的 AWS Encryption SDK 支持 AWS KMS Discovery 密钥环。在版本 1.7.x 及更高版本中,具有发现模式的主密钥提供程序可用于 Java 和 Python。这些发现提供程序仅用于使用 AWS KMS 包装密钥进行解密,明确指示 AWS Encryption SDK 使用加密数据密钥的任何包装密钥。

如果您必须使用发现提供程序,请使用其发现筛选条件功能来限制使用的包装密钥。例如,AWS KMS Regional Discovery 密钥环仅使用特定 AWS 区域 中的包装密钥。您还可以将 AWS KMS 密钥环和 AWS KMS 主密钥提供程序配置,以便仅使用特定 AWS 账户 中的包装密钥。此外,与往常一样,使用密钥政策和 IAM policy 来控制对 AWS KMS 包装密钥的访问。

使用数字签名

最佳实践是使用带签名的算法套件。数字签名可验证邮件发件人是否有权发送消息并保护消息的完整性。默认情况下,所有版本 AWS Encryption SDK 都使用带签名的算法套件。

如果您的安全要求不包括数字签名,则可以选择不带数字签名的算法套件。但是,我们建议使用数字签名,特别是当一组用户加密数据而另一组用户解密该数据时。

使用密钥承诺

最佳实践是使用密钥承诺安全功能。通过验证加密数据的唯一数据密钥的身份,密钥承诺可以防止您解密任何可能生成多条明文消息的加密文字。

版本 2.0.x 开始,AWS Encryption SDK 通过密钥承诺为加密和解密提供全面支持。默认情况下,您的所有消息都使用密钥承诺进行加密和解密。AWS Encryption SDK 的版本 1.7.x 可以通过密钥承诺解密加密文字。其旨在帮助早期版本的用户成功部署版本 2.0.x

对密钥承诺的支持包括新算法套件新消息格式,该格式生成的加密文字仅比没有密钥承诺的加密文字大 30 字节。该设计最大限度减少了其对性能的影响,因此大多数用户都可以享受密钥承诺带来的好处。如果您的应用程序对大小和性能非常敏感,您可以决定使用承诺策略设置来禁用密钥承诺或允许 AWS Encryption SDK 在没有承诺的情况下解密消息,但请仅在必要时才这样做。

限制加密的数据密钥的数量

最佳实践是在您解密的消息中限制加密的数据密钥的数量,尤其是来自不可信来源的消息。使用大量您无法解密的加密数据密钥来解密消息可能会导致延迟时间延长,增加开支,限制您的应用程序和其他共享您账户的应用程序,并可能耗尽密钥基础设施。在没有限制的情况下,加密消息最多可以有 65535(2^16 - 1)个加密数据密钥。有关详细信息,请参阅 限制加密数据密钥

有关这些最佳实践所依据的 AWS Encryption SDK 安全功能的更多信息,请参阅 AWS 安全博客中的 Improved client-side encryption: Explicit KeyIds and key commitment