本頁面說明如何在 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_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_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 |
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 |
後續步驟
- 進一步瞭解對稱和非對稱加密
- 進一步瞭解如何加密應用程式資料
- 使用 Cloud 稽核記錄