🎫
← Torna alle guide

Come Verificare le Firme JWT: HS256, RS256 e ES256

· Tag: jwt-verification, jwt-signature, hs256, rs256, token-validation

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:

  1. Dividi il token sul . per estrarre header, payload e firma.
  2. Decodifica in base64url l'header per leggere il campo alg.
  3. Ricalcola la firma da header e payload utilizzando l'algoritmo e la chiave.
  4. Confronta la firma ricalcolata con la firma del token.
  5. 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 alg dal 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 esplicitamente alg: "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.

Come Verificare le Firme JWT: HS256, RS256 e ES256 - CoolTool