Zum Hauptinhalt springen

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.