驗證端對端資料完整性

本頁面將說明如何使用 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,也不要從該 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
不適用 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

驗證資源名稱

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

後續步驟