亚马逊AWS官方博客

AWS 加密开发工具包:如何确定数据密钥缓冲是否适合您的应用程序

AWS KMS 映像

今天,AWS 加密工具团队宣布在 AWS 加密工具包中推出一项新功能:数据密钥缓存。借助数据密钥缓存功能,您可以重复使用保护数据所用的数据密钥,不再需要为每个加密操作生成一个新的密钥。

数据密钥缓存可以减少延迟,提高吞吐量,降低成本,帮助您在应用程序扩展的同时不超过服务限制。当您的应用程序触及 AWS Key Management Service (KMS) 的每秒请求数限制,并且执行放宽限制也无法解决问题时,缓存功能可能尤其有用。

当然,这些便利也涉及一些安全性方面的权衡。加密最佳实践一般不鼓励广泛重复利用数据密钥。

在本博文中,我将探索这些权衡,并且将提供相关的信息,以帮助您确定数据密钥缓存是否是适合您的应用程序的好策略。此外,我还将解释如何在 AWS 加密开发工具包中实施数据密钥缓存,并介绍您可以设置的安全阈值,以限制数据密钥的重复使用。最后,我将提供一些有关使用安全阈值来满足成本、性能和安全性目标的实践案例。

数据密钥缓存简介

AWS 加密工具包是一种客户端侧加密库,它可方便您在应用程序中实施加密最佳实践。它包含了多项面向不属于加密专家的开发人员的安全默认行为,同时又保持足够灵活,以便满足经验丰富用户的需要。

在 AWS 加密开发工具包中,按照默认设置,您将为每个加密操作生成一个新的数据密钥。这是最安全的实践。但在一些应用程序中,为每个操作生成一个新数据密钥的开销令人不可接受。

数据密钥缓存将会在一个可配置的缓存中,存储您使用的数据密钥的明文和密文。当您需要使用密钥来加密或解密数据时,您可以重复使用缓存中的数据密钥,而无需创建新的数据密钥。您可以创建多个数据密钥缓存并分别独立配置。最重要的是,AWS 加密工具包提供了安全阈值功能,您可以通过设置安全阈值来确定您将允许重复使用多少个数据密钥。

为方便数据密钥缓存的实施,AWS 加密开发工具包提供了一种称为 LocalCryptoMaterialsCache 的内存中缓存,它是一种最近最少使用型缓存,大小可以配置。这种软件开发工具包负责为您管理缓存,包括为所有加密和解密操作添加存储、搜索和匹配逻辑。

我们建议您按原样使用 LocalCryptoMaterialsCache 缓存,当然您也可以对它进行自定义或者使用兼容的缓存替换。但您绝对不要将明文数据密钥存储在磁盘上。

AWS 加密开发工具包文档包含了 Java 和 Python 格式的示例代码,该示例代码针对使用数据密钥缓存来加密 Amazon Kinesis Streams 收发的数据的应用程序。

成本与安全性的权衡

是否使用数据密钥缓存的决定,应当基于对成本(时间、资金和资源)和安全性的权衡。但在任何情况下,这种权衡应当以安全性要求优先。原则上,应使用实现成本和性能目标所需的最少缓存。

在实施数据密钥缓存前,请考虑您的应用程序的详细情况、您的安全性要求以及加密操作的成本和频率。一般而言,如果每项操作都非常缓慢或昂贵,或者您会频发进行数据加密和解密操作,则您的应用程序可通过数据密钥缓存受益。如果加密操作的成本和速度已经可接受,或者可以通过其他方式改进,则不要使用数据密钥缓存。

如果您的加密和解密流量非常高,则数据密钥缓存可能会适合您的应用程序。例如,如果您已经触及 KMS 每秒请求数限制,那么缓存将会非常有用,因为您将会从缓存中获取一些数据密钥,无需为每个请求调用 KMS。

当然,您也可以在 AWS 支持中心创建案例,申请增加账户的 KMS 限制。 如果放宽限制可以解决问题,则无需使用数据密钥缓存。

配置缓存阈值以优化成本和安全性

在 AWS 加密工具包中,您可以对数据密钥缓存进行配置,从而仅允许在满足成本和性能目标的范围内重复使用数据密钥,同时确保满足应用程序的安全性要求。此软件开发工具包会执行这些阈值,从而让您可以使用任何兼容的缓存。

数据密钥缓存的安全阈值适用于每个缓存条目。如果任何缓存条目超过您设置的任何阈值,则 AWS 加密开发工具包不会使用来自该缓存条目的数据密钥。

  • 最长寿命(必填项):每个缓存密钥的寿命,该参数的设置必须足够长以确保能获得缓存点击,同时又要足够短,以确保仅在特定的时间期限内在内存中暴露明文数据密钥。

