本頁面將說明如何使用 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 |
不適用 | 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 稽核記錄