5. Producing and Consuming JWEs (Erzeugen und Verarbeiten von JWEs)
5.1 Message Encryption (Nachrichtenverschlüsselung)
Der Nachrichtenverschlüsselungsprozess ist wie folgt. Die Reihenfolge der Schritte ist nicht signifikant in Fällen, in denen keine Abhängigkeiten zwischen den Ein- und Ausgaben der Schritte bestehen.
-
Bestimmen Sie den Schlüsselverwaltungsmodus, der vom Algorithmus zur Bestimmung des Content Encryption Key-Werts verwendet wird. (Dies ist der Algorithmus, der im "alg" (algorithm, Algorithmus)-Header-Parameter des resultierenden JWE aufgezeichnet wird.)
-
Wenn Schlüsselumhüllung, Schlüsselverschlüsselung oder Schlüsselvereinbarung mit Schlüsselumhüllung verwendet werden, generieren Sie einen zufälligen CEK-Wert. Siehe RFC 4086 [RFC4086] für Überlegungen zur Generierung von Zufallswerten. Der CEK muss (MUST) eine Länge haben, die der für den Inhaltsverschlüsselungsalgorithmus erforderlichen entspricht.
-
Wenn direkte Schlüsselvereinbarung oder Schlüsselvereinbarung mit Schlüsselumhüllung verwendet werden, verwenden Sie den Schlüsselvereinbarungsalgorithmus, um den Wert des vereinbarten Schlüssels zu berechnen. Wenn direkte Schlüsselvereinbarung verwendet wird, lassen Sie den CEK der vereinbarte Schlüssel sein. Wenn Schlüsselvereinbarung mit Schlüsselumhüllung verwendet wird, wird der vereinbarte Schlüssel zum Umhüllen des CEK verwendet.
-
Wenn Schlüsselumhüllung, Schlüsselverschlüsselung oder Schlüsselvereinbarung mit Schlüsselumhüllung verwendet werden, verschlüsseln Sie den CEK für den Empfänger und lassen Sie das Ergebnis der JWE Encrypted Key sein.
-
Wenn direkte Schlüsselvereinbarung oder direkte Verschlüsselung verwendet werden, lassen Sie den JWE Encrypted Key die leere Oktettsequenz sein.
-
Wenn direkte Verschlüsselung verwendet wird, lassen Sie den CEK der gemeinsame symmetrische Schlüssel sein.
-
Berechnen Sie den codierten Schlüsselwert BASE64URL(JWE Encrypted Key).
-
Wenn die JWE JSON-Serialisierung verwendet wird, wiederholen Sie diesen Prozess (Schritte 1-7) für jeden Empfänger.
-
Generieren Sie einen zufälligen JWE Initialization Vector der richtigen Größe für den Inhaltsverschlüsselungsalgorithmus (falls vom Algorithmus erforderlich); andernfalls lassen Sie den JWE Initialization Vector die leere Oktettsequenz sein.
-
Berechnen Sie den codierten Initialization Vector-Wert BASE64URL(JWE Initialization Vector).
-
Wenn ein "zip"-Parameter enthalten ist, komprimieren Sie den Klartext mit dem angegebenen Kompressionsalgorithmus und lassen Sie M die Oktettsequenz sein, die den komprimierten Klartext darstellt; andernfalls lassen Sie M die Oktettsequenz sein, die den Klartext darstellt.
-
Erstellen Sie das oder die JSON-Objekte, die den gewünschten Satz von Header-Parametern enthalten, die zusammen den JOSE-Header bilden: den JWE Protected Header, den JWE Shared Unprotected Header und den JWE Per-Recipient Unprotected Header.
-
Berechnen Sie den Encoded Protected Header-Wert BASE64URL(UTF8(JWE Protected Header)). Wenn der JWE Protected Header nicht vorhanden ist (was nur bei Verwendung der JWE JSON-Serialisierung und wenn kein "protected"-Member vorhanden ist auftreten kann), lassen Sie diesen Wert die leere Zeichenfolge sein.
-
Lassen Sie den Additional Authenticated Data-Verschlüsselungsparameter ASCII(Encoded Protected Header) sein. Wenn jedoch ein JWE AAD-Wert vorhanden ist (was nur bei Verwendung der JWE JSON-Serialisierung der Fall sein kann), lassen Sie stattdessen den Additional Authenticated Data-Verschlüsselungsparameter ASCII(Encoded Protected Header || '.' || BASE64URL(JWE AAD)) sein.
-
Verschlüsseln Sie M mit dem CEK, dem JWE Initialization Vector und dem Additional Authenticated Data-Wert unter Verwendung des angegebenen Inhaltsverschlüsselungsalgorithmus, um den JWE Ciphertext-Wert und das JWE Authentication Tag (das die Authentication Tag-Ausgabe der Verschlüsselungsoperation ist) zu erstellen.
-
Berechnen Sie den codierten Chiffretextwert BASE64URL(JWE Ciphertext).
-
Berechnen Sie den codierten Authentication Tag-Wert BASE64URL(JWE Authentication Tag).
-
Wenn ein JWE AAD-Wert vorhanden ist, berechnen Sie den codierten AAD-Wert BASE64URL(JWE AAD).
-
Erstellen Sie die gewünschte serialisierte Ausgabe. Die Compact Serialization dieses Ergebnisses ist die Zeichenfolge BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag). Die JWE JSON-Serialisierung wird in Abschnitt 7.2 beschrieben.
5.2 Message Decryption (Nachrichtenentschlüsselung)
Der Nachrichtenentschlüsselungsprozess ist die Umkehrung des Verschlüsselungsprozesses. Die Reihenfolge der Schritte ist nicht signifikant in Fällen, in denen keine Abhängigkeiten zwischen den Ein- und Ausgaben der Schritte bestehen. Wenn einer dieser Schritte fehlschlägt, kann der verschlüsselte Inhalt nicht validiert werden.
Wenn es mehrere Empfänger gibt, ist es eine Anwendungsentscheidung, welcher der verschlüsselten Inhalte der Empfänger erfolgreich validiert werden muss, damit das JWE akzeptiert wird. In einigen Fällen muss der verschlüsselte Inhalt für alle Empfänger erfolgreich validiert werden, oder das JWE wird als ungültig betrachtet. In anderen Fällen muss nur der verschlüsselte Inhalt für einen einzelnen Empfänger erfolgreich validiert werden. In allen Fällen muss (MUST) jedoch der verschlüsselte Inhalt für mindestens einen Empfänger erfolgreich validiert werden, oder das JWE muss (MUST) als ungültig betrachtet werden.
-
Analysieren Sie die JWE-Darstellung, um die serialisierten Werte für die JWE-Komponenten zu extrahieren. Bei Verwendung der JWE Compact Serialization sind diese Komponenten die base64url-codierten Darstellungen des JWE Protected Header, des JWE Encrypted Key, des JWE Initialization Vector, des JWE Ciphertext und des JWE Authentication Tag, und bei Verwendung der JWE JSON-Serialisierung enthalten diese Komponenten auch die base64url-codierte Darstellung des JWE AAD und die nicht codierten JWE Shared Unprotected Header- und JWE Per-Recipient Unprotected Header-Werte. Bei Verwendung der JWE Compact Serialization werden der JWE Protected Header, der JWE Encrypted Key, der JWE Initialization Vector, der JWE Ciphertext und das JWE Authentication Tag als base64url-codierte Werte in dieser Reihenfolge dargestellt, wobei jeder Wert durch ein einzelnes Punkt-Zeichen ('.') vom nächsten getrennt ist, was genau vier trennende Punkt-Zeichen ergibt. Die JWE JSON-Serialisierung wird in Abschnitt 7.2 beschrieben.
-
Base64url-dekodieren Sie die codierten Darstellungen des JWE Protected Header, des JWE Encrypted Key, des JWE Initialization Vector, des JWE Ciphertext, des JWE Authentication Tag und des JWE AAD unter Einhaltung der Einschränkung, dass keine Zeilenumbrüche, Leerzeichen oder andere zusätzliche Zeichen verwendet wurden.
-
Überprüfen Sie, dass die Oktettsequenz, die aus der Dekodierung des codierten JWE Protected Header resultiert, eine UTF-8-codierte Darstellung eines vollständig gültigen JSON-Objekts ist, das RFC 7159 [RFC7159] entspricht; lassen Sie den JWE Protected Header dieses JSON-Objekt sein.
-
Bei Verwendung der JWE Compact Serialization lassen Sie den JOSE-Header der JWE Protected Header sein. Andernfalls, bei Verwendung der JWE JSON-Serialisierung, lassen Sie den JOSE-Header die Vereinigung der Member des JWE Protected Header, des JWE Shared Unprotected Header und des entsprechenden JWE Per-Recipient Unprotected Header sein, die alle vollständig gültige JSON-Objekte sein müssen. Überprüfen Sie während dieses Schritts, dass der resultierende JOSE-Header keine doppelten Header-Parameternamen enthält. Bei Verwendung der JWE JSON-Serialisierung beinhaltet diese Einschränkung, dass derselbe Header-Parametername auch nicht (MUST NOT) in unterschiedlichen JSON-Objektwerten vorkommen darf, die zusammen den JOSE-Header bilden.
-
Überprüfen Sie, dass die Implementierung alle Felder versteht und verarbeiten kann, die sie unterstützen muss, sei es aufgrund dieser Spezifikation, des verwendeten Algorithmus oder des "crit"-Header-Parameterwerts, und dass die Werte dieser Parameter ebenfalls verstanden und unterstützt werden.
-
Bestimmen Sie den Schlüsselverwaltungsmodus, der vom durch den "alg" (algorithm, Algorithmus)-Header-Parameter angegebenen Algorithmus verwendet wird.
-
Überprüfen Sie, dass das JWE einen dem Empfänger bekannten Schlüssel verwendet.
-
Wenn direkte Schlüsselvereinbarung oder Schlüsselvereinbarung mit Schlüsselumhüllung verwendet werden, verwenden Sie den Schlüsselvereinbarungsalgorithmus, um den Wert des vereinbarten Schlüssels zu berechnen. Wenn direkte Schlüsselvereinbarung verwendet wird, lassen Sie den CEK der vereinbarte Schlüssel sein. Wenn Schlüsselvereinbarung mit Schlüsselumhüllung verwendet wird, wird der vereinbarte Schlüssel zum Entschlüsseln des JWE Encrypted Key verwendet.
-
Wenn Schlüsselumhüllung, Schlüsselverschlüsselung oder Schlüsselvereinbarung mit Schlüsselumhüllung verwendet werden, entschlüsseln Sie den JWE Encrypted Key, um den CEK zu erzeugen. Der CEK muss (MUST) eine Länge haben, die der für den Inhaltsverschlüsselungsalgorithmus erforderlichen entspricht. Beachten Sie, dass bei mehreren Empfängern jeder Empfänger nur JWE Encrypted Key-Werte entschlüsseln kann, die für Schlüssel im Besitz dieses Empfängers verschlüsselt wurden. Es ist daher normal, nur einen der pro-Empfänger-JWE Encrypted Key-Werte entschlüsseln zu können, um den CEK-Wert zu erhalten. Siehe auch Abschnitt 11.5 für Sicherheitsüberlegungen zur Abwehr von Timing-Angriffen.
-
Wenn direkte Schlüsselvereinbarung oder direkte Verschlüsselung verwendet werden, überprüfen Sie, dass der JWE Encrypted Key-Wert eine leere Oktettsequenz ist.
-
Wenn direkte Verschlüsselung verwendet wird, lassen Sie den CEK der gemeinsame symmetrische Schlüssel sein.
-
Notieren Sie, ob der CEK für diesen Empfänger erfolgreich bestimmt werden konnte.
-
Wenn die JWE JSON-Serialisierung verwendet wird, wiederholen Sie diesen Prozess (Schritte 4-12) für jeden in der Darstellung enthaltenen Empfänger.
-
Berechnen Sie den Encoded Protected Header-Wert BASE64URL(UTF8(JWE Protected Header)). Wenn der JWE Protected Header nicht vorhanden ist (was nur bei Verwendung der JWE JSON-Serialisierung und wenn kein "protected"-Member vorhanden ist auftreten kann), lassen Sie diesen Wert die leere Zeichenfolge sein.
-
Lassen Sie den Additional Authenticated Data-Verschlüsselungsparameter ASCII(Encoded Protected Header) sein. Wenn jedoch ein JWE AAD-Wert vorhanden ist (was nur bei Verwendung der JWE JSON-Serialisierung der Fall sein kann), lassen Sie stattdessen den Additional Authenticated Data-Verschlüsselungsparameter ASCII(Encoded Protected Header || '.' || BASE64URL(JWE AAD)) sein.
-
Entschlüsseln Sie den JWE Ciphertext unter Verwendung des CEK, des JWE Initialization Vector, des Additional Authenticated Data-Werts und des JWE Authentication Tag (das die Authentication Tag-Eingabe für die Berechnung ist) unter Verwendung des angegebenen Inhaltsverschlüsselungsalgorithmus, wobei der entschlüsselte Klartext zurückgegeben und das JWE Authentication Tag auf die für den Algorithmus angegebene Weise validiert wird, wobei die Eingabe ohne Ausgabe entschlüsselter Daten abgelehnt wird, wenn das JWE Authentication Tag nicht korrekt ist.
-
Wenn ein "zip"-Parameter enthalten ist, dekomprimieren Sie den entschlüsselten Klartext mit dem angegebenen Kompressionsalgorithmus.
-
Wenn es keine Empfänger gibt, für die alle Entschlüsselungsschritte erfolgreich waren, dann muss (MUST) das JWE als ungültig betrachtet werden. Andernfalls geben Sie den Klartext aus. Im Fall der JWE JSON-Serialisierung geben Sie auch ein Ergebnis an die Anwendung zurück, das angibt, für welche der Empfänger die Entschlüsselung erfolgreich war und fehlgeschlagen ist.
Abschließend ist zu beachten, dass es eine Anwendungsentscheidung ist, welche Algorithmen in einem bestimmten Kontext verwendet werden dürfen. Selbst wenn ein JWE erfolgreich entschlüsselt werden kann, sollte (SHOULD) die Anwendung das JWE als ungültig betrachten, wenn die im JWE verwendeten Algorithmen für die Anwendung nicht akzeptabel sind.
5.3 String Comparison Rules (Zeichenfolgenvergleichsregeln)
Die Zeichenfolgenvergleichsregeln für diese Spezifikation sind dieselben wie die in Abschnitt 5.3 von [JWS] definierten.