Data Key Caching

有些场景下,需要大量使用KMS,例如要加密成千上万行记录,如果每行记录都要调用KMS API会非常耗时,而且产生大量调用花费过高;

在这种场景下,就出现了Data Key Caching

  • 以前每次调用API时都会生成新的data key,现在在SDK里面可以重用之前生成的data key。
  • 但这样带来了安全风险,因为所有鸡蛋都在一个篮子里,很多行数据都是使用一个data key。

工作流程如下:

  1. 应用程序首次需要加密数据时,向 KMS 请求生成数据密钥
  2. KMS 返回明文和密文形式的数据密钥
  3. 应用程序将这对密钥存储在本地缓存中
  4. 后续加密操作直接使用缓存中的明文密钥,无需再调用 KMS
  5. 缓存中的密钥根据预设条件(时间、使用次数等)自动失效和更新

例如下面,每调用100次才生成1个新的data key,这样就将请求次数降低了100倍。

image-20191207222402659

使用数据密钥缓存时,可配置多种安全参数来平衡性能和安全性:

  1. 最大密钥生存期限:设置密钥在缓存中存留的最大时间(如 60 秒)
  2. 最大使用次数:限制单个缓存密钥可用于加密的最大数据项数量
  3. 最大字节数:限制使用单个缓存密钥可加密的最大数据量

总结

Data key caching适用于高并发、对延迟要求低的场景。在使用的时候需要权衡安全和性能之间的平衡,不适合要求极高安全性的场景(如每次操作必须使用不同密钥)