GCP Cloud KMS - 自定义密钥,灾难恢复可能吗?

GCP Cloud KMS - custom key, disaster recovery possible?

我们目前正在研究 gcp 云公里数以及如何满足灾难恢复需求。这是我们当前的测试设置:

Java 使用 Spring boot + Google Tink 使用 KMSEnvelopeAead + AesGcmJce(即由 tink 生成的 DEK,将通过 kms (KEK) 加密并与密文一起存储),对称

  1. 项目“A”(灾难恢复前的初始项目)

    -> KMS -> 密钥环“keyringABC” -> 密钥“keyABC” -> 通过导入作业导入自定义密钥。我可以成功 encrypt/decrypt 一些文本 - 很好,很好

resource: projects/A/locations/eur3/keyRings/keyringABC/cryptoKeys/keyABC/cryptoKeyVersions/1
  1. 项目“B”(灾难恢复项目)或具有新密钥 + 密钥环的同一项目“A”(名称可能不同)

    -> KMS -> 密钥环“keyringABC”-> 密钥“keyABC”-> 通过导入作业导入自定义密钥

    我重新导入自定义密钥 material 之前我已经导入到项目“A”中用于加密项目“A”中的数据。新创建的密钥模仿与项目“A”中相同的结构。唯一的区别是,它位于项目“B”中

resource: projects/B/locations/eur3/keyRings/keyringABC/cryptoKeys/keyABC/cryptoKeyVersions/1

现在,当我尝试使用在项目“A”中加密的项目“B”中新创建的密钥解密数据时,我无法正常工作。查看云日志我可以看到以下错误消息

Decryption failed: verify that 'name' refers to the correct CryptoKey.

我的假设是(在阅读文档时)密文,在本例中是 tink 通过云 kms 生成的 DEK,也包含 exact 资源标识符指向项目“A”的密钥,因此当使用项目“B”中新创建的密钥时,加密的 DEK 无法再被解密。这意味着即使底层(导入的)自定义密钥 material 相同,也无法在另一个项目中恢复数据。

任何人都可以阐明这一点吗?任何帮助表示赞赏。

干杯 马塞尔

PS:来自 google kms 文档

when data is encrypted using a symmetric Cloud KMS or Cloud HSM key, extra metadata about the encryption key version is saved, encrypted, along with the encrypted data. This metadata is not present in data encrypted outside of Cloud KMS.

Symmetric keys will always have a primary version. This version is used for encrypting by default. When Cloud KMS performs decryption using symmetric keys, it automatically identifies which key version is needed to perform the decryption.

是的,它必须是具有完全相同资源 ID 的完全相同的密钥,包括项目 id.The 用于解密的密文应与加密调用返回的完全相同。因此,您需要确保它与您在其中创建 KMS 密钥的项目相匹配。当您尝试使用 project-B 中新创建的密钥解密在 project-A 中加密的数据时,它失败了。

在您的用例中,您尝试解密的密文是使用不同的密钥加密的。加密和解密应该使用相同的密钥,否则 KMS 会告诉您找不到密钥,而实际找到了密钥。