So verifizieren Sie JWT-Signaturen: HS256, RS256 und ES256
So verifizieren Sie JWT-Signaturen
Ein JWT überträgt seine Claims im Klartext. Das Einzige, was Fälschungen verhindert, ist die Signatur. Ohne Verifizierung kann ein Angreifer beliebige Tokens erstellen und sich als beliebiger Benutzer ausgeben. Dieser Leitfaden behandelt die drei häufigsten JWT-Signaturalgorithmen und wie Sie jeden einzelnen verifizieren.
Der Verifizierungsprozess
Unabhängig vom Algorithmus folgt die JWT-Signaturverifizierung denselben Schritten:
- Teilen Sie das Token an
.auf, um Header, Payload und Signatur zu extrahieren. - Decodieren Sie den Header mit base64url, um das
alg-Feld zu lesen. - Berechnen Sie die Signatur aus Header und Payload neu, indem Sie den Algorithmus und den Schlüssel verwenden.
- Vergleichen Sie die neu berechnete Signatur mit der Signatur des Tokens.
- Wenn sie übereinstimmen, ist das Token authentisch.
HS256 (HMAC-SHA256)
HS256 ist ein symmetrischer Algorithmus – derselbe geheime Schlüssel erstellt und verifiziert die Signatur.
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
Zur Verifizierung berechnen Sie den HMAC mit dem gemeinsamen geheimen Schlüssel neu und vergleichen:
Token: header.payload.sig
Secret: "my-shared-secret"
1. Compute: HMACSHA256("header.payload", "my-shared-secret")
2. Compare: computedSignature === sig
Sicherheitsüberlegungen: Der geheime Schlüssel muss vertraulich sein, regelmäßig rotiert werden und mindestens 256 Bit Entropie aufweisen. HS256 ist für Mikroservice-Architekturen, in denen viele Dienste den gemeinsamen geheimen Schlüssel benötigen, nicht ideal.
RS256 (RSA-SHA256)
RS256 ist asymmetrisch. Der Aussteller signiert mit einem privaten Schlüssel; Verifizierer prüfen mit dem entsprechenden öffentlichen Schlüssel.
signature = RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Zur Verifizierung verwenden Sie den öffentlichen Schlüssel:
Token: header.payload.sig
Public: "-----BEGIN PUBLIC KEY-----..."
1. Load the RSA public key
2. Verify: RSA_SHA256_verify("header.payload", sig, publicKey)
Vorteile: Die Signier- und Verifizierungsschlüssel sind getrennt. Jeder Dienst kann verifizieren, ohne ein Geheimnis zu besitzen. Öffentliche Schlüssel können von einem JWKS-Endpunkt für eine einfache Rotation bereitgestellt werden.
ES256 (ECDSA-SHA256)
ES256 verwendet ECDSA mit der P-256-Kurve. Wie RS256 ist es asymmetrisch.
signature = ECDSA_SHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Die Verifizierung verwendet den öffentlichen ECDSA-P-256-Schlüssel. ES256 erzeugt wesentlich kleinere Signaturen (64 Bytes gegenüber 256 Bytes bei RSA-2048) und bietet eine schnellere Verifizierung.
Algorithmenvergleich
| Eigenschaft | HS256 | RS256 | ES256 | |----------|-------|-------|-------| | Schlüsseltyp | Symmetrisch (gemeinsames Geheimnis) | Asymmetrisch (RSA-Paar) | Asymmetrisch (EC-Paar) | | Signaturgröße | 32 Bytes | 256 Bytes | 64 Bytes | | Schlüsselverteilung | Geheim geteilt | Öffentlicher Schlüssel ist öffentlich | Öffentlicher Schlüssel ist öffentlich | | Rotation | Mäßig | Einfach (JWKS) | Einfach (JWKS) | | Anwendungsfall | Vertrauenswürdige interne Systeme | Verteilte APIs | Mobil, IoT |
Häufige Verifizierungsfehler
- Algorithmus-Verwechslungsangriff. Wenn Ihr Code
algaus dem Token liest, ohne es durchzusetzen, kann ein Angreifer den Algorithmus ändern. Validieren Sie immer, dass der Algorithmus dem erwarteten Wert entspricht. - Akzeptieren von
alg: "none". Einige Bibliotheken akzeptieren unsignierte Tokens. Lehnen Siealg: "none"explizit ab. - Signaturkürzung. Ein nicht konstanter Zeitvergleich kann über Timing-Angriffe Informationen preisgeben. Verwenden Sie den integrierten Vergleich Ihrer JWT-Bibliothek.
Verifizieren Sie JWT-Tokens online
Nutzen Sie das JWT-Decoder-Tool, um jedes Token zu decodieren und zu validieren. Fügen Sie das Token ein, sehen Sie sich Header und Payload an und verifizieren Sie die Signatur, indem Sie den passenden geheimen oder öffentlichen Schlüssel angeben. Die gesamte Verarbeitung erfolgt in Ihrem Browser.