Google的密钥管理系统:密钥轮换后的数据解密
Google's Key Management System: data unencryption after key rotation
上下文
在将其上传到存储桶之前,我遵循 GCP 的 Storing Secrets in Storage Bucket. KMS is used for file encryption 说明。
由于数据加密发生在 Google 的存储之外,我对密钥轮换的一个方面有点困惑。
场景
让我们考虑一个具体的场景:
- 在 2017-01-01 我创建了一个密钥环和一个密钥
A
(实际上是 A_ver1
因为密钥是版本化的)。此外,密钥轮换策略设置为触发轮换 yearly.
- 在 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"
.
- 我立即将加密结果保存到存储桶中作为
some_file.txt.encrypted
。
- 我什么都没做,在 2018-01-01 发生了密钥轮换。 据我了解,
A_ver1
被禁用,A_ver2
被生成并激活。 这两个事件几乎同时发生。
- 在 2018-06-01 我意识到我需要解密
some_file.txt.encrypted
。我正在下载文件,然后尝试 运行 使用 A_ver2
... 解密文件的命令
问题
问题 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 提到了您期望的行为,正如它指出的那样,实施使用新版本重新加密数据并禁用旧版本的策略可能很棘手。
如果您还有其他问题,请告诉我。
上下文
在将其上传到存储桶之前,我遵循 GCP 的 Storing Secrets in Storage Bucket. KMS is used for file encryption 说明。
由于数据加密发生在 Google 的存储之外,我对密钥轮换的一个方面有点困惑。
场景
让我们考虑一个具体的场景:
- 在 2017-01-01 我创建了一个密钥环和一个密钥
A
(实际上是A_ver1
因为密钥是版本化的)。此外,密钥轮换策略设置为触发轮换 yearly. - 在 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"
. - 我立即将加密结果保存到存储桶中作为
some_file.txt.encrypted
。 - 我什么都没做,在 2018-01-01 发生了密钥轮换。 据我了解,
,A_ver1
被禁用A_ver2
被生成并激活。这两个事件几乎同时发生。 - 在 2018-06-01 我意识到我需要解密
some_file.txt.encrypted
。我正在下载文件,然后尝试 运行 使用A_ver2
... 解密文件的命令
问题
问题 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 提到了您期望的行为,正如它指出的那样,实施使用新版本重新加密数据并禁用旧版本的策略可能很棘手。
如果您还有其他问题,请告诉我。