验证端到端数据完整性

本页面介绍如何使用 Cloud Key Management Service API 中的字段检测和防止数据在客户端系统和 Cloud KMS 之间移动时发生意外更改。这些准则补充了 Google Cloud 在静态和传输过程中自动保护数据的方式。

自动数据保护

Google Cloud 上的所有数据均会在传输中以及在 Google Cloud 中静态自动加密。

Cloud KMS 使用另一个称为密钥加密密钥 (KEK) 的加密密钥来加密每个加密密钥,以为加密密钥提供额外的保护。如需详细了解此技术,请参阅信封加密

每个 Cloud KMS 加密操作都包括对数据损坏的自动检查。如果检测到损坏,则会中止操作并记录详细错误。

这些自动保护非常重要,但它们无法防止客户端的数据损坏。例如,加密期间的数据损坏可能会导致数据无法解密。

本主题讨论检测和防止客户端数据损坏的方法,以最大限度地降低数据丢失风险。

计算和验证校验和

每个加密操作的请求和响应都包含 CRC32C 校验和字段,例如 plaintext_crc32c。您可以计算校验和并比较计算出的值和返回的值。

在服务器上,Cloud Key Management Service API 将布尔值字段(例如 verified_plaintext_crc32c)设置为 true,以表示它收到相关的校验和。如果校验和与服务器计算出的值不匹配,则返回 INVALID_ARGUMENT 错误。

计算和比较校验和时,请牢记以下准则:

  • 在发送或接收数据后,立即使用二进制编码计算校验和。
  • 请勿将未加密的明文校验和存储到 Cloud Key Management Service API 或从中读取。例如,请勿存储 EncryptRequest.plaintext_crc32cDecryptResponse.plaintext_crc32c 字段的未加密内容。要保存校验和的记录,请将其与相关数据一起进行序列化,并将复合对象传递给 Cloud KMS 以进行加密。解密数据时,您可以使用计算出的预期值验证校验和。
  • 如果解密操作导致校验和不匹配,请将您的应用设计为进行有限次数的操作重试,以应对暂时性问题。
  • 如果加密操作导致加密数据(密文)的校验和不匹配,请舍弃加密结果,然后重试。

对于加密请求:

  • 如果您在请求中包含校验和字段,则服务器会在响应中将相关验证字段设置为 true,以表明它收到了校验和并尝试验证其值。

  • 如果您包含了校验和字段,但响应将验证字段设置为 false,则表示服务器未收到校验和字段,并且响应中可能缺少了其他信息。重试有限次数的请求,以应对暂时性错误。

  • 如果收到校验和但不匹配,则返回 INVALID_ARGUMENT 错误。错误包括字段名称和不匹配的校验和。例如:

    The checksum in field plaintext_crc32c did not match the data in field plaintext.
    

    重试有限次数的请求,以应对暂时性错误。

对于解密请求,您可以计算校验和并将其与响应中 DecryptResponse.plaintext_crc32c 的值进行比较。

以下校验和字段包含在发送给 Cloud Key Management Service API 的请求及其响应中。

请求中的字段 响应中的字段
EncryptRequest.plaintext_crc32c EncryptResponse.verified_plaintext_crc32c
EncryptionRequest.additional_authenticated_data_crc32c EncryptionResponse.verified_additional_authenticated_data_crc32c
AsymmetricSignRequest.digest_crc32c AsymmetricSignResponse.verified_digest_crc32c
AsymmetricSignRequest.signature_crc32c AsymmetricSignResponse.verified_signature_crc32c
AsymmetricSignRequest.signature_crc32c AsymmetricSignResponse.verified_signature_crc32c
GetPublicKeyRequest.pem_crc32c GetPublicKeyResponse.verified_pem_crc32c
不适用 DecryptResponse.plaintext_crc32c
MacSignRequest.data_crc32c MacSignResponse.verified_data_crc32c
MacVerifyRequest.data_crc32c MacVerifyResponse.verified_data_crc32c
MacVerifyRequest.mac_crc32c MacVerifyResponse.verified_mac_crc32c
不适用 MacVerifyResponse.verified_success_integrity

验证资源名称

EncryptGetPublicKeyAsymmetricSignMacSignMacVerify 的响应包含 name 字段,其中包含相关 Cloud Key Management Service API 对象的名称。您可以将 name 字段的值与预期的值进行比较,并舍弃不匹配的结果。

数据验证示意图

此图显示了何时验证与加密操作相关的各类数据以及何时验证来自各类来源的数据。您还可以查看数据验证字段的摘要

显示不同数据验证字段及其对应的操作的示意图

数据验证字段摘要

在设计应用时,请使用此表来确定可用于验证每个加密操作前后的数据的字段。

加密

API 服务器端输入验证 客户端资源验证 客户端输出验证 服务器端输入的客户端验证
EncryptRequest plaintext_crc32cadditional_authenticated_data_crc32c
EncryptResponse name ciphertext_crc32c verified_plaintext_crc32cverified_additional_authenticated_data_crc32c

解密

API 服务器端输入验证 客户端资源验证 客户端输出验证 服务器端输入的客户端验证
DecryptRequest ciphertext_crc32cadditional_authenticated_data_crc32c
DecryptResponse plaintext_crc32c

AsymmetricSign

API 服务器端输入验证 客户端资源验证 客户端输出验证 服务器端输入的客户端验证
AsymmetricSignRequest digest_crc32c
AsymmetricSignResponse name signature_crc32c verified_digest_crc32c

AsymmetricDecrypt

API 服务器端输入验证 客户端资源验证 客户端输出验证 服务器端输入的客户端验证
AsymmetricDecryptRequest ciphertext_crc32c
AsymmetricDecryptResponse plaintext_crc32c verified_ciphertext_crc32c

PublicKey

API 服务器端输入验证 客户端资源验证 客户端输出验证 服务器端输入的客户端验证
PublicKey name pem_crc32c

MacSign

API 服务器端输入验证 客户端资源验证 客户端输出验证 服务器端输入的客户端验证
MacSignRequest data_crc32c
MacSignResponse mac_crc32c verified_data_crc32c

MacVerify

API 服务器端输入验证 客户端资源验证 客户端输出验证 服务器端输入的客户端验证
MacVerifyRequest data_crc32c mac_crc32c
MacVerifyResponse verified_data_crc32c verified_mac_crc32c verified_success_integrity

后续步骤