3. JSON Web Encryption (JWE) Overview (JWE概要)
JWEは、JSONデータ構造とbase64url符号化を使用して暗号化されたコンテンツを表現します。これらのJSONデータ構造は、RFC 7159 [RFC7159] のセクション2に従って、任意のJSON値または構造文字の前後に空白や改行を含むことができます (MAY)。JWEは以下の論理値を表現します (それぞれセクション2で定義されています):
- JOSE Header
- JWE Encrypted Key (JWE暗号化鍵)
- JWE Initialization Vector (JWE初期化ベクトル)
- JWE AAD
- JWE Ciphertext (JWE暗号文)
- JWE Authentication Tag (JWE認証タグ)
JWEの場合、JOSE Headerのメンバーは、以下の値のメンバーの和集合です (それぞれセクション2で定義されています):
- JWE Protected Header (JWE保護ヘッダー)
- JWE Shared Unprotected Header (JWE共有非保護ヘッダー)
- JWE Per-Recipient Unprotected Header (JWE受信者ごとの非保護ヘッダー)
JWEは、認証暗号化を利用して、平文の機密性と完全性、およびJWE Protected HeaderとJWE AADの完全性を保証します。
本文書では、JWEに対して2つの直列化方式を定義しています: JWE Compact Serialization (JWEコンパクト直列化) と呼ばれるコンパクトでURL安全な直列化と、JWE JSON Serialization (JWE JSON直列化) と呼ばれるJSON直列化です。両方の直列化において、JWE Protected Header、JWE Encrypted Key、JWE Initialization Vector、JWE Ciphertext、およびJWE Authentication Tagはbase64url符号化されます。これは、JSONが任意のオクテット列を直接表現する方法を持たないためです。存在する場合、JWE AADもbase64url符号化されます。
3.1 JWE Compact Serialization Overview (JWEコンパクト直列化の概要)
JWE Compact Serializationでは、JWE Shared Unprotected HeaderまたはJWE Per-Recipient Unprotected Headerは使用されません。この場合、JOSE HeaderとJWE Protected Headerは同じです。
JWE Compact Serializationでは、JWEは以下の連結として表現されます:
BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)
JWE Compact Serializationの詳細については、セクション7.1を参照してください。
3.2 JWE JSON Serialization Overview (JWE JSON直列化の概要)
JWE JSON Serializationでは、JWE Protected Header、JWE Shared Unprotected Header、およびJWE Per-Recipient Unprotected Headerのうち1つ以上が存在しなければなりません (MUST)。この場合、JOSE Headerのメンバーは、存在するJWE Protected Header、JWE Shared Unprotected Header、およびJWE Per-Recipient Unprotected Header値のメンバーの和集合です。
JWE JSON Serializationでは、JWEは以下の8つのメンバーの一部またはすべてを含む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)
これら6つのbase64url符号化された結果文字列と2つの非保護JSONオブジェクト値は、JSONオブジェクト内のメンバーとして表現されます。これらの値の一部を含めることは任意です (OPTIONAL)。JWE JSON Serializationは、平文を複数の受信者に暗号化することもできます。JWE JSON Serializationの詳細については、セクション7.2を参照してください。
3.3 Example JWE (JWEの例)
この例では、平文 "The true sign of intelligence is not knowledge but imagination." を受信者に暗号化します。
以下の例のJWE Protected Headerは、次のことを宣言しています:
- Content Encryption KeyはRSAES-OAEP [RFC3447] アルゴリズムを使用して受信者に暗号化され、JWE Encrypted Keyを生成します。
- 平文に対して、AES GCM [AES] [NIST.800-38D] アルゴリズムと256ビット鍵を使用して認証暗号化が実行され、暗号文とAuthentication Tagを生成します。
{"alg":"RSA-OAEP","enc":"A256GCM"}
このJWE Protected HeaderをBASE64URL(UTF8(JWE Protected Header))として符号化すると、次の値が得られます:
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ
このJWEの作成を完了するための残りの手順は次のとおりです:
- ランダムなContent Encryption Key (CEK) を生成します。
- RSAES-OAEPアルゴリズムを使用して受信者の公開鍵でCEKを暗号化し、JWE Encrypted Keyを生成します。
- JWE Encrypted Keyをbase64url符号化します。
- ランダムなJWE Initialization Vectorを生成します。
- JWE Initialization Vectorをbase64url符号化します。
- Additional Authenticated Data暗号化パラメータをASCII(BASE64URL(UTF8(JWE Protected Header)))とします。
- AES GCMアルゴリズムを使用して平文に対して認証暗号化を実行します。CEKを暗号化鍵として使用し、JWE Initialization VectorとAdditional Authenticated Data値を使用し、128ビットのAuthentication Tag出力を要求します。
- 暗号文をbase64url符号化します。
- Authentication Tagをbase64url符号化します。
- 最終的な表現を組み立てます: この結果のCompact Serializationは、文字列BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag)です。
この例の最終結果 (表示目的で改行を追加) は次のとおりです:
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe
ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb
Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV
mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8
1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi
6UklfCpIMfIjf7iGdXKHzg.
48V1_ALb6US04U3b.
5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji
SdiwkIr3ajwQzaBtQD_A.
XFBoMYUZodetZdvTiFvSkQ
このJWEの計算の完全な詳細については、附録A.1を参照してください。附録AのセクションA.4およびA.5のJWE JSON Serializationを使用した例を含む追加の例については、附録Aを参照してください。