用語
Authenticated Encryption with Associated Data (AEAD):
AEADは、暗号化とデータの改ざんチェックを同時に行う仕組みです。
平文(plaintext)と付加認証データ(AAD)を入力し、暗号文(ciphertext)と認証タグ(Authentication Tag)を出力します。
これにより、データの機密性と完全性が一体化して保証されます。
例え話
手紙を暗号化して人に送るための手順
AEADはこうなる:
- 手紙を暗号化して封筒に入れる。
- 封筒に「改ざんチェック用のシール」を貼る。
- 誰かが封筒を開けたり中身を変えると、シールが破れて「改ざんされた!」とわかる。
Additional Authenticated Data (AAD): AEAD 操作において「暗号化はしないが、改ざん防止のために認証処理で使用されるデータ項目」
Authentication Tag:
AEAD 操作の出力として生成されるタグです。暗号文(ciphertext)と追加認証データ(AAD)が改ざんされていないことを保証するための情報です。 一部のアルゴリズムでは Authentication Tag を使用しない場合があり,その場合、空のデータ
Content Encryption Key (CEK): AEADアルゴリズムで平文を暗号化し、認証タグを生成するために使われる対称鍵
JWE Encrypted Key: CEKを暗号化した値
JWE Initialization Vector:
平文を暗号化する際に使用される値で、同じ平文から同じ暗号文が生成されるのを防ぐために使われます。
JWEのシリアライゼーション形式
シリアライゼーション形式
- JWE Compact Serialization
- URL安全なシリアライゼーション形式
- JWE JSON Serialization
- JSON形式のシリアライゼーション
JWE Compact Serialization
特徴
- JWE Compact Serializationでは以下のヘッダーは使用されません:
- JWE Shared Unprotected Header
- JWE Per-Recipient Unprotected Header
- JOSE Headerと
JWE Protected Header
は同一のものとして扱われます。 - 暗号化コンテンツをコンパクトでURL安全な文字列として表現します。
- 一つの受信者のみサポートします。
表現形式
JWE Compact Serializationは次の形式で表現されます:
BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)
JWE JSON Serialization
特徴
- 1つ以上の以下のヘッダーが必須です:
- JWE Protected Header
- JWE Shared Unprotected Header
- JWE Per-Recipient Unprotected Header
JOSE Header
は以下のヘッダーのメンバーの和集合として定義されます:- JWE Protected Header
- JWE Shared Unprotected Header
- JWE Per-Recipient Unprotected Header
- 複数受信者をサポートしており、複数の受信者に暗号文を送ることができます。
表現形式
JWE JSON SerializationはJSONオブジェクトで表現され、以下のメンバーを含む場合があります(すべて必須ではありません):
メンバー名 | 値の内容 |
---|---|
"protected" |
BASE64URL(UTF8(JWE Protected Header)) |
"unprotected" |
JWE Shared Unprotected Header |
"header" |
JWE Per-Recipient Unprotected Header |
"encrypted_key" |
BASE64URL(JWE Encrypted Key) |
"iv" |
BASE64URL(JWE Initialization Vector) |
"ciphertext" |
BASE64URL(JWE Ciphertext) |
"tag" |
BASE64URL(JWE Authentication Tag) |
"aad" |
BASE64URL(JWE AAD) |
JOSE Header for JWE
JWEのJose Headerは以下の項目がある。(パラメータ名は一意でなければならない)
- alg
- Algorithm
- CEK(Content Encryption Key)の暗号化アルゴリズムを指定。
- サポートされていないアルゴリズムは利用不可。
- アルゴリズムの値はIANAの「JSON Web Signature and Encryption Algorithms」レジストリで定義。
- enc
- Encryption Algorithm
- plaintextを暗号化して
ciphertext
とAuthentication Tag
を生成するためのコンテンツ暗号化アルゴリズムを指定。 - サポートされていないアルゴリズムは利用不可。
- 値はIANAの「JSON Web Signature and Encryption Algorithms」レジストリで定義されているか、Collision-Resistant Nameでなければならない。
- Collision-Resistant Nameとは、他の名前と衝突しない一意な名前であり、通常はURL形式(例: example.com/custom-enc)を用いて定義される。
- 値はIANAの「JSON Web Signature and Encryption Algorithms」レジストリで定義されているか、Collision-Resistant Nameでなければならない。
- このパラメータは必須
- zip
- Compression Algorithm
- 暗号化前に平文(plaintext)に適用される圧縮アルゴリズムを指定。
- 例: “DEF”(DEFLATEアルゴリズム)
- 値はIANAの「JSON Web Encryption Compression Algorithms」レジストリで定義。
- zipが指定されていない場合、圧縮は行われない。
- このパラメータは任意だが、圧縮を使用する場合はJWE Protected Header内で定義し、完全性を保護する必要がある。
- jku
- JWK Set URL
CKE
の暗号化に使用された公開鍵を含むJWK(JSON Web Key)セットのURLを指定。- このURLにアクセスすることで、
CKE
の暗号化に使用された公開鍵を取得し、復号に必要な秘密鍵を特定可能。
- jwk
- JSON Web Key
- CKEに暗号化された公開鍵を指定するためのパラメータ。
- 復号に必要な秘密鍵を特定するために使用。
- kid
- Key ID
- CKE(Client Key Exchange)に暗号化された公開鍵を一意に識別するためのパラメータ。
- 秘密鍵を保持する側が鍵を変更した場合、その変更を明示的に公開鍵を使用する側(受信者)に通知する手段を提供する。
- x5u
- 現状必要性がないため理解をSkip
- x5c
- 現状必要性がないため理解をSkip
- x5t
- 現状必要性がないため理解をSkip
- type
- Type
- JWEを使う場合は”JWE”で固定
- cty
- Content Type
- plaintextのContentTypeを表します。
- crit
- Critical
- JWSのためのヘッダーパラメータで、拡張項目に関するパラメータを指定するために使用されます。
- 受信者が理解・処理できない値が設定されている場合、そのJWSは無効(invalid)と見なされます。
- 詳細についてはrfc7515#section-4.1.11を参照
Producing and Consuming JWEs
Message Encryption Steps
- CKE を暗号化するアルゴリズムを決定
- アルゴリズムは、JWE ヘッダーの “alg” パラメータで指定されます。
- サポートされるアルゴリズムはrfc7518#section-4.1を参照
- CEK の生成
- Key Wrapping、Key Encryption、または Key Agreement with Key Wrapping を使用する場合:
- CEK はランダムな値として生成されます。
- CEK の長さは、JWE ヘッダーの “enc” パラメータで指定されたコンテンツ暗号化アルゴリズムの要件に従います。
- Direct Key Agreement の場合:
- 共通鍵(agreed upon key)を CEK として直接使用する。
- Key Wrapping、Key Encryption、または Key Agreement with Key Wrapping を使用する場合:
- CEKの暗号化
- Key Wrapping、Key Encryption、または Key Agreement with Key Wrapping を使用する場合:
- 鍵を使ってCEKを暗号化してJWE Encrypted Key を生成
- Direct Key Agreement または Direct Encryption を使用する場合:
- JWE Encrypted Key を空文字とする。
- Key Wrapping、Key Encryption、または Key Agreement with Key Wrapping を使用する場合:
- JWE Encrypted Key のエンコード
- JWE Encrypted Key を BASE64URL エンコードして、エンコード値を生成。
- JWE Initialization Vectorの生成
- ランダムな値
- 長さは、JWE ヘッダーの “enc” パラメータで指定されたコンテンツ暗号化アルゴリズムの要件に従います。
- JWE Initialization Vector のエンコード
- BASE64URL エンコードして、エンコード値を生成。
- plaintextの圧縮(任意)
- “zip” パラメータがある場合、そのアルゴリズムで平文を圧縮し、結果を
M
とする。 - “zip” パラメータがない場合、
M
は平文そのままとする。
- “zip” パラメータがある場合、そのアルゴリズムで平文を圧縮し、結果を
- JOSE ヘッダの作成
- JWE Protected Header、JWE Shared Unprotected Header、JWE Per-Recipient Unprotected Header に含めるパラメータを設定し、JSON オブジェクトを作成する。
- JWE Protected Header のエンコード(Encoded Protected Header)
- JWE Protected Header を BASE64URL エンコードして、エンコード値を生成。
- Additional Authenticated Data (AAD) の設定
- Compact Serializationの場合
- AAD=ASCII(Encoded Protected Header)として設定する。
- JSON Serializationの場合
- JWE AAD値が存在しない場合
- AAD=ASCII(Encoded Protected Header)として設定する。
- JWE AAD値が存在する場合
-
AAD=ASCII(BASE64URL(UTF8(JWE Protected Header)) ’.’ BASE64URL(UTF8(JWE AAD))) - ユーザーがaadフィールドに値を設定することはできますが、最終的にAADはProtected Headerとaadの値を結合した形で生成されます
-
- JWE AAD値が存在しない場合
- Compact Serializationの場合
- コンテンツ暗号化
- CEK、JWE Initialization Vector、および AAD を用いて、コンテンツ暗号化アルゴリズムで M を暗号化し、JWE Ciphertext と JWE Authentication Tag(認証タグ)を得る。
- JWE Ciphertext のエンコード
- JWE Ciphertext を BASE64URL エンコードする。
- JWE Authentication Tag のエンコード
- JWE Authentication Tag を BASE64URL エンコードする。
- AAD のエンコード(ある場合)
- AAD がある場合
- JWE AAD を BASE64URL エンコードする。
- シリアライゼーション出力の生成
-
Compact Serialization: BASE64URL(UTF8(JWE Protected Header)) ’.’ BASE64URL(JWE Encrypted Key) ’.’ BASE64URL(JWE Initialization Vector) ’.’ BASE64URL(JWE Ciphertext) ’.’ BASE64URL(JWE Authentication Tag) - JWE JSON Serialization: Section 7.2 を参照。
-
補足
- JWE JSON Serialization の場合:
- 各受信者に対して、上記プロセス(ステップ 1~4)を繰り返す。
Message Decryption Steps
- Parse the JWE
- Compact Serializationの場合
- エンコードされたコンポーネントをピリオド(.)区切りで抽出します。順序は以下の通りです:
- BASE64URL(UTF8(JWE Protected Header))
- BASE64URL(JWE Encrypted Key)
- BASE64URL(JWE Initialization Vector)
- BASE64URL(JWE Ciphertext)
- BASE64URL(JWE Authentication Tag)
- エンコードされたコンポーネントをピリオド(.)区切りで抽出します。順序は以下の通りです:
- JSON Serializationの場合
- json形式は以下のように構成されて送られてくるはず
- BASE64URL(UTF8(JWE Protected Header))
- JWE Shared Unprotected Header
- JWE Per-Recipient Unprotected Header
- BASE64URL(JWE Encrypted Key)
- BASE64URL(JWE Initialization Vector)
- BASE64URL(JWE Ciphertext)
- BASE64URL(JWE Authentication Tag)
- BASE64URL(JWE AAD)
- json形式は以下のように構成されて送られてくるはず
- Compact Serializationの場合
- Base64url decode
- step1のBASE64URLを全てDecodeする
- Verify JOSE Header
- 有効なJSONオブジェクトであることを検証
- JOSE Headerに重複した
Header Parameter name
が含まれていないことを確認する - Compact Serializationの場合
- JOSE Header=JWE Protected Header
- JSON Serializationの場合
- JOSE Header=JWE Protected Header + JWE Shared Unprotected Header + JWE Per-Recipient Unprotected Header
- Verify Required Fields and Algorithm Support
- 実装がサポートすべきすべてのフィールドを理解し処理できることを確認する。
- “crit” Header Parameter の値もサポートされていることを確認する。
- CEK復号アルゴリズムを決定
- JOSEヘッダーの “alg” (algorithm) パラメーターに基づいてCEK(Content Encryption Key)の管理アルゴリズムを決定する。
- Determine and Validate CEK
- JWE Encrypted Keyを使用してCEKを取得
- 適切な鍵を使い、JWE Encrypted Keyを復号してCEKを取得する。
- Direct Key Agreement
- 合意された秘密鍵がそのままCEKとなる
- JWE Encrypted Keyは空でなければならない。
- Key Agreement with Key Wrapping
- 共有鍵で生成された秘密鍵を使用して、JWE Encrypted Keyを復号しCEKを取得する。
- Key WrappingまたはKey Encryption
- 公開鍵に対応する秘密鍵を使い、JWE Encrypted Keyを復号してCEKを取得する。
- JWE Encrypted Keyを使用してCEKを取得
- Additional Authenticated Data (AAD) の設定
- AAD を Encoded Protected Header の ASCII 値とする。
-
JWE AAD が存在する場合、AAD = ASCII(Encoded Protected Header ’.’ BASE64URL(JWE AAD)) とする。
- Ciphertextの復号
CEK
,JWE Initialization Vector
,Additional Authenticated Data
,Authentication Tag
を使用してplaintextに復号化- 認証タグを検証する。不正な場合は復号した文字列の出力をrejectする。
- uncompress
- JOSEヘッダーに
zip
が含まれる場合- compression algorithmに従って、文字を元に戻す
- JOSEヘッダーに
- 復号結果の判定
- 全受信者に対する復号処理がいずれも成功しなかった場合、JWEを無効とみなす
- 少なくとも一つの受信者に対して復号が成功した場合は、その平文を出力する。
- JWE JSON Serializationの場合には、復号が成功した受信者と失敗した受信者情報もアプリケーションへ返す