Utilia

JWT-decoder

Decodeer de header en payload van een JWT, lees exp, iat en nbf als datum en verifieer HS256-, RS256-, ES256- of EdDSA-handtekeningen in je browser.

Tokens zijn inloggegevens. Deze tool decodeert en verifieert ze in je browser en verstuurt ze nergens naartoe.

De handtekening verifiëren

HS256/384/512: voer het gedeelde geheim in. RS, PS, ES (256/384/512) en EdDSA: plak de publieke sleutel als PEM (publieke sleutel, publieke RSA-sleutel of certificaat) of als JWK (in een JWK Set wordt de sleutel op kid gekozen).

Zo decodeer je een JWT

  1. Plak het token in het veld JSON Web Token. Een volledige waarde Authorization: Bearer … werkt ook: het voorvoegsel Bearer en eventuele regeleinden worden verwijderd.
  2. Het token wordt gedecodeerd terwijl je typt (of klik op Decoderen). De Header en de Payload verschijnen als opgemaakte JSON, elk met een eigen knop Kopiëren.
  3. Bekijk de tabel Tijdclaims: exp, nbf en iat worden getoond met hun ruwe waarde, de datum in jouw tijdzone, een relatieve tijd (“over 3 uur”, “2 dagen geleden”) en een status zoals Verlopen of Nog niet geldig.
  4. Lees de waarschuwingen boven de resultaten, bijvoorbeeld wanneer alg op none staat of wanneer een datum eruitziet als milliseconden.
  5. Wil je de handtekening controleren, vul dan de sleutel in onder De handtekening verifiëren en klik op Handtekening verifiëren.

Decoderen is niet verifiëren

Een JWT bestaat uit drie Base64url-delen, gescheiden door punten: header.payload.signature. De header en de payload zijn alleen gecodeerd, niet versleuteld. Iedereen die het token heeft, kan ze dus lezen, en deze tool kan elk token zonder sleutel decoderen. Dat betekent ook dat een gedecodeerde payload niets bewijst: iemand kan hem hebben aangepast. Alleen een geldige handtekening laat zien dat het token is uitgegeven door de houder van de sleutel en sindsdien niet is gewijzigd. Daarom staat er in de statusregel “Gedecodeerd (handtekening niet geverifieerd).” zolang je de handtekening niet hebt gecontroleerd.

Een token met vijf delen is een JWE (een versleutelde JWT). De inhoud ervan is niet te lezen zonder de ontsleutelingssleutel, en de tool meldt dat ook.

De handtekening verifiëren

  • HS256, HS384, HS512 (HMAC): voer het gedeelde Geheim in. Geef bij Formaat van het geheim aan of het gewone tekst (UTF-8) is of Base64/Base64url, want sommige providers bewaren geheimen in Base64. Je kunt ook een JWK van het type oct plakken. Is het geheim korter dan de hashuitvoer (32 bytes voor HS256), dan meldt de tool dat het onder het minimum van RFC 7518 blijft.
  • RS256/384/512, PS256/384/512, ES256/384/512 en EdDSA: plak de Publieke sleutel (PEM of JWK). Geaccepteerde PEM-blokken zijn PUBLIC KEY, RSA PUBLIC KEY en CERTIFICATE (de sleutel wordt dan uit het X.509-certificaat gehaald). Een JWK of een volledige JWK Set werkt ook: de sleutel waarvan de kid overeenkomt met de header wordt gebruikt. Privésleutels worden geweigerd; om te verifiëren heb je die nooit nodig. EdDSA ondersteunt Ed25519 in browsers waarvan Web Crypto dat implementeert.

De verificatie gebruikt de Web Crypto API van je browser. De melding “Ongeldige handtekening” betekent dat de sleutel niet klopt of dat het token is gewijzigd. Let op: het algoritme wordt uit de header van het token gehaald. Een echte server moet het verwachte algoritme juist vastleggen in zijn configuratie, anders kan een aanvaller het zelf kiezen.

Beveiligingstips

  • Tokens zijn inloggegevens. Wie een geldig access token heeft, kan meestal namens de eigenaar handelen tot het verloopt. Deze tool decodeert en verifieert alles in je browser en stuurt het token of de sleutel nergens naartoe. Plak productietokens toch liever niet in tools die je niet kunt controleren.
  • alg: none betekent dat het token niet ondertekend is. Iedereen kan zo’n token vervalsen en een server moet het weigeren. De tool toont een waarschuwing en weigert zo’n token te “verifiëren”.
  • Tijdcontroles gebruiken hier de klok van je computer, zonder speling. Servers staan vaak een minuut of twee klokverschil toe.
  • JWT-datums (NumericDate) zijn seconden sinds 1 januari 1970 UTC. Een waarde van 13 cijfers staat waarschijnlijk in milliseconden, een veelvoorkomende bug.

Veelgestelde vragen

Kan deze tool zeggen of een token geldig is?

De tool zegt of de handtekening klopt met een sleutel die jij opgeeft en of exp en nbf op dit moment in orde zijn. Of het token echt geaccepteerd wordt, hangt ook af van controles die alleen de server kent: de verwachte uitgever (iss), het publiek (aud), het algoritme en intrekking.

Waarom mislukt de verificatie terwijl het geheim klopt?

Controleer het Formaat van het geheim: een Base64-geheim dat als tekst wordt gelezen, levert een andere sleutel op. Zorg er ook voor dat er geen spatie of regeleinde aan het geheim is toegevoegd, want HMAC-sleutels worden byte voor byte vergeleken.

Wat is het verschil tussen RS256, PS256 en ES256?

Alle drie zijn handtekeningen met een publieke sleutel en SHA-256. RS256 gebruikt RSA met PKCS#1 v1.5-padding, PS256 gebruikt RSA met PSS-padding en ES256 gebruikt ECDSA op de P-256-curve, wat veel kortere handtekeningen geeft.

Waar vind ik de publieke sleutel van een provider?

Identiteitsproviders publiceren een JWKS (JSON Web Key Set), meestal gelinkt vanuit /.well-known/openid-configuration onder jwks_uri. Open die zelf en plak de JSON hier; de tool kiest de sleutel op kid en haalt zelf nooit iets op.

Is het veilig om mijn token hier te plakken?

Het token blijft op je apparaat: decoderen en verifiëren gebeuren lokaal en er wordt niets geüpload. Wil je extra voorzichtig zijn, gebruik dan een verlopen token of een testtoken als je alleen de structuur wilt bekijken.