私は JSON Web Encryption(JWE) を見ていて、なぜ AESキーラッピング を使用するのかについて少し混乱しています。
このドキュメントでは マッチングアルゴリズムの強度 の使用についても述べています。
強度を一致させるアルゴリズムは、可能な限り一緒に使用する必要があります。たとえば、AESキーラップを特定のキーサイズで使用する場合、AES GCMも使用するときは同じキーサイズを使用することをお勧めします。キー暗号化とコンテンツ暗号化アルゴリズムが異なる場合、効果的なセキュリティは2つのアルゴリズムのうちの弱い方によって決定されます。
基本的に、なぜAESキーラップを使用するのかと思います。
したがって、比較例として、A256GCM暗号化アルゴリズムを使用して、256ビットの鍵が必要です。簡単にするために、私の鍵は「secret0123456789secret0123456789」で、「Test」をエンコードしています。
direct(DIR) キーアルゴリズムを使用(つまり、私のキーをコンテンツキーとして使用)すると、次のようになります。
eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..Vlf_WdLm-spHbfJe.RxMPrw.5VC8Y_qSPdSubbGNGyfn6A
これは次のように分類されます。
JWE Header: {"alg":"dir","enc":"A256GCM"}
Encrypted key (CEK): (blank)
IV: Vlf_WdLm-spHbfJe
Ciphertext: RxMPrw
Authentication Tag: 5VC8Y_qSPdSubbGNGyfn6A
キーラップアルゴリズムと暗号化アルゴリズムを一致させるために、 AES 256ビットキー を使用します。
eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0.66xZoxFI18zfvLMO6WU1zzqqX1tT8xu_qZzMQyPcfVuajPNkOJUXQA.X5ZL8yaOektXmfny.brz-Lg.xG-EvM-9hrw0XRiuRW7HrA
これは次のように分類されます。
JWE Header: {"alg":"A256KW","enc":"A256GCM"}
Encrypted key (CEK): 66xZoxFI18zfvLMO6WU1zzqqX1tT8xu_qZzMQyPcfVuajPNkOJUXQA
IV: X5ZL8yaOektXmfny
Ciphertext: brz-Lg
Authentication Tag: xG-EvM-9hrw0XRiuRW7HrA
私が理解しているように、コンテンツキーは JSON Web Key(JWK) を使用して暗号化されていますが、基本的には次のようになっています。
暗号化されたCEK、IV、および暗号化されたデータはすべて、結果のJWEオブジェクト(すべてbase64urlエンコード)の一部です。
直接JWEを使用すると、送信されるペイロードが小さくなり、暗号化と復号化のどちらも、ステップをスキップするため、わずかに高速になると思います。
AESキーラップを使用すると、より高いセキュリティが得られますか?そうであれば、なぜですか?そうでない場合、なぜ直接コンテンツ暗号化の代わりにそれを使用するのですか?
大量のデータを保存する必要がある場合、暗号化レイヤー内でキーをラップする利点は、後でキーを変更する必要がある場合に、すべてのデータを再暗号化する必要がないことを意味します。 KEK(Key Encrypting Key)を変更し、すべての暗号文を再度転送することなくCEKを再暗号化するだけです。
たとえば、サーバーにデータを送信して安全に保管するためにJSONを使用していたとします。 A256KWを使用してこのすべてのデータを送信でき、相手側のサーバーはこれを単に格納します。
つまり、以下が転送され、サーバー側に保存されます。
Encrypted key (CEK): 66xZoxFI18zfvLMO6WU1zzqqX1tT8xu_qZzMQyPcfVuajPNkOJUXQA
IV: X5ZL8yaOektXmfny
Ciphertext: brz-Lg
Authentication Tag: xG-EvM-9hrw0XRiuRW7HrA
キーを変更する必要がある場合は、CEKをクライアントにプルし、古いKEKで復号化し、CEKを新しいキーで暗号化してから、サーバーに送信してすべての関連レコードを更新します。
短期間の送信のみを目的とする場合、これは重要ではなく、ペイロードを小さくするにはDirectを使用する方が簡単です。
KWを使用すると、長期的な秘密を確立できますが、メッセージごとに異なるCEKを使用できます。これは、すべてではなく一部の使用例にとって重要です。
JWEを使用して、長期キーがすべて異なる複数の受信者に単一のメッセージを送信する場合、受信者ごとにCEKを複数回ラップする必要があるため、これは不可欠です。
JWEは多くの高度な使用例をサポートしていますが、一般的な使用方法は、直接使用して2つのパーティ間でJWTを暗号化することです。
JWEを開発していたとき、一部の人々はKWオプションのみをサポートし、直接最適化を削除したいと考えていました。最終的に、ユースケースに応じて2つのオプションを用意しました。 Directは小さいトークンを作成し、実装が簡単です。あなたがKWを必要としないならそれからそれを発汗させないでください。
AESキーラッピングを使用する理由があります。何かを暗号化したら、鍵は弱い部分になります。データを取得するすべての試みは、キーを知る必要があります。キーと暗号化/復号化ソフトウェアは暗号化されていないため、攻撃者がキーを盗んで使用する可能性があります。これがキーラッピングのポイントであり、キーの保護に役立ちます。