このページでは、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 で暗号化されていない平文のチェックサムを保存しないでください。たとえば、
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 のレスポンスには、関連する Cloud Key Management Service API オブジェクトの名前が格納される name
フィールドが含まれます。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 監査ログを使用します。