您可以将最长寿命阈值作为密钥轮换策略来使用。使用它可以限制数据密钥的重复使用,减少加密材料的暴露。您还可以借助此功能,在应用程序处理的数据类型或来源发生变化时收回数据密钥。

  • 最大加密消息数(可选;默认值为 232 条消息):这是每个缓存密钥可以保护的消息数,它的设置必须足够大以确保重复利用的价值,同时要足够小以限制可能潜在暴露的消息数量。

AWS 加密开发工具包仅缓存使用算法套件密钥导出函数的数据密钥。这种方法避免了有关使用单个密钥加密的字节数的加密限制。但一个密钥加密的数据越多,该数据密钥泄露时暴露的数据也将越多。

限制消息的数量而不是字节数,在您的应用程序加密具有类似大小的许多消息时,或者潜在的暴露风险必须限制在极少数消息时尤其有用。当您希望将某个数据密钥重复用于特定类型的消息,并且事先知道您拥有多少条该类型的消息时,此阈值也将非常有用。您还可以使用加密上下文来为您的加密请求选择特定的缓存数据密钥。

  • 最大加密字节数(可选;默认值为 263 – 1):这是每个缓存数据密钥可以保护的字节数,它的设置应足够大以确保满足您的重复利用需求,同时要足够小以限制同一密钥加密的数据量。

限制字节数而不是消息数量,适合应用程序加密的消息大小差异较大,或者对可能会暴露大量数据的担忧远远高于暴露较小数量的数据等情形。

除这些安全阈值外,AWS 加密开发工具包中的 LocalCryptoMaterialsCache 还可让您设置容量,这是缓存中可以容纳的最大条目数量。

使用容量值来调整 LocalCryptoMaterialsCache 缓存的性能。一般而言,应使用能够实现应用程序需要的性能改进的最小值。建议您对仅包含 5-10 个条目的极小缓存进行测试,然后在必要时进行扩展。如果将缓存同时用于加密和解密请求,或者您使用加密上下文来选择特定的缓存条目,则您将需要稍大一些的缓存。

考虑下面的缓存配置示例

在您确定了应用程序的安全性和性能要求后,请谨慎考虑缓存的安全阈值并根据您的需求进行调整。这些阈值不存在万用值:理想的设置取决于具体的应用程序、它的安全性和性能要求以及预算等。应使用获得可接受性能和成本所需的最低缓存量。

下面的示例演示了您可以如何借助 LocalCryptoMaterialsCache 的容量设置和安全阈值来满足您的安全性要求:

  • 主密钥操作缓慢:如果您的主密钥处理速度仅为 100 条事务每秒 (TPS),但您的应用程序需要达到 1000 TPS,则您可以允许每个数据密钥最大加密 10 条消息,从而满足应用程序的要求。
  • 高频和大规模场景:如果您的主密钥的成本为每次操作 0.01 USD,并且您需要稳定保持 1000 TPS 的处理速度,同时不能超过每月 100000 USD 的预算,则您可以允许每个缓存条目最大加密 275 条消息。
  • 突增流量:如果您的应用程序的处理量,在一分钟内会有五秒时间突增到 100 TPS,而剩下的时间为零,并且您的主密钥成本为每次操作 0.01 USD,则可将最大消息数设置为 3,从而实现的可观的节约。为防止在突增间歇期(55 秒)内重复使用数据密钥,则可将每个缓存数据密钥的最大寿命设置为 20 秒。
  • 主密钥操作成本高:如果您的应用程序使用某种低吞吐量的加密服务,成本高达每个操作 1.00 USD,则您可能需要减少操作次数。为此,您可以创建一个足够大的缓存,以容纳您需要的数据密约。然后将字节数和消息数限制设置为一个足够高的值,以在满足安全性要求的前提下确保重复利用。例如,如果您的安全性要求不允许一个数据密约加密超过 10GB 的数据,则将处理的字节数设置为 10GB 仍可显著减少操作数,并同时满足您的安全性要求。

了解更多有关数据密钥缓存的信息

如需了解更多有关数据密钥缓存的信息,包括如何实施此方法,如何设置安全阈值,以及有关缓存组件的详细信息,请参阅AWS 加密开发工具包中的数据密钥缓存。另请参阅适用于 JavaPython 的 AWS 加密开发工具包以及 JavadocPython 文档

如果您对本博文有意见和建议,请在下面的“评论”部分提交评论。如果您有任何问题,请在 JavaPython 版本的加密开发工具包 GitHub 存储库中提出问题,也可加入 AWS 加密工具论坛浏览和发帖。

– 6 月