3. JSON Web Encryption (JWE) Overview (JWE-Übersicht)
JWE stellt verschlüsselten Inhalt unter Verwendung von JSON-Datenstrukturen und base64url-Codierung dar. Diese JSON-Datenstrukturen können (MAY) Leerzeichen und/oder Zeilenumbrüche vor oder nach beliebigen JSON-Werten oder Strukturzeichen gemäß Abschnitt 2 von RFC 7159 [RFC7159] enthalten. Ein JWE repräsentiert die folgenden logischen Werte (die jeweils in Abschnitt 2 definiert sind):
- JOSE Header
- JWE Encrypted Key (verschlüsselter JWE-Schlüssel)
- JWE Initialization Vector (JWE-Initialisierungsvektor)
- JWE AAD
- JWE Ciphertext (JWE-Chiffretext)
- JWE Authentication Tag (JWE-Authentifizierungs-Tag)
Für ein JWE sind die Mitglieder des JOSE-Headers die Vereinigung der Mitglieder dieser Werte (die jeweils in Abschnitt 2 definiert sind):
- JWE Protected Header (geschützter JWE-Header)
- JWE Shared Unprotected Header (gemeinsam genutzter ungeschützter JWE-Header)
- JWE Per-Recipient Unprotected Header (empfängerspezifischer ungeschützter JWE-Header)
JWE verwendet authentifizierte Verschlüsselung, um die Vertraulichkeit und Integrität des Klartexts sowie die Integrität des geschützten JWE-Headers und des JWE AAD sicherzustellen.
Dieses Dokument definiert zwei Serialisierungen für JWEs: eine kompakte, URL-sichere Serialisierung namens JWE Compact Serialization (kompakte JWE-Serialisierung) und eine JSON-Serialisierung namens JWE JSON Serialization (JSON-Serialisierung von JWE). In beiden Serialisierungen werden der geschützte JWE-Header, der verschlüsselte JWE-Schlüssel, der JWE-Initialisierungsvektor, der JWE-Chiffretext und das JWE-Authentifizierungs-Tag base64url-codiert, da JSON keine Möglichkeit hat, beliebige Oktettfolgen direkt darzustellen. Falls vorhanden, wird auch das JWE AAD base64url-codiert.
3.1 JWE Compact Serialization Overview (Übersicht über die kompakte JWE-Serialisierung)
In der kompakten JWE-Serialisierung werden kein gemeinsam genutzter ungeschützter JWE-Header und kein empfängerspezifischer ungeschützter JWE-Header verwendet. In diesem Fall sind der JOSE-Header und der geschützte JWE-Header identisch.
In der kompakten JWE-Serialisierung wird ein JWE als die Verkettung dargestellt:
BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)
Siehe Abschnitt 7.1 für weitere Informationen zur kompakten JWE-Serialisierung.
3.2 JWE JSON Serialization Overview (Übersicht über die JSON-Serialisierung von JWE)
In der JSON-Serialisierung von JWE müssen (MUST) einer oder mehrere der folgenden Elemente vorhanden sein: geschützter JWE-Header, gemeinsam genutzter ungeschützter JWE-Header und empfängerspezifischer ungeschützter JWE-Header. In diesem Fall sind die Mitglieder des JOSE-Headers die Vereinigung der Mitglieder der vorhandenen Werte des geschützten JWE-Headers, des gemeinsam genutzten ungeschützten JWE-Headers und des empfängerspezifischen ungeschützten JWE-Headers.
In der JSON-Serialisierung von JWE wird ein JWE als JSON-Objekt dargestellt, das einige oder alle dieser acht Mitglieder enthält:
- "protected", mit dem Wert BASE64URL(UTF8(JWE Protected Header))
- "unprotected", mit dem Wert JWE Shared Unprotected Header
- "header", mit dem Wert JWE Per-Recipient Unprotected Header
- "encrypted_key", mit dem Wert BASE64URL(JWE Encrypted Key)
- "iv", mit dem Wert BASE64URL(JWE Initialization Vector)
- "ciphertext", mit dem Wert BASE64URL(JWE Ciphertext)
- "tag", mit dem Wert BASE64URL(JWE Authentication Tag)
- "aad", mit dem Wert BASE64URL(JWE AAD)
Die sechs base64url-codierten Ergebniszeichenketten und die zwei ungeschützten JSON-Objektwerte werden als Mitglieder innerhalb eines JSON-Objekts dargestellt. Die Aufnahme einiger dieser Werte ist optional (OPTIONAL). Die JSON-Serialisierung von JWE kann den Klartext auch für mehrere Empfänger verschlüsseln. Siehe Abschnitt 7.2 für weitere Informationen zur JSON-Serialisierung von JWE.
3.3 Example JWE (JWE-Beispiel)
Dieses Beispiel verschlüsselt den Klartext "The true sign of intelligence is not knowledge but imagination." für den Empfänger.
Der folgende geschützte JWE-Header erklärt:
- Der Inhaltsverschlüsselungsschlüssel wird für den Empfänger mit dem RSAES-OAEP [RFC3447] Algorithmus verschlüsselt, um den verschlüsselten JWE-Schlüssel zu erzeugen.
- Authentifizierte Verschlüsselung wird auf dem Klartext mit dem AES GCM [AES] [NIST.800-38D] Algorithmus und einem 256-Bit-Schlüssel durchgeführt, um den Chiffretext und das Authentifizierungs-Tag zu erzeugen.
{"alg":"RSA-OAEP","enc":"A256GCM"}
Die Codierung dieses geschützten JWE-Headers als BASE64URL(UTF8(JWE Protected Header)) ergibt diesen Wert:
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ
Die verbleibenden Schritte zum Abschluss der Erstellung dieses JWE sind:
- Einen zufälligen Inhaltsverschlüsselungsschlüssel (CEK) generieren.
- Den CEK mit dem öffentlichen Schlüssel des Empfängers unter Verwendung des RSAES-OAEP-Algorithmus verschlüsseln, um den verschlüsselten JWE-Schlüssel zu erzeugen.
- Den verschlüsselten JWE-Schlüssel base64url-codieren.
- Einen zufälligen JWE-Initialisierungsvektor generieren.
- Den JWE-Initialisierungsvektor base64url-codieren.
- Den Parameter für zusätzliche authentifizierte Daten der Verschlüsselung auf ASCII(BASE64URL(UTF8(JWE Protected Header))) setzen.
- Authentifizierte Verschlüsselung auf dem Klartext mit dem AES GCM-Algorithmus durchführen, wobei der CEK als Verschlüsselungsschlüssel, der JWE-Initialisierungsvektor und der Wert der zusätzlichen authentifizierten Daten verwendet werden, und eine 128-Bit-Ausgabe des Authentifizierungs-Tags anfordern.
- Den Chiffretext base64url-codieren.
- Das Authentifizierungs-Tag base64url-codieren.
- Die endgültige Darstellung zusammenstellen: Die kompakte Serialisierung dieses Ergebnisses ist die Zeichenkette BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag).
Das Endergebnis in diesem Beispiel (mit Zeilenumbrüchen nur für Anzeigezwecke) ist:
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe
ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb
Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV
mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8
1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi
6UklfCpIMfIjf7iGdXKHzg.
48V1_ALb6US04U3b.
5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji
SdiwkIr3ajwQzaBtQD_A.
XFBoMYUZodetZdvTiFvSkQ
Siehe Anhang A.1 für die vollständigen Details der Berechnung dieses JWE. Siehe Anhang A für zusätzliche Beispiele, einschließlich Beispielen, die die JSON-Serialisierung von JWE in den Abschnitten A.4 und A.5 verwenden.