web-dev-qa-db-ja.com

AESキーラップ(JSON Web暗号化を使用)のポイントは何ですか?

私は JSON Web Encryption(JWE) を見ていて、なぜ AESキーラッピング を使用するのかについて少し混乱しています。

このドキュメントでは マッチングアルゴリズムの強度 の使用についても述べています。

強度を一致させるアルゴリズムは、可能な限り一緒に使用する必要があります。たとえば、AESキーラップを特定のキーサイズで使用する場合、AES GCMも使用するときは同じキーサイズを使用することをお勧めします。キー暗号化とコンテンツ暗号化アルゴリズムが異なる場合、効果的なセキュリティは2つのアルゴリズムのうちの弱い方によって決定されます。

基本的に、なぜAESキーラップを使用するのかと思います。


したがって、比較例として、A256GCM暗号化アルゴリズムを使用して、256ビットの鍵が必要です。簡単にするために、私の鍵は「secret0123456789secret0123456789」で、「Test」をエンコードしています。

DIR

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

A256KW

キーラップアルゴリズムと暗号化アルゴリズムを一致させるために、 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) を使用して暗号化されていますが、基本的には次のようになっています。

  • ランダムな256ビットのコンテンツ暗号化キー(CEK)の作成
  • このCEK(およびランダムIV)を使用して実際のデータを暗号化する
  • 提供されたキーでCEKを暗号化する

暗号化されたCEK、IV、および暗号化されたデータはすべて、結果のJWEオブジェクト(すべてbase64urlエンコード)の一部です。


直接JWEを使用すると、送信されるペイロードが小さくなり、暗号化と復号化のどちらも、ステップをスキップするため、わずかに高速になると思います。

AESキーラップを使用すると、より高いセキュリティが得られますか?そうであれば、なぜですか?そうでない場合、なぜ直接コンテンツ暗号化の代わりにそれを使用するのですか?

12
gregmac

大量のデータを保存する必要がある場合、暗号化レイヤー内でキーをラップする利点は、後でキーを変更する必要がある場合に、すべてのデータを再暗号化する必要がないことを意味します。 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を使用する方が簡単です。

7
SilverlightFox

KWを使用すると、長期的な秘密を確立できますが、メッセージごとに異なるCEKを使用できます。これは、すべてではなく一部の使用例にとって重要です。

JWEを使用して、長期キーがすべて異なる複数の受信者に単一のメッセージを送信する場合、受信者ごとにCEKを複数回ラップする必要があるため、これは不可欠です。

JWEは多くの高度な使用例をサポートしていますが、一般的な使用方法は、直接使用して2つのパーティ間でJWTを暗号化することです。

JWEを開発していたとき、一部の人々はKWオプションのみをサポートし、直接最適化を削除したいと考えていました。最終的に、ユースケースに応じて2つのオプションを用意しました。 Directは小さいトークンを作成し、実装が簡単です。あなたがKWを必要としないならそれからそれを発汗させないでください。

4
John Bradley

AESキーラッピングを使用する理由があります。何かを暗号化したら、鍵は弱い部分になります。データを取得するすべての試みは、キーを知る必要があります。キーと暗号化/復号化ソフトウェアは暗号化されていないため、攻撃者がキーを盗んで使用する可能性があります。これがキーラッピングのポイントであり、キーの保護に役立ちます。

0
John Smith