エンドツーエンドのデータの整合性の検証

このページでは、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
GetPublicKeyRequest.pem_crc32c GetPublicKeyResponse.verified_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 のレスポンスには、関連する Cloud Key Management Service API オブジェクトの名前が格納される name フィールドが含まれます。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

次のステップ