追加認証データ(AAD)は、暗号化リクエストや復号リクエストの一部として Cloud Key Management Service に渡される任意の文字列です。AAD は整合性チェックとして使用され、混乱した使節の攻撃からのデータの保護に役立ちます。AAD 文字列は 64 KiB 以下にする必要があります。
Cloud KMS は、暗号化と復号の両方で同じ AAD 値が使用されていない限り、暗号テキストを復号しません。
AAD がわからない限り暗号テキストを復号できないため、AAD は暗号化されたデータにバインドされますが、暗号テキストの一部としては保管されません。また、AAD では暗号テキストの暗号強度は向上しません。代わりに、復号リクエストを認証するときの Cloud KMS による追加のチェックとして機能します。
Cloud KMS では、暗号化または復号を呼び出すとき、常に AAD が使用されます。AAD に値を指定しなかった場合は、空の文字列が使用されます。プレーン テキストを暗号化する際の AAD として空の文字列を使用すると、暗号テキストの復号に使用できるのは空の文字列のみです。
AAD は Cloud Audit Logging によって記録されません。
いつ AAD を使用するか
AAD を使用する 1 つの例として、アプリケーションが、鍵が単一で、クライアントの数は無制限のラップ / ラップ解除プロキシとして機能し、各クライアントが個別のセキュリティ境界に配置されている場合があります。たとえば、ユーザーがプライベートな日記をつけるための日記アプリケーションが考えられます。あるユーザーがプライベートな日記エントリを表示することが必要になると、アプリケーションではそのユーザーを明示的に認証するために、一意のユーザー名をラップ解除(復号)リクエストの AAD として使用できます。このシナリオでは、単一の鍵を使用して複数の(無制限の)ユーザーにサービスを提供できます。個々のユーザーの状態を保持する必要がないことが、主な利点です。
もう 1 つの例として、アプリケーションでメールアドレスなどの個人情報を含む署名なしトークンを使用することが必要な場合があります。署名なしトークンへの入力は、署名なしトークンにプレーン テキストのメールアドレスを加えたものに使用される認証データになります。これらの入力は、交換される署名なしトークンが認証付き暗号(AEAD)の形式になるように暗号化されます。
混乱した使節の攻撃の例
この例は、悪意のあるユーザーに代わって暗号テキストを復号するようアプリケーションをだます方法を示しています。この例では、アプリケーションがその権限を不正使用するよう攻撃者にだまされていることを認識していないため、アプリケーションが混乱した使節となります。その結果、攻撃者は本来別のユーザーのために暗号化されていたデータが復号されたものを表示できます。この攻撃では、混乱した使節を利用して復号を行うため、攻撃者が暗号鍵を知っている必要はありません。
日記アプリケーションでは、ユーザーはプライベートな日記をつけることができます。それぞれの日記エントリは暗号化され、その日記エントリを作成したユーザーによってのみ復号されることが意図されています。
鈴木さんが日記エントリを作成します。アプリケーションは日記エントリを暗号化してから、暗号化された日記エントリを鈴木さんの日記エントリ用に予約されたロケーションに保管します。
鈴木さんが自分の日記エントリを表示するためのリクエストを送信します。暗号化された日記エントリは鈴木さん用に予約されたロケーションにあるため、アプリケーションはデータを復号し、それを鈴木さんのリクエストに対するレスポンスとして返します。これはアプリケーションの意図された動作です。
佐藤さんが、鈴木さん用に予約されたロケーションから、自分用に予約されたロケーションに鈴木さんの日記エントリをコピーします。
佐藤さんが、自分が持つ鈴木さんの日記エントリのコピーを表示するためのリクエストを送信します。 鈴木さんの日記エントリのコピーが佐藤さん用に予約されたロケーションにあるため、アプリケーションはその日記エントリを復号し、佐藤さんのリクエストに対するレスポンスとしてプレーン テキストを返します。これで、佐藤さんは鈴木さんの日記エントリを表示できますが、これは意図されたアプリケーションの動作ではありません。
このタイプの攻撃から保護するために、アプリケーションでは暗号化および復号に空ではない文字列を AAD として使用できます。AAD は復号リクエストに対する追加のチェックを提供します。佐藤さんが、鈴木さんの日記エントリのコピーを表示するための復号リクエストを送信しても、正しい AAD を使用するようにアプリケーションをだますことができない限り、佐藤さんのリクエストは成功しません。
AAD の保管または再現
AAD を使用して暗号化する前に、その後の復号のために暗号化されたデータを AAD と一緒に保管するか AAD を再現するかを決定します。
AAD を保管する理由は、暗号テキストを復号する必要があるときに AAD を簡単に使用できるようにすることです。たとえばデータベース行に、暗号テキストと、プレーン テキストを暗号化するときに使用した AAD の両方を格納することができます。復号リクエストを受信したときに、アプリケーションはデータベースから AAD と暗号テキストの両方を取得できます。これでアプリケーションは暗号テキストの復号の処理にこの AAD を使用できます。
AAD を再現する理由は、プライベートではないデータを確認すると同時に AAD の保管を避けることです。たとえば、暗号化されたファイルのファイルパスとファイル名が変更されていないことを確認したい場合は、ファイルを暗号化するときにファイルパスとファイル名を AAD として含めることができます。これで、ファイルの復号リクエストが送信されたときに、ファイルパスとファイル名を調べることで AAD を再現できます。
AAD の保管
AAD を保管するということは、AAD が保存され、その後の使用のためにアプリケーションですぐに入手できることを意味します。たとえばデータベース テーブルに、暗号テキストの列と、暗号テキストの作成時に使用された AAD の列を含めることができます。暗号テキストを復号する時点になると、アプリケーションは AAD を取得して復号に使用します。
日記エントリが、それを作成したユーザーにのみ表示されるように設計された日記アプリケーションを考えてみましょう。日記エントリが作成されると、その内容は暗号化され、データベースの ENCRYPTED_DIARY_ENTRY
列に保存されます。日記エントリを表示するリクエストごとに、アプリケーションはユーザーを認証してから、ユーザーに日記エントリを提供します。
AAD が使用されていなく(デフォルトの空の文字列以外)、仮に佐藤さんが鈴木さんの ENCRYPTED_DIARY_ENTRY
データを自分の ENCRYPTED_DIARY_ENTRY
データにコピーできたとします。佐藤さんが(鈴木さんのデータからコピーされた)自分の ENCRYPTED_DIARY_ENTRY
データの復号リクエストを送信すると、アプリケーションはだまされていることを認識することなく復号を実行します。佐藤さんは鈴木さんの日記エントリをプレーン テキストとして見ることができます。
それでは、日記エントリが暗号化されるときに、ユーザーのメールアドレスが AAD として使用されると仮定しましょう。鈴木さんが日記エントリを作成すると、アプリケーションは ENCRYPTED_DIARY_ENTRY
データと一緒に暗号化されていないメールアドレスを EMAIL
列に保管します。再び佐藤さんが鈴木さんの ENCRYPTED_DIARY_ENTRY
データを自分の ENCRYPTED_DIARY_ENTRY
データにコピーできたとします。佐藤さんが復号リクエストを送信すると、アプリケーションは復号リクエストの AAD として使用するために EMAIL
列から佐藤さんのメールアドレスを取得します。佐藤さんのメールアドレスは復号の AAD として正しく機能しないため、アプリケーションは鈴木さんの日記エントリをプレーン テキストとして佐藤さんに表示しません。
AAD の再現
AAD を再現するということは、AAD がどこにも保管されないことを意味しますが、AAD は復号する時点で再現することができます。
たとえば、ファイルパスとファイル名を AAD として使用できます。暗号化処理中に、暗号化されたファイルが MY_PATH\MY_FILE1.enc
に保存されたため、"MY_PATH\MY_FILE1.enc"
が AAD として使用されたとします。この AAD は保存されていません。復号リクエストを受信すると、アプリケーションは復号するファイルのファイルパスとファイル名を調べて AAD を再現します。暗号化されたファイルが別の場所に移動されていない場合、"MY_PATH\MY_FILE1.enc"
が復号中に AAD として使用されます。これは、暗号化中に使用される ADD と同じで、復号は続行できます。
暗号化されたファイルが別の場所に、たとえば SOME_OTHER_PATH\MY_FILE1.enc
に移動されている場合、"SOME_OTHER_PATH\MY_FILE1.enc"
が復号化のための AAD として使用されます。この AAD 値は暗号化に使用された AAD 値と一致しないため、復号は失敗します。