Utilia

JWT-generator en -verifier

Maak en verifieer JSON Web Tokens met HS256, RS256, PS256, ES256 of EdDSA. Bewerk claims, stel exp en iat in en controleer handtekeningen in je browser.

Sleutels en tokens zijn geheimen. Alles wordt lokaal ondertekend en geverifieerd met de Web Crypto API van je browser: er wordt niets geüpload.

Een ondertekende JWT maken

Tijdclaims:

Een JWT verifiëren

Zo maak je een ondertekende JWT

  1. Kies het Algoritme: HS256/384/512 (gedeeld geheim), RS256/384/512 of PS256/384/512 (RSA), ES256/384/512 (ECDSA op P-256, P-384 of P-521) of EdDSA (Ed25519, als je browser dat ondersteunt).
  2. Bewerk de Header (JSON) en de Payload (JSON-claims). Het veld alg volgt altijd het gekozen algoritme en typ staat standaard op JWT.
  3. Voeg datums toe met de knoppen voor tijdclaims: iat = nu, nbf = nu, of kies een Geldigheidsduur zoals “over 1 uur” en klik op exp instellen. De waarden zijn NumericDates: seconden sinds 1 januari 1970 UTC.
  4. Voer het Geheim in (bij HS-algoritmen, als tekst of als Base64/Base64url via Formaat van het geheim) of de Privésleutel (PEM of JWK). Nog geen sleutel? Klik op Testsleutel genereren.
  5. Klik op Token ondertekenen en daarna op Kopiëren, of klik op Dit token verifiëren om het meteen te controleren.

Zo verifieer je een JWT

  1. Plak het token in het veld Te verifiëren token.
  2. Kies het Verwacht algoritme. Laat je dit op “Uit de header van het token” staan, dan wordt geaccepteerd wat de header zegt, behalve none. Kies je een specifiek algoritme, dan weigert de tool elk token dat anders is ondertekend, zoals een echte server ook hoort te doen.
  3. Voer het geheim in, of de Publieke sleutel (PEM of JWK): een PEM-blok PUBLIC KEY, RSA PUBLIC KEY of CERTIFICATE, een JWK of een JWK Set (de sleutel waarvan de kid overeenkomt met de header wordt gebruikt).
  4. Stel eventueel een Klokspeling (seconden) in om kleine klokverschillen te tolereren en klik op Token verifiëren.

Het resultaat zegt of de handtekening geldig is en controleert daarna exp (vervaltijd) en nbf (niet geldig vóór) tegen de huidige tijd van je computer. Een token met een correcte handtekening maar een vervaldatum in het verleden wordt als verlopen gemeld, niet als geldig.

Sleutels en formaten

Om te ondertekenen accepteert de tool PKCS#8-blokken PRIVATE KEY, PKCS#1-blokken RSA PRIVATE KEY en SEC1-blokken EC PRIVATE KEY (die intern naar PKCS#8 worden omgezet), en private JWK’s. Sleutels met een wachtwoord moet je eerst zonder wachtwoord exporteren. Testsleutel genereren maakt een willekeurig geheim ter grootte van de hash voor HS-algoritmen, een RSA-sleutelpaar van 2048 bits voor RS en PS, een sleutel op de bijbehorende curve voor ES, of een Ed25519-paar. Je krijgt de sleutels als PEM en als JWK, en ze worden aan beide kanten ingevuld, zodat ondertekenen en verifiëren meteen werkt.

De handtekeningen volgen RFC 7515 en RFC 7518: RSA-PSS gebruikt een salt die even lang is als de hash, en ECDSA-handtekeningen zijn de ruwe aaneenschakeling r||s. De implementatie reproduceert het HS256-voorbeeld uit RFC 7515, bijlage A.1.

Beveiligingstips

  • Alles draait in je browser met de Web Crypto API. Tokens en sleutels worden nergens naartoe gestuurd, maar gebruik toch liever testsleutels dan productiegeheimen.
  • alg: none wordt nooit ondertekend en nooit geaccepteerd.
  • HMAC-geheimen moeten minstens zo lang zijn als de hash (32 bytes voor HS256). Een korter geheim geeft een waarschuwing.
  • Een handtekening bewijst integriteit en herkomst, niet dat de claims kloppen: servers moeten ook iss, aud en de scopes controleren.

Veelgestelde vragen

Wat is het verschil tussen HS256 en RS256?

HS256 gebruikt één gedeeld geheim om zowel te ondertekenen als te verifiëren, dus elke partij die verifieert, kan ook tokens vervalsen. RS256 (en PS256, ES256, EdDSA) ondertekent met een privésleutel en verifieert met een publieke sleutel die je zonder risico kunt publiceren.

Waarom geeft een geldige handtekening toch een fout?

Omdat het token buiten zijn geldigheidsperiode valt: exp ligt in het verleden of nbf in de toekomst. De controle van de handtekening en die van de tijd worden apart gemeld.

Waarom wordt alg “none” geweigerd?

Een niet-ondertekend token kan iedereen maken. Het accepteren ervan was een klassiek beveiligingslek in JWT-bibliotheken, daarom weigert deze tool het zowel bij het ondertekenen als bij het verifiëren.

Kan ik mijn eigen RSA- of EC-sleutel gebruiken?

Ja. Plak de privésleutel als PEM of JWK om te ondertekenen en de publieke sleutel om te verifiëren. De tool controleert of het sleuteltype en de curve bij het gekozen algoritme passen.

Waarom is EdDSA uitgeschakeld?

Je browser ondersteunt Ed25519 nog niet in Web Crypto. Recente versies van Chrome, Edge, Firefox en Safari doen dat wel.