JWT-handtekeningen verifiëren: HS256, RS256 en ES256
JWT-handtekeningen verifiëren
Een JWT bevat zijn claims in leesbare tekst. Het enige dat vervalsing voorkomt, is de signature. Zonder verificatie kan een aanvaller willekeurige tokens vervaardigen en zich voordoen als elke gebruiker. Deze handleiding behandelt de drie meest voorkomende JWT-ondertekeningsalgoritmen en hoe u elk daarvan verifieert.
Het verificatieproces
Ongeacht het algoritme volgt JWT-handtekeningverificatie dezelfde stappen:
- Splits het token op
.om de header, payload en signature te extraheren. - Decodeer de header met base64url om het veld
algte lezen. - Herbereken de signature op basis van de header en payload met behulp van het algoritme en de sleutel.
- Vergelijk de herberekende signature met de signature van het token.
- Als ze overeenkomen, is het token authentiek.
HS256 (HMAC-SHA256)
HS256 is een symmetrisch algoritme — dezelfde geheime sleutel maakt en verifieert de signature.
signature = HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
Om te verifiëren, herberekent u de HMAC met het gedeelde geheim en vergelijkt u:
Token: header.payload.sig
Secret: "my-shared-secret"
1. Compute: HMACSHA256("header.payload", "my-shared-secret")
2. Compare: computedSignature === sig
Beveiligingsoverwegingen: Het geheim moet vertrouwelijk zijn, periodiek worden gerouleerd en ten minste 256 bits aan entropie bevatten. HS256 is niet ideaal voor microservice-architecturen waarin veel services het gedeelde geheim nodig hebben.
RS256 (RSA-SHA256)
RS256 is asymmetrisch. De uitgever ondertekent met een privésleutel; verificateurs controleren met de bijbehorende openbare sleutel.
signature = RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Om te verifiëren, gebruikt u de openbare sleutel:
Token: header.payload.sig
Public: "-----BEGIN PUBLIC KEY-----..."
1. Load the RSA public key
2. Verify: RSA_SHA256_verify("header.payload", sig, publicKey)
Voordelen: De ondertekenings- en verificatiesleutels zijn gescheiden. Elke service kan verifiëren zonder een geheim vast te houden. Openbare sleutels kunnen via een JWKS-eindpunt worden aangeboden voor eenvoudige rotatie.
ES256 (ECDSA-SHA256)
ES256 gebruikt ECDSA met de P-256-curve. Net als RS256 is dit algoritme asymmetrisch.
signature = ECDSA_SHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Voor verificatie wordt de openbare ECDSA P-256-sleutel gebruikt. ES256 produceert veel kleinere signatures (64 bytes versus 256 bytes voor RSA-2048) en biedt snellere verificatie.
Algoritmevergelijking
| Eigenschap | HS256 | RS256 | ES256 | |----------|-------|-------|-------| | Sleuteltype | Symmetrisch (gedeeld geheim) | Asymmetrisch (RSA-paar) | Asymmetrisch (EC-paar) | | Signaturegrootte | 32 bytes | 256 bytes | 64 bytes | | Sleutelverdeling | In het geheim gedeeld | Openbare sleutel is openbaar | Openbare sleutel is openbaar | | Rotatie | Matig | Eenvoudig (JWKS) | Eenvoudig (JWKS) | | Toepassing | Vertrouwde interne systemen | Gedistribueerde API's | Mobiel, IoT |
Veelvoorkomende valkuilen bij verificatie
- Aanval met algoritmeverwarring. Als uw code
alguit het token leest zonder afdwinging, kan een aanvaller het algoritme wijzigen. Valideer altijd dat het algoritme overeenkomt met de verwachte waarde. alg: "none"accepteren. Sommige bibliotheken accepteren onondertekende tokens. Wijsalg: "none"expliciet af.- Afgekapte signature. Een niet-tijdconstante vergelijking kan via timingaanvallen informatie lekken. Gebruik de ingebouwde vergelijking van uw JWT-bibliotheek.
JWT-tokens online verifiëren
Gebruik de JWT-decoder-tool om elk token te decoderen en te valideren. Plak het token, bekijk de header en payload en verifieer de signature door de juiste geheime of openbare sleutel op te geven. Alle verwerking vindt plaats in uw browser.