本页面介绍如何使用 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_crc32c
或DecryptResponse.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 |
不适用 | GetPublicKeyResponse.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 |
验证资源名称
Encrypt、GetPublicKey、AsymmetricSign、MacSign 和 MacVerify 的响应包含 name
字段,其中包含相关 Cloud Key Management Service API 对象的名称。您可以将 name
字段的值与预期值进行比较,
并舍弃不匹配的结果。
数据验证示意图
此图显示了何时验证与加密操作相关的各类数据以及何时验证来自各类来源的数据。您还可以查看数据验证字段的摘要。
数据验证字段摘要
在设计应用时,请使用此表来确定可用于验证每个加密操作前后的数据的字段。
加密
API | 服务器端输入验证 | 客户端资源验证 | 客户端输出验证 | 服务器端输入的客户端验证 |
---|---|---|---|---|
EncryptRequest |
plaintext_crc32c 、additional_authenticated_data_crc32c |
|||
EncryptResponse |
name |
ciphertext_crc32c |
verified_plaintext_crc32c 、verified_additional_authenticated_data_crc32c |
解密
API | 服务器端输入验证 | 客户端资源验证 | 客户端输出验证 | 服务器端输入的客户端验证 |
---|---|---|---|---|
DecryptRequest |
ciphertext_crc32c 、additional_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 |
后续步骤
- 详细了解对称和非对称加密
- 详细了解加密应用数据
- 使用 Cloud Audit Logs