Come Verificare le Firme JWT: HS256, RS256 e ES256
Come Verificare le Firme JWT
Un JWT trasporta i suoi claim in chiaro. L'unica cosa che impedisce la falsificazione è la firma. Senza verifica, un attaccante può creare token arbitrari e impersonare qualsiasi utente. Questa guida copre i tre algoritmi di firma JWT più comuni e come verificare ciascuno di essi.
Il Processo di Verifica
Indipendentemente dall'algoritmo, la verifica della firma JWT segue gli stessi passaggi:
- Dividi il token sul
.per estrarre header, payload e firma. - Decodifica in base64url l'header per leggere il campo
alg. - Ricalcola la firma da header e payload utilizzando l'algoritmo e la chiave.
- Confronta la firma ricalcolata con la firma del token.
- Se corrispondono, il token è autentico.
HS256 (HMAC-SHA256)
HS256 è un algoritmo simmetrico: la stessa chiave segreta crea e verifica la firma.
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
Per verificare, ricalcola l'HMAC con il segreto condiviso e confronta:
Token: header.payload.sig
Secret: "my-shared-secret"
1. Compute: HMACSHA256("header.payload", "my-shared-secret")
2. Compare: computedSignature === sig
Considerazioni sulla sicurezza: Il segreto deve essere confidenziale, ruotato periodicamente e avere almeno 256 bit di entropia. HS256 non è ideale per architetture a microservizi in cui molti servizi necessitano del segreto condiviso.
RS256 (RSA-SHA256)
RS256 è asimmetrico. L'emittente firma con una chiave privata; i verificatori controllano con la corrispondente chiave pubblica.
signature = RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Per verificare, usa la chiave pubblica:
Token: header.payload.sig
Public: "-----BEGIN PUBLIC KEY-----..."
1. Load the RSA public key
2. Verify: RSA_SHA256_verify("header.payload", sig, publicKey)
Vantaggi: Le chiavi di firma e di verifica sono separate. Qualsiasi servizio può verificare senza detenere un segreto. Le chiavi pubbliche possono essere servite da un endpoint JWKS per una rotazione semplice.
ES256 (ECDSA-SHA256)
ES256 utilizza ECDSA con la curva P-256. Come RS256, è asimmetrico.
signature = ECDSA_SHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
La verifica utilizza la chiave pubblica ECDSA P-256. ES256 produce firme molto più piccole (64 byte contro 256 byte per RSA-2048) e offre una verifica più veloce.
Confronto tra Algoritmi
| Proprietà | HS256 | RS256 | ES256 | |-----------|-------|-------|-------| | Tipo di chiave | Simmetrica (segreto condiviso) | Asimmetrica (coppia RSA) | Asimmetrica (coppia EC) | | Dimensione della firma | 32 byte | 256 byte | 64 byte | | Distribuzione della chiave | Condivisa in segreto | La chiave pubblica è pubblica | La chiave pubblica è pubblica | | Rotazione | Moderata | Facile (JWKS) | Facile (JWKS) | | Caso d'uso | Sistemi interni fidati | API distribuite | Mobile, IoT |
Errori Comuni nella Verifica
- Attacco di confusione dell'algoritmo. Se il tuo codice legge
algdal token senza imporlo, un attaccante può cambiare l'algoritmo. Valida sempre che l'algoritmo corrisponda al valore previsto. - Accettare
alg: "none". Alcune librerie accettano token non firmati. Rifiuta esplicitamentealg: "none". - Truncation della firma. Un confronto non a tempo costante può far trapelare informazioni tramite attacchi di temporizzazione. Usa il confronto integrato della tua libreria JWT.
Verifica Token JWT Online
Usa lo strumento decoder JWT per decodificare e validare qualsiasi token. Incolla il token, visualizza header e payload e verifica la firma fornendo la chiave segreta o pubblica appropriata. Tutta l'elaborazione avviene nel tuo browser.