関連データを伴う認証付き暗号化(AEAD)プリミティブは、データ暗号化の最も一般的なプリミティブであり、ほとんどのニーズに適しています。
AEAD には次の特性があります。
- Secrecy: 平文の長さ以外の情報は一切わかりません。
- 真正性: 暗号テキストの基になる暗号化された平文を検出されずに変更することはできません。
- 対称性: 平文の暗号化と暗号テキストの復号は、同じ鍵で行われます。
- ランダム化: 暗号化はランダム化されます。同じ平文の 2 つのメッセージがあっても、暗号テキストは同じになりません。攻撃者は、特定の平文に対応する暗号テキストを認識できません。これを回避するには、代わりに決定論的 AEAD を使用します。
関連データ
AEAD を使用して、暗号テキストを特定の関連データに関連付けることができます。フィールド user-id と encrypted-medical-history を含むデータベースがあるとします。このシナリオでは、encrypted-medical-history を暗号化するときに user-id を関連データとして使用できます。これにより、攻撃者がユーザー間で医療履歴を移動させることはできません。
関連データは任意です。指定した場合、暗号化呼び出しと復号呼び出しの両方に同じ関連データが渡された場合にのみ、復号が成功します。
キーの種類を選択する
ほとんどの用途には AES128_GCM をおすすめしますが、さまざまなニーズに対応するさまざまな鍵タイプがあります。AES128 は 128 ビットのセキュリティを提供し、AES256 は 256 ビットのセキュリティを提供します。
モードを選択する際の 2 つの重要なセキュリティ制約は次のとおりです。
- QPS: 同じキーで暗号化されたメッセージの数
- メッセージのサイズ: メッセージのサイズはどのくらいですか?
原則:
- 16 バイトの初期化ベクトル(IV)を使用する AES-CTR-HMAC(AES128_CTR_HMAC_SHA256、AES256_CTR_HMAC_SHA256)は、境界が適切で最も保守的なモードです。
- AES-EAX(AES128_EAX、AES256_EAX)は、AES128_CTR_HMAC_SHA256 よりも若干保守的ではなく、若干高速です。
- AES-GCM(AES128_GCM、AES256_GCM)は通常、最も高速なモードですが、メッセージ数とメッセージ サイズに最も厳しい制限があります。平文と関連データの長さ(下記)の制限を超えると、AES-GCM は致命的なエラーを発生させ、鍵マテリアルを漏洩させます。
- AES-GCM-SIV(AES128_GCM_SIV、AES256_GCM_SIV)は、AES-GCM とほぼ同じ速度です。メッセージ数とメッセージ サイズの上限は AES-GCM と同じですが、これらの上限を超えた場合、より壊滅的な失敗は起こりません。2 つのメッセージが等しいという事実が漏洩するだけです。これにより、AES-GCM よりも安全に使用できますが、実際にはあまり使用されていません。Java でこれを使用するには、Conscrypt をインストールする必要があります。
- XChaCha20-Poly1305(XCHACHA20_POLY1305)は、メッセージ数とメッセージ サイズの上限が AES-GCM よりもはるかに大きくなっていますが、失敗した場合(可能性は非常に低い)、鍵マテリアルも漏洩します。ハードウェア アクセラレーションが使用できないため、ハードウェア アクセラレーションが使用可能な状況では AES モードよりも遅くなる可能性があります。
セキュリティ保証
AEAD 実装は以下を提供します。
- CCA2 セキュリティ。
- 少なくとも 80 ビットの認証強度。
- 合計 250 バイトのメッセージを少なくとも 232 個暗号化できること。最大 232 個の選択平文または選択暗号文による攻撃の成功確率は 2-32 より大きくありません。
サンプル ユースケース
データを暗号化すると暗号テキストをコンテキストにバインドするをご覧ください。