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

Google's Key Management System: data unencryption after key rotation

上下文

在将其上传到存储桶之前,我遵循 GCP 的 Storing Secrets in Storage Bucket. KMS is used for file encryption 说明。

由于数据加密发生在 Google 的存储之外,我对密钥轮换的一个方面有点困惑。

场景

让我们考虑一个具体的场景:

  1. 在 2017-01-01 我创建了一个密钥环和一个密钥 A (实际上是 A_ver1 因为密钥是版本化的)。此外,密钥轮换策略设置为触发轮换 yearly.
  2. 在 2017-01-15 我 运行 使用 A_ver1 加密 some_file.txt 的命令: curl -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_ver1 加密的,当我尝试用 A_ver2 解密文件时会发生什么?

问题2:如果解密失败,我首先应该怎么做才能避免呢?

在您的场景中,第4步中关于旋转的描述不太正确。当您轮换 CryptoKey 时,会生成一个新的 CryptoKeyVersion 并使其成为 CryptoKey 的主要版本,但旧版本没有任何变化。也就是说,对于您的方案,A_ver1 仍处于启用状态,但另一个启用的版本 A_ver2 是主要版本。

回答您的问题,

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

问题 2:这取决于您要优化的内容。例如,如果您使用轮换来尝试限制使用任何一个版本加密的数据量,那么您可能不想禁用旧版本,而是将它们保留很长时间。您可能只想禁用超出某些大量版本的密钥版本。在这种情况下,您可以跟踪您对特定数据使用的密钥版本,并重新加密所有受影响的数据。

轮换时不会自动禁用旧版本。

问题 1:当您使用特定的 CryptoKey 解密时,服务器会选择正确的版本(在 Decrypt document 中提到)。只要一个版本没有被禁用,它仍然可以使用。

问题2:在您的具体场景中,不会因为使用旧版本而导致解密失败。

Key rotation 提到了您期望的行为,正如它指出的那样,实施使用新版本重新加密数据并禁用旧版本的策略可能很棘手。

如果您还有其他问题,请告诉我。