驗證端對端資料完整性

本頁面說明如何在 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_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
不適用 GetPublicKeyResponse.public_key.crc32c_checksum
不適用 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
DecapsulateRequest.ciphertext_crc32c DecapsulateResponse.verified_ciphertext_crc32c
不適用 DecapsulateResponse.shared_secret_crc32c

驗證資源名稱

「Encrypt」(加密)、「GetPublicKey」(取得公開金鑰)GetPublicKey、「AsymmetricSign」(非對稱簽署)AsymmetricSign、「AsymmetricDecrypt」(非對稱解密)AsymmetricDecrypt、「Decapsulate」(解封裝)、「MacSign」(MAC 簽署)MacSign 和「MacVerify」(MAC 驗證)MacVerify 的回應會包含 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

Decapsulate

API 伺服器端輸入驗證 用戶端資源驗證 驗證用戶端輸出內容 在用戶端驗證伺服器端輸入內容
DecapsulateRequest ciphertext_crc32c
DecapsulateResponse shared_secret_crc32c verified_ciphertext_crc32c

PublicKey

API 伺服器端輸入驗證 用戶端資源驗證 驗證用戶端輸出內容 在用戶端驗證伺服器端輸入內容
PublicKey name pem_crc32c, public_key.crc32c_checksum

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

後續步驟