谷歌的密钥管理系统:密钥轮换后的数据解密

时间:2017-09-06 01:55:32

标签: google-cloud-platform google-cloud-storage google-cloud-kms

上下文

我正在遵循GCP对存储桶中Storing Secrets的说明。 KMS在上传到Storage Bucket之前用于file encryption

由于数据加密发生在谷歌存储之外,我对密钥轮换的一个方面感到困惑。

方案

让我们考虑一个特定的场景:

  1. 在2017-01- 01 我创建了一个密钥环和一个密钥A(事实上A_ver1,因为密钥是版本化的)。此外,密钥轮换策略设置为触发轮换每年
  2. 在2017-01- 15 我运行命令以some_file.txt加密A_ver1curl -s -X POST "https://cloudkms.googleapis.com/v1/projects/my-project/<...>" \ -d "{\"plaintext\":\"<...SOME_FILE_CONTENT...>\"}" \ -H "Authorization:Bearer $(gcloud auth application-default print-access-token)" \ -H "Content-Type:application/json"
  3. 我立即将加密结果保存为存储桶some_file.txt.encrypted
  4. 我什么也没做,在 2018 -01-01上发生了关键轮换。 根据我的理解 A_ver1被禁用,生成并激活A_ver2这两个事件准同时发生。
  5. 2018-06 -01上,我意识到我需要解密some_file.txt.encrypted。我正在下载该文件,然后尝试使用A_ver2运行命令解密文件...
  6. 问题

    问题1 :当我尝试使用A_ver2解冻文件时,如果使用早期版本A_ver1加密文件,会发生什么?

    问题2 :如果解密失败,我首先应该做些什么来防止它?

2 个答案:

答案 0 :(得分:4)

旧版本不会在轮播时自动停用。

问题1 :使用特定的CryptoKey进行解密时,服务器会选择正确的版本(在Decrypt document中提及)。只要版本未被禁用,它仍然可用。

问题2 :在您的特定情况下,由于使用旧版本,解密不会失败。

Key rotation提到了您期望的行为,并且因为它注意到实施了一个使用新版本重新加密数据并禁用旧版本的策略可能会非常棘手。

如果您有任何其他问题,请与我们联系。

答案 1 :(得分:3)

在您的方案中,步骤4中的旋转描述不太对。当您旋转CryptoKey时,会生成一个新的CryptoKeyVersion并成为CryptoKey的主要版本,但旧版本没有任何内容。也就是说,对于您的方案,A_ver1仍处于启用状态,但另一个已启用的版本A_ver2是主要版本。

回答你的问题,

问题1:当您尝试解密文件时,您不需要指定CryptoKeyVersion,只需要指定CryptoKey;该服务将为您获得正确的版本。如果您尝试解密已使用现已禁用(或销毁)的CryptoKeyVersion加密的文件,则解密调用将失败。

问题2:这取决于您要优化的内容。例如,如果您使用循环来尝试限制使用任何一个版本加密的数据量,那么您可能不希望禁用旧版本,并长时间保留这些版本。您可能只想禁用某些大量版本之外的关键版本。在这种情况下,您可以跟踪您用于特定数据的密钥版本,并重新加密所有受影响的数据。