2016-07-14 14 views
1

ich die Übersicht über die jjwt Bibliothek zu lesen:jwt: Warum wird der Signaturalgorithmus nicht benötigt, wenn ein JWT-Token verifiziert wird?

das Token Der Aufbau erfolgt wie folgt:

import io.jsonwebtoken.Jwts; 
import io.jsonwebtoken.SignatureAlgorithm; 
import io.jsonwebtoken.impl.crypto.MacProvider; 
import java.security.Key; 

// We need a signing key, so we'll create one just for this example. Usually 
// the key would be read from your application configuration instead. 
Key key = MacProvider.generateKey(); 

String compactJws = Jwts.builder() 
    .setSubject("Joe") 
    .signWith(SignatureAlgorithm.HS512, key) 
    .compact(); 

Und das Token ist verifiziert als:

try { 

    Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws); 

    //OK, we can trust this JWT 

} catch (SignatureException e) { 

    //don't trust the JWT! 
} 

SignatureAlgorithm.HS512 nicht verwendet wird auf dem zweiten Ausschnitt. Wie wird es abgeleitet? Oder ist es nicht notwendig?

Antwort

2

Da JWT den Algorithmus im Header enthält, so der Prüfer weiß, welcher Algorithmus müssen einfach zu verwenden, das Decodieren des ersten Teils des Tokens

Zum Beispiel, wenn Sie den ersten Teil dieses Token (Test bei https://jwt.io/ dekodieren

)
eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.O8YgYdD1YxficWfO_06nDsm_YgDdXmgMM4CN3bLor5c 

entspricht

{ 
    "alg": "HS512", 
    "typ": "JWT" 
} 
+0

Aber brauchen Sie nicht den Algorithmus, um diesen ersten Teil zu entschlüsseln? –

+0

Nein. Der Header (erster Teil) und die Payload (zweiter Teil) sind Base64-codiert. Der Signaturalgorithmus ist nur notwendig, um die Signatur zu verifizieren (dritter Teil) – pedrofb

+0

ok Ich denke, ich sollte mir die RFC-Dokumente genauer ansehen. Danke –

1

Wie @pedrofb der Algorithmus erwähnt bequem im Header enthalten ist, und in ca Bei einem asymmetrischen Algorithmus finden Sie auch den Schlüssel, der über den Header-Parameter kid verwendet wurde.

Heads up, dass Sie nur zu sein sollten sehr vorsichtig erlauben, die Algorithmen, die Sie wenn Decodierung erwarten . Andernfalls könnten Sie ein Token akzeptieren, das mit alg=none signiert wurde, was im Prinzip jede Verifizierung umgeht.

Die meisten Decoder haben Unterstützung dafür (und wenn nicht, sollten sie). Ihr besonderes Beispiel scheint allerdings Anlass zur Sorge als

//OK, we can trust this JWT 

nicht wahr sein könnte, wenn Ihr Parser auch alg=none akzeptiert. Also pass auf dich auf!

+0

Schöner Punkt Pieter! –