驗證端對端資料完整性

本頁面將說明如何使用 Cloud Key Management Service API 中的欄位,在資料在用戶端系統和 Cloud KMS 之間移動時,偵測及避免資料發生非預期變更。這些規範可補充 Trusted Cloud by S3NS 自動保護資料的靜態和傳輸狀態。

自動資料保護

Trusted Cloud 上的所有資料都會自動加密,包括傳輸中的資料和Trusted 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

後續步驟