Was ist an JWT gesichert?

7

Ich benutze JWT, um Tokens zu produzieren und zu verbrauchen. Nach wochenlanger Lektüre von Spezifikationen und Googeln verstehe ich immer noch nicht: Was ist mit dem Token gesichert, wenn ich es auf einer Maschine produzieren und auf einer anderen öffnen kann? Soll das geschriebene Token irgendwie verschlüsselt werden? Ich verwende System.IdentityModel.Tokens und erzeuge Token mit JwtSecurityToken und JwtSecurityTokenHandler .

Kann mich bitte jemand auf eine fokussierte Dokumentation zum Thema hinweisen, die hauptsächlich den Sicherheitsaspekt erklärt?

    
eddyuk 04.02.2014, 16:02
quelle

2 Antworten

22

Die ersten beiden Segmente eines JWT sind nicht verschlüsselt. Daher sollte jede App, die ein JWT auf dem Server erzeugt und es an einen Client zurücksendet, dies über SSL tun. Dies wird normalerweise als Antwort auf eine Anfrage zur Anmeldung an den Benutzer gesendet, die sowieso über SSL gesendet werden sollte, da sie normalerweise eine Kombination aus Benutzername und Passwort enthält. Nachfolgende Anforderungen, die an den Server gesendet werden, sollten auch über SSL erfolgen, denn unabhängig davon, welche Art von Token Sie verwenden - sei es JWT oder etwas anderes - sollte es nicht in unverschlüsselter Form für Paket-Sniffing sichtbar sein, da sonst Benutzersitzungen entführt werden können.

Der Sicherheitsaspekt von JWT stammt aus dem dritten und letzten Segment. Es wird generiert, indem die ersten beiden Segmente mit einem geheimen Schlüssel signiert werden, den nur der Server kennt. Wenn ein von einem Server generierter JWT als Teil einer authentifizierten Anforderung an diesen Server zurückgesendet wird, kennt der Server den Schlüssel und kann daher die Signatur im dritten Segment validieren und diese Signatur verwenden, um sicherzustellen, dass die ersten beiden Segmente seitdem nicht geändert wurden vom Server signiert werden.

    
Steve Taylor 19.02.2014 01:55
quelle
4

Soweit ich das beurteilen kann, ist die C # -Implementierung von JwtSecurityToken nicht dazu gedacht, ihren Inhalt zu verschlüsseln (wie Ihre Frage zu implizieren scheint). Es ist stattdessen entworfen, um seinen Inhalt zu signieren. Dies entspricht dem typischen Sicherheitsmodell eines Tokens. Es soll eine Information sein, die sonst gesichert ist.

Der Unterschied ist, dass Sie nicht versuchen, irgendwelche Informationen zu verbergen, Sie validieren nur die Quelle der Information (sowie die Integrität, aber das ist verwandt).

Zum Beispiel könnte Twitter Ihnen ein Token geben, das die Daten "eddyuk", "eddyuks geniale Anwendung" enthält und das für die Autorisierung als ausreichend erachtet. Um zu vermeiden, dass ich mein eigenes Token für den gleichen Zweck erstelle, können sie es signieren, sodass eine exakte Kopie des ursprünglichen Tokens für die Verwendung benötigt wird.

Dies dient zwei Zwecken: Sie müssen kein komplexes Zuordnungsschema verwalten. Wenn Sie davon ausgehen, dass Ihre Signaturmethode sicher ist, ist ein Raten unmöglich.

Beachten Sie, dass es eine Möglichkeit gibt, verschlüsselte Informationen in einem Token unter Verwendung einiger anderer Implementierungen zu speichern, aber die C # one unterstützt diese Funktionalität nicht.

    
Guvante 04.02.2014 17:21
quelle

Tags und Links