Comment vérifier les signatures JWT : HS256, RS256 et ES256
Comment vérifier les signatures JWT
Un JWT transporte ses revendications en texte clair. La seule chose qui empĂȘche la falsification est la signature. Sans vĂ©rification, un attaquant peut fabriquer des jetons arbitraires et usurper l'identitĂ© de n'importe quel utilisateur. Ce guide couvre les trois algorithmes de signature JWT les plus courants et comment vĂ©rifier chacun d'eux.
Le processus de vérification
Quel que soit l'algorithme, la vĂ©rification de la signature JWT suit les mĂȘmes Ă©tapes :
- Divisez le jeton sur
.pour extraire le header, le payload et la signature. - Décodez le header en base64url pour lire le champ
alg. - Recalculez la signature à partir du header et du payload à l'aide de l'algorithme et de la clé.
- Comparez la signature recalculée avec la signature du jeton.
- S'ils correspondent, le jeton est authentique.
HS256 (HMAC-SHA256)
HS256 est un algorithme symĂ©trique â la mĂȘme clĂ© secrĂšte crĂ©e et vĂ©rifie la signature.
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
Pour vérifier, recalculez le HMAC avec la clé secrÚte partagée et comparez :
Token: header.payload.sig
Secret: "my-shared-secret"
1. Compute: HMACSHA256("header.payload", "my-shared-secret")
2. Compare: computedSignature === sig
ConsidĂ©rations de sĂ©curitĂ© : La clĂ© secrĂšte doit ĂȘtre confidentielle, renouvelĂ©e pĂ©riodiquement et possĂ©der au moins 256 bits d'entropie. HS256 n'est pas idĂ©al pour les architectures de microservices oĂč de nombreux services ont besoin de la clĂ© secrĂšte partagĂ©e.
RS256 (RSA-SHA256)
RS256 est asymétrique. L'émetteur signe avec une clé privée ; les vérificateurs contrÎlent avec la clé publique correspondante.
signature = RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Pour vérifier, utilisez la clé publique :
Token: header.payload.sig
Public: "-----BEGIN PUBLIC KEY-----..."
1. Load the RSA public key
2. Verify: RSA_SHA256_verify("header.payload", sig, publicKey)
Avantages : Les clĂ©s de signature et de vĂ©rification sont sĂ©parĂ©es. N'importe quel service peut vĂ©rifier sans dĂ©tenir de secret. Les clĂ©s publiques peuvent ĂȘtre fournies depuis un point de terminaison JWKS pour un renouvellement facile.
ES256 (ECDSA-SHA256)
ES256 utilise ECDSA avec la courbe P-256. Comme RS256, il est asymétrique.
signature = ECDSA_SHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
La vérification utilise la clé publique ECDSA P-256. ES256 produit des signatures beaucoup plus petites (64 octets contre 256 octets pour RSA-2048) et offre une vérification plus rapide.
Comparaison des algorithmes
| Propriété | HS256 | RS256 | ES256 | |----------|-------|-------|-------| | Type de clé | Symétrique (clé secrÚte partagée) | Asymétrique (paire RSA) | Asymétrique (paire EC) | | Taille de la signature | 32 octets | 256 octets | 64 octets | | Distribution des clés | Partagée secrÚtement | La clé publique est publique | La clé publique est publique | | Renouvellement | Modéré | Facile (JWKS) | Facile (JWKS) | | Cas d'utilisation | SystÚmes internes de confiance | API distribuées | Mobile, IoT |
PiÚges courants de la vérification
- Attaque par confusion d'algorithme. Si votre code lit
algdepuis le jeton sans le vérifier, un attaquant peut changer l'algorithme. Validez toujours que l'algorithme correspond à la valeur attendue. - Accepter
alg: "none". Certaines bibliothÚques acceptent les jetons non signés. Rejetez explicitementalg: "none". - Troncation de la signature. Une comparaison non constante dans le temps peut fuiter des informations via des attaques temporelles (timing attacks). Utilisez la comparaison intégrée de votre bibliothÚque JWT.
Vérifiez les jetons JWT en ligne
Utilisez l'outil de décodage JWT pour décoder et valider n'importe quel jeton. Collez le jeton, visualisez le header et le payload, et vérifiez la signature en fournissant la clé secrÚte ou publique appropriée. Tout le traitement s'effectue dans votre navigateur.