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