it-swarm.com.de

Sollte ich Muster in einem HS256-codierten JWT sehen können?

Ich habe mit https://jwt.io/ unter Verwendung dieses Headers herumgespielt

{
  "alg": "HS256",
  "typ": "JWT"
}

als mir klar wurde, dass das Ersetzen des Nutzdatennamens durch etwas Wiederholendes wie AAAAAAAAAAAAAAAAAAAA ein Token wie dieses erzeugen würde:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFBQUFBQUFBQUFBQUFBQUFBQUFBIiwiaWF0IjoxNTE2MjM5MDIyfQ.hlXlWvaeyOb6OcrOwd-xfWgF8QlfmTycj5WWZwRr6FY

Sie können sehen, dass der Teilstring BQUF wiederholt zu werden scheint. Je mehr As ich dem Namen hinzugefügt habe, desto mehr BQUFs werden angezeigt.

Soweit ich weiß, erleichtert das Vorhandensein solcher Muster das Auffinden der codierten Inhalte erheblich. Was vermisse ich?

32
jmacedo

Hier gibt es ein bisschen Verwirrung in der Terminologie.

JWT definiert das Grundformat der Ansprüche und einige Standardansprüche. Es gibt an, dass der JWT-Anspruchssatz entweder die Nutzlast einer JWS- oder einer JWE-Struktur sein soll.

JWS definiert eine Struktur für einige Nutzdaten mit einer Signatur. Während die Nutzlast in der Praxis fast immer JWT ist, ist dies keine Anforderung der Spezifikation. Die gebräuchlichste Form ist die JWS Compact Serialization, bei der es sich um die Base64-Datei Header.Payload.Signature Handelt, mit der Sie vertraut sind. Beachten Sie, dass keine Verschlüsselung erforderlich ist, sondern nur das Signieren. Das kann1 Stellen Sie sicher, dass das Token von einer vertrauenswürdigen Partei erstellt und nicht geändert wurde (Authentizität), aber seinen Inhalt nicht verbirgt.

JWE ist das verschlüsselte Gegenstück zu JWS. Ähnlich wie JWS enthält es meistens eine JWT-Nutzlast (als Klartext), dies ist jedoch keine Voraussetzung. Die JWE Compact Serialization unterscheidet sich etwas vom JWS-Äquivalent: Header.Key.IV.Ciphertext.AuthenticationTag. Das sollte1 haben die gleichen Sicherheitsgarantien (Authentizität)2 als JWS, mit dem Zusatz, die Nachricht vor jedem ohne Schlüssel zu verbergen (Vertraulichkeit).


Was Sie dort haben, ist speziell ein JWS, das signiert, aber nicht verschlüsselt ist (wie im HS256 - Algorithmus zu sehen ist, der für " HMAC steht using SHA-256 "). Wenn Sie eine Verschlüsselung benötigen, sollten Sie stattdessen eine JWE mit einem der durch JWA definierten Verschlüsselungsalgorithmen erstellen.


Weiterführende Literatur:


1 Wie immer hängen alle "Garantien" davon ab, dass alles richtig konfiguriert ist. Und dass Sie nicht z. Verwenden einer Debugging-Konfiguration, bei der alles unverschlüsselt/nicht signiert bleibt.

2 Angenommen, authentifizierte Verschlüsselung.

27
Bob

tl/dr : Ihre ausgewählte Version des JWT verschlüsselt nichts, sondern nur für den einfachen Transport. Die Daten in der Nutzlast sollen kein Geheimnis sein.

Sie haben ein JWS (JWT mit Unterschrift). Was Sie sehen, ist einfach die Base64-codierte Datennutzlast. Ein JWS enthält Teile :

  1. Der Base64-codierte Header
  2. Die Base64-codierten Daten
  3. Eine kryptografische Signatur

Base64 ist einfach ein Codierungsformat - keine Art von Verschlüsselung - und soll die Daten nicht verbergen. Vielmehr wird nur sichergestellt, dass es nur aus Standardzeichen besteht ASCII), die die Übertragung zwischen verschiedenen Systemen problemlos überstehen. Wenn Sie also alles zwischen den beiden Perioden aufnehmen und durchlaufen Bei einem Base64-Decoder werden Ihre ursprünglichen Nutzdaten ohne Probleme angezeigt.

Der Schlüssel ist daher einfach: Ein JWS soll die Daten nicht verbergen. Es ist lediglich beabsichtigt (durch die Signatur), Datenintegrität sicherzustellen, d. H. Wenn jemand die Datennutzlast ändert, wissen Sie, dass Ihre Signatur nicht mehr übereinstimmt.

Alternativ können Sie ein JWE (JWT mit Verschlüsselung) verwenden, um Ihre Daten auszublenden. Siehe Bob's ausgezeichnete Antwort für einen detaillierteren Vergleich zwischen JWT, JWS und JWE, die alle eng miteinander verbunden sind.

50
Conor Mancone

Was Sie vermissen, ist, dass Ihr Token signiert ( oder genauer gesagt mit einem symmetrischen Schlüssel authentifiziert) ), aber nicht verschlüsselt ist.

Wenn Sie den Token in Ihrer Frage oben nehmen, teilen Sie ihn zu den Zeitpunkten in drei Teile (.) und führe jedes Stück in einen base64-Decoder ein. Du erhältst die folgenden decodierten Ausgänge:

{"alg":"HS256","typ":"JWT"}
{"sub":"1234567890","name":"AAAAAAAAAAAAAAAAAAAA","iat":1516239022}

und eine Folge von 32 meist Nicht-ASCII-Bytes, die das 256-Bit-HMAC-Authentifizierungs-Tag für den Rest des Tokens ist. Wie Sie sehen können, sind alle Daten dort für jedermann leicht lesbar. Das Authentifizierungs-Tag verhindert nur, dass Personen, die den geheimen HMAC-Schlüssel nicht kennen, das Token ändern oder gefälschte Token von Grund auf neu erstellen.

14
Ilmari Karonen