Skip to content

Gratis JWT-secretgenerator — HS256/384/512

Genereer een sterk, RFC-correct JWT-secret voor HS256/384/512 — 100% in je browser, nooit naar een server gestuurd. base64url, base64 of hex; kopieer voor .env.

Geen tracking Draait in je browser Gratis
Je secret wordt lokaal gegenereerd met crypto.getRandomValues en nooit geüpload, gelogd of opgeslagen. Het blijft op dit apparaat.
16 64

Gelijkwaardige CLI-commando's

Gecontroleerd op RFC 7518 §3.2-sleutellengtecorrectheid, RFC 4648-coderingsnauwkeurigheid over base64url / base64 / hex, CSPRNG-herkomst (crypto.getRandomValues, nooit Math.random), no-network/no-storage-privacy van het gegenereerde secret, en toegankelijkheid (gelabelde besturingselementen, tonen/verbergen-maskering, schermlezer-meldingen bij genereren en kopiëren). — Go Tools Security Tooling Team · Jun 16, 2026

Wat is een JWT-secretgenerator?

Een JWT-secretgenerator produceert de willekeurige ondertekeningssleutel die een HMAC-ondertekende JSON Web Token gebruikt om te bewijzen dat er niet mee is geknoeid. Wanneer je een token ondertekent met HS256, HS384 of HS512, draait het algoritme HMAC over de header en payload van het token met één gedeeld secret; de verifieerder herberekent dezelfde HMAC met hetzelfde secret en accepteert het token alleen als de handtekeningen overeenkomen. De hele beveiliging van dat schema rust op het feit dat het secret lang en onvoorspelbaar is — wat precies is wat deze tool maakt: een willekeurige string met hoge entropie, gegenereerd in je browser, correct gedimensioneerd voor het algoritme dat je kiest.

Het is de moeite waard om precies te zijn over wat deze tool wel en niet doet. Hij genereert de geheime sleutel — de waarde die je in je JWT_SECRET-omgevingsvariabele zet — niet een afgewerkt token. Als je een header en payload wilt samenstellen en ondertekenen tot een echte JWT, is dat het werk van de JWT-encoder; om een bestaand token uit elkaar te halen en de handtekening te verifiëren, gebruik je de JWT-decoder. Zie het secret als de sleutel en de encoder als het slot dat hij bedient: je genereert de sleutel eenmaal, bewaart hem veilig, en hergebruikt hem om vele tokens te ondertekenen en te verifiëren.

Hoe lang moet de sleutel zijn? Het antwoord ligt vast in de spec, niet in voorkeur. RFC 7518 §3.2 — de JSON Web Algorithms-standaard — vereist dat een HMAC-sleutel minstens zo groot is als de hash-uitvoer: "Een sleutel van dezelfde grootte als de hash-uitvoer (bijvoorbeeld 256 bits voor HS256) of groter MOET worden gebruikt." Dat geeft een nette tabel die de generator automatisch volgt:

| Algoritme | HMAC | Min bytes | Min bits | hex chars | base64 chars | base64url chars | |-----------|------|-----------|----------|-----------|--------------|-----------------| | HS256 | HMAC-SHA-256 | 32 | 256 | 64 | 44 | 43 | | HS384 | HMAC-SHA-384 | 48 | 384 | 96 | 64 | 64 | | HS512 | HMAC-SHA-512 | 64 | 512 | 128 | 88 | 86 |

De tekenaantallen komen voort uit de RFC 4648-coderingen van die bytelengtes: hex verdubbelt het aantal bytes; base64 breidt uit met 4⁄3 met padding; base64url laat de padding weg, dus een sleutel van 32 bytes is 43 base64url-tekens in plaats van 44. base64url is JWT's eigen codering — URL-veilig alfabet, geen padding — en daarom is het hier de standaarduitvoer; een secret in base64url kan zonder escaping in een header, een URL of een configuratiewaarde staan.

Willekeurigheid is het deel waarop je geen compromis kunt sluiten. Deze generator trekt zijn bytes uit crypto.getRandomValues, de cryptografisch veilige pseudowillekeurige getallengenerator van de browser, dezelfde primitive die Web Crypto-sleutelgeneratie ondersteunt. Hij gebruikt nooit Math.random, dat snel maar voorspelbaar is en volledig ongeschikt voor een ondertekeningssleutel — een voorspelbare RNG betekent een raadbaar secret, en een raadbaar secret betekent vervalsbare tokens. Omdat HMAC-verificatie lokaal gebeurt met het gedeelde secret, kan een aanvaller die een token vastlegt een zwakke sleutel offline brute-forcen zonder ratelimiet; tools zoals hashcat (modus 16500) en jwt_tool bestaan precies daarvoor. Een willekeurige sleutel van 32 bytes met volledige entropie is daarentegen rekenkundig onbereikbaar. De les is bot: gebruik nooit een wachtwoord, een woordenboekwoord of een met de hand getypte string als JWT-secret — genereer een willekeurige.

Tot slot is het client-side genereren van de sleutel zelf een beveiligingseigenschap. Een ondertekeningssecret mag nooit naar een derde partij worden verzonden, zelfs niet naar de site die je helpt het te maken. Elke byte hier wordt in je browser geproduceerd en gecodeerd; niets wordt geüpload, gelogd of opgeslagen. Wanneer je klaar bent om de sleutel uit te leveren, geeft de knop Kopiëren voor .env je een JWT_SECRET=…-regel, en als je hem in een grotere configuratie moet vouwen kan de JSON-naar-.env-converter helpen. Genereer, kopieer, bewaar het in een secrets manager — en roteer het met een kid-header en overlappende geldigheidsvensters wanneer de tijd daar is.

// The secret you generate here goes straight into your signing code.
// Node.js with jsonwebtoken — the JWT_SECRET env var holds the key.
import jwt from 'jsonwebtoken';

const secret = process.env.JWT_SECRET; // e.g. base64url value from this tool

// Sign a token with HS256 (HMAC-SHA-256).
const token = jwt.sign({ sub: 'user-42', role: 'member' }, secret, {
  algorithm: 'HS256',
  expiresIn: '15m'
});

// Verify it — pin the algorithm to a whitelist; never trust the token's alg.
const payload = jwt.verify(token, secret, { algorithms: ['HS256'] });

// ---------------------------------------------------------------
// Python with PyJWT — same secret, same algorithm pinning.
// import jwt
// token = jwt.encode({"sub": "user-42"}, key, algorithm="HS256")
// payload = jwt.decode(token, key, algorithms=["HS256"])  # whitelist!

// ---------------------------------------------------------------
// Equivalent-strength CLI generation (32 bytes for HS256):
//   openssl rand -base64 32
//   node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
//   python -c "import secrets; print(secrets.token_urlsafe(32))"

Belangrijkste functies

Algoritmebewuste sleutellengte

Kies HS256, HS384 of HS512 en de generator stelt automatisch de minimale sleutelgrootte volgens RFC 7518 §3.2 in — 32, 48 of 64 bytes. Je kunt een langere sleutel aanvragen, maar je kunt nooit per ongeluk een te kleine leveren die de spec schendt of die een strikte bibliotheek weigert te ondertekenen.

Drie tekstveilige uitvoerformaten

Krijg dezelfde willekeurige bytes als base64url (JWT's eigen, URL-veilige codering zonder padding — de standaard), standaard base64, of hex, naast elkaar getoond. base64url is de veiligste standaard voor een JWT_SECRET; wissel van formaat wanneer een specifieke loader of bibliotheek een ander verwacht. De entropie is identiek over alle drie.

Cryptografisch veilige willekeurigheid

Elk secret wordt getrokken uit crypto.getRandomValues, de CSPRNG van de browser en de primitive achter Web Crypto-sleutelgeneratie. Nooit Math.random. Dat garandeert een sleutel met volledige entropie zonder voorspelbare structuur — de eigenschap die het secret buiten het bereik van offline brute force plaatst.

Kopiëren voor .env met één klik

Kopiëren voor .env verpakt de waarde in de gangbare JWT_SECRET=…-toewijzing, één regel, geen aanhalingstekens — klaar om in een .env-bestand, een Docker-secret of een CI-variabele te plakken zonder de sleutelnaam te typen. Gewoon Kopiëren pakt het ruwe secret wanneer je alleen de waarde nodig hebt.

Gelijkwaardige CLI-commando's

Een paneel toont de bijbehorende openssl rand-, Node crypto.randomBytes- en Python secrets-oneliners voor het gekozen algoritme, zodat je een even sterke sleutel in een provisioningscript of een Dockerfile kunt reproduceren. De meeste concurrerende tools laten dit weg; hier is het ingebouwd.

Tonen / verbergen-maskering

Het secret is standaard gemaskeerd zodat het buiten beeld blijft tijdens een demo, een tutorial of een schermdeling. Onthul het met het oogpictogram alleen wanneer je klaar bent om te kopiëren. Kopieeracties plaatsen altijd het echte secret op het klembord, of het nu zichtbaar of verborgen is.

100% privé, alleen in de browser

Het secret wordt volledig op je apparaat gegenereerd, gecodeerd en weergegeven. Geen netwerkverzoeken, geen logging, geen opslag — controleer het in DevTools → Netwerk. Een ondertekeningssleutel mag nooit een derde partij bereiken, en hier doet hij dat nooit, wat de hele reden is om hem aan de clientzijde te genereren.

Beschikbaar in 15 talen

De volledige interface — labels, instructies en uitleg — is gelokaliseerd in 15 talen, zodat de tool bruikbaar is en het beveiligingsadvies duidelijk is, waar je team ook werkt.

Uitgewerkte voorbeelden

Genereer een HS256-secret in base64url (de standaard)

Algoritme: HS256 · Formaat: base64url
3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

HS256 ondertekent met HMAC-SHA-256, dus RFC 7518 §3.2 vereist een sleutel van minstens 32 bytes (256 bits). De generator trekt 32 cryptografisch veilige willekeurige bytes uit crypto.getRandomValues en codeert ze als base64url — het URL-veilige alfabet zonder padding dat JWT zelf gebruikt. 32 bytes worden een base64url-string van 43 tekens. Plaats de waarde rechtstreeks in JWT_SECRET. Elke klik genereert een nieuw secret; niets is ooit twee keer hetzelfde.

Genereer een HS512-secret (64 bytes / 512 bits)

Algoritme: HS512 · Formaat: base64url
k2Lp9XqA0mNbVcZ7rT4wYsHfGjUe8RoIdPlNkBvM3xQ1aWtCyZuS6FhEgJ (86 chars)

HS512 gebruikt HMAC-SHA-512, waarvan de hash-uitvoer 64 bytes is, dus RFC 7518 §3.2 vereist een sleutel van minstens 64 bytes (512 bits). De tool herkent het algoritme en verhoogt het aantal bytes automatisch — je hoeft het minimum nooit te onthouden. 64 willekeurige bytes coderen naar een base64url-string van 86 tekens, 88 tekens in standaard base64, of 128 hex-tekens. Hier een langer algoritme kiezen is de manier om met één klik een secret met hogere entropie te leveren.

Kopieer het secret als een .env-regel

Klik op "Kopiëren voor .env"
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

Kopiëren voor .env verpakt de gegenereerde waarde in de gangbare JWT_SECRET=…-toewijzing, zodat je hem rechtstreeks in een .env-bestand, een Docker-secret of een CI-variabele kunt plakken zonder de sleutelnaam te typen. De waarde blijft op één regel zonder omringende aanhalingstekens — precies wat dotenv-achtige loaders verwachten. Moet de variabele in een bredere configuratie worden ingebed? Combineer dit met de hieronder gelinkte JSON-naar-.env-converter.

Reproduceer het secret vanaf een CLI (gelijkwaardige sterkte)

Toon het CLI-commando
openssl rand -base64 32

Het CLI-paneel toont de openssl-, Node- en Python-commando's die hetzelfde aantal veilige willekeurige bytes voor het gekozen algoritme trekken — openssl rand -base64 32 voor HS256, …48 voor HS384, …64 voor HS512. De uitvoer is een even sterk secret, geen byte-voor-byte identieke string: openssl geeft standaard base64 met padding uit, terwijl deze tool standaard base64url gebruikt, dus de alfabetten en eindtekens verschillen. Gebruik wat in je provisioningscript past; de entropie is dezelfde.

Toon en verberg het secret

Klik op het oogpictogram
•••••••••••••••••••••••••••••••••••••••••••  ↔  3sJ9aFq2kP7m…

Het secret is standaard gemaskeerd, zodat het niet over je schouder kan worden meegelezen of door een schermopname tijdens een demo of schermdeling kan worden vastgelegd. Klik op het oogpictogram om het te onthullen wanneer je klaar bent om te kopiëren, en verberg het daarna weer. Kopiëren en Kopiëren voor .env werken of de waarde nu zichtbaar of gemaskeerd is — wat op je klembord belandt is altijd het echte secret, nooit de puntjes.

De JWT-secretgenerator gebruiken

  1. 1

    Kies het ondertekeningsalgoritme

    Selecteer HS256, HS384 of HS512. De generator past meteen de minimale sleutellengte volgens RFC 7518 §3.2 voor die HMAC-variant toe — 32, 48 of 64 bytes — zodat je het getal nooit hoeft op te zoeken of een te kleine sleutel riskeert.

  2. 2

    Kies het uitvoerformaat

    base64url is de standaard — JWT's eigen URL-veilige codering zonder padding. Schakel naar standaard base64 als een loader het verwacht, of hex wanneer een systeem alleen 0–f-tekens accepteert. Alle drie coderen dezelfde willekeurige bytes met identieke entropie.

  3. 3

    Onthul en kopieer het secret

    Het secret is standaard gemaskeerd om het buiten beeld te houden tijdens een demo of schermdeling. Klik op het oogpictogram om het te onthullen, gebruik dan Kopiëren om de ruwe waarde te pakken of Kopiëren voor .env om een JWT_SECRET=…-regel te kopiëren die klaar is voor een .env-bestand of CI-variabele.

  4. 4

    Genereer opnieuw indien nodig

    Klik op Opnieuw genereren voor een nieuw, onafhankelijk secret uit crypto.getRandomValues. Genereer er één per omgeving — hergebruik nooit dezelfde ondertekeningssleutel over ontwikkeling, staging en productie.

  5. 5

    Gebruik het CLI-equivalent of ga door naar ondertekenen

    Het CLI-paneel toont de bijbehorende openssl-, Node- en Python-oneliners voor scriptmatige provisioning. Met je secret in de hand onderteken je een token met de JWT-encoder en bevestig je de handtekening met de JWT-decoder.

Veelvoorkomende JWT-secret-fouten

Een wachtwoord of korte zin als secret gebruikt

Een door mensen gekozen string heeft veel te weinig entropie voor een ondertekeningssleutel en kan offline worden achterhaald met een woordenboek- of brute-force-aanval, waarna elk token kan worden vervalst. Genereer in plaats daarvan een willekeurig secret met volledige entropie.

✗ Fout
JWT_SECRET=mySuperSecret123  →  low entropy, brute-forceable
✓ Correct
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0  →  32 random bytes

Sleutel korter dan het algoritme vereist

RFC 7518 §3.2 vereist een HMAC-sleutel die minstens zo lang is als de hash-uitvoer. Een sleutel van 16 bytes voor HS256 ligt onder de vloer van 32 bytes — hij verzwakt de handtekening en sommige bibliotheken wijzen hem ronduit af.

✗ Fout
16-byte key with HS256  →  below the 32-byte minimum
✓ Correct
32-byte key with HS256  →  meets RFC 7518 §3.2

De sleutel met Math.random gegenereerd

Math.random is niet cryptografisch veilig — de uitvoer is voorspelbaar, dus een secret dat ermee is gebouwd is raadbaar en de tokens die het ondertekent zijn vervalsbaar. Een ondertekeningssleutel moet uit een CSPRNG zoals crypto.getRandomValues komen.

✗ Fout
Math.random()-based key  →  predictable, unsafe
✓ Correct
crypto.getRandomValues key  →  full entropy

Het secret hercodeerd vóór het ondertekenen

Bewaar en voer de exacte string in die de tool produceerde. Het base64-decoderen tot bytes in de ene service maar als letterlijke string behandelen in de andere geeft de twee kanten verschillende sleutels, en elke handtekeningcontrole faalt.

✗ Fout
Service A: raw string · Service B: base64-decoded  →  signatures never match
✓ Correct
Both services use the identical stored string  →  signatures verify

Hetzelfde secret over alle omgevingen hergebruikt

Eén JWT_SECRET gedeeld door dev, staging en productie betekent dat een lek ergens overal tokens vervalst en rotatie alles-of-niets wordt. Lever een apart secret per omgeving.

✗ Fout
Same JWT_SECRET in dev, staging, prod  →  one leak breaks all
✓ Correct
A unique secret per environment  →  blast radius contained

Het alg van het token vertrouwd bij verificatie

De verifieerder laten accepteren welk algoritme het token ook declareert, maakt alg:none- en HS/RS-confusion-vervalsingen mogelijk. Geef een expliciete algoritme-whitelist mee, hoe sterk het secret ook is.

✗ Fout
jwt.verify(token, secret)  →  accepts the token's alg
✓ Correct
jwt.verify(token, secret, { algorithms: ['HS256'] })  →  pinned

Wie gebruikt deze tool

Een JWT_SECRET voor een nieuwe service leveren
Een API opzetten die HMAC-ondertekende tokens uitgeeft? Kies het algoritme dat je bibliotheek gebruikt, kopieer het secret als een JWT_SECRET=…-regel, en plaats het in de omgeving van de service. Genereer een aparte sleutel voor ontwikkeling, staging en productie — deel nooit één secret over omgevingen.
Een gecompromitteerd of verouderd secret roteren
Wanneer een sleutel vermoedelijk is gelekt of simpelweg toe is aan rotatie, genereer je hier een nieuw secret, ken je het een nieuwe kid toe, en rol je het uit met een overlapvenster zodat live tokens blijven verifiëren tot ze verlopen. Bij een bevestigde compromittering roteer je meteen en verwijder je de oude sleutel uit de geaccepteerde set.
Een zwakke of met de hand getypte sleutel vervangen
Een codebase geërfd waarvan de JWT_SECRET een korte zin of een gekopieerde voorbeeldwaarde is? Die sleutel is offline brute-forcebaar. Genereer een vervanging van 32 bytes met volledige entropie, wissel hem in achter een rotatievenster, en sluit het gat voor tokenvervalsing voordat het wordt uitgebuit.
Sleutelgeneratie scripten in een pipeline
Moet de sleutel in CI of een Dockerfile worden gemaakt in plaats van met de hand? Gebruik de openssl-, Node- of Python-oneliner uit het CLI-paneel om een even sterk secret in je provisioningscript aan te maken, en gebruik deze pagina om de bytelengtes en coderingen te begrijpen die elk commando produceert.
JWT-ondertekening veilig onderwijzen
Loop een team door hoe HS256 werkt zonder ooit een echte productiesleutel bloot te stellen — genereer een wegwerpsecret op het scherm (gemaskeerd tot je het onthult), onderteken een voorbeeldtoken met de JWT-encoder, en verifieer het met de JWT-decoder zodat de hele onderteken-en-verifieer-lus zichtbaar is.
HS256-, HS384- en HS512-sleutelgroottes vergelijken
Beslissen op welke HMAC-variant je standaardiseert? Wissel tussen de algoritmen om te zien hoe de vereiste sleutellengte en gecodeerde string groeien — 43, 64 en 86 base64url-tekens — en kies de afweging tussen sterkte en tokengrootte die bij je systeem past voordat je hem in de configuratie vastlegt.
Sleutels genereren voor lokale ontwikkeling
Een snel, geldig secret nodig om een lokale auth-flow draaiende te krijgen? Genereer er een met een klik, kopieer het voor .env, en je bent gedeblokkeerd — met een echte CSPRNG-sleutel in plaats van een placeholder die je voor de deploy vergeet te vervangen.

Hoe de generator werkt

crypto.getRandomValues (CSPRNG)
Secrets worden gegenereerd door een Uint8Array te vullen met crypto.getRandomValues, de cryptografisch veilige pseudowillekeurige getallengenerator van Web Crypto. Het is dezelfde entropiebron die Web Crypto-sleutelgeneratie ondersteunt. Math.random wordt nergens gebruikt — het is statistisch voorspelbaar en ongeschikt voor elke cryptografische sleutel.
RFC 7518 §3.2-sleuteldimensionering
Het aantal bytes per algoritme volgt de JSON Web Algorithms-eis dat een HMAC-sleutel minstens zo groot is als de hash-uitvoer: 32 bytes voor HS256 (SHA-256), 48 voor HS384 (SHA-384), 64 voor HS512 (SHA-512). Het selecteren van het algoritme stelt het minimum in; de generator geeft geen sleutel onder de specvloer uit.
RFC 4648-coderingen (base64url / base64 / hex)
De ruwe bytes worden gecodeerd met de RFC 4648-alfabetten. base64url gebruikt het URL-veilige alfabet zonder padding (32 bytes → 43 tekens), standaard base64 gebruikt +, / en =-padding (→ 44 tekens), en hex schrijft twee tekens per byte (→ 64 tekens). Van formaat wisselen hercodeert dezelfde bytes — de onderliggende entropie blijft onveranderd.
Waarom base64url de standaard is
JWT-componenten zijn zelf base64url-gecodeerd, en het URL-veilige alfabet zonder padding betekent dat een secret in base64url nooit hoeft te worden ge-escaped in een header, een URL of een configuratiebestand. De + en / en de eind-= van standaard base64 kunnen in die contexten breken, dus base64url is de behoudende standaard voor een JWT_SECRET.
Opmaak van Kopiëren voor .env
Kopiëren voor .env geeft JWT_SECRET= uit op één regel zonder omringende aanhalingstekens — de vorm die dotenv-achtige loaders zonder aanpassing parsen. Het ruwe secret bevat nooit tekens die in een .env-bestand aanhalingstekens zouden vereisen, dus de regel is veilig om as-is te plakken.
Gelijkwaardig sterke CLI-commando's, niet byte-identiek
De openssl rand -base64 N-, Node randomBytes(N).toString('base64url')- en Python secrets.token_urlsafe(N)-commando's uit het CLI-paneel trekken alle N veilige willekeurige bytes voor het gekozen algoritme. Ze produceren even sterke sleutels, niet dezelfde string — openssl geeft gepadde standaard base64 uit, dus het alfabet en de eindtekens verschillen van de base64url-standaard van deze tool.

Best practices voor JWT-secrets

Stem de sleutellengte af op het algoritme
Gebruik minstens 32 bytes voor HS256, 48 voor HS384 en 64 voor HS512, zoals RFC 7518 §3.2 vereist. Deze generator doet het voor je, maar als je een sleutel met de hand dimensioneert, ga dan nooit onder de hash-uitvoerlengte — een te kleine HMAC-sleutel verzwakt de handtekening en kan door strikte bibliotheken worden afgewezen.
Genereer altijd met een CSPRNG, nooit een wachtwoord
Een JWT-secret is een machine-inloggegeven dat niemand hoeft te onthouden, dus besteed de volledige entropie: gebruik een cryptografisch veilige willekeurige sleutel, geen wachtwoordzin, woordenboekwoord of met de hand getypte string. Door mensen gekozen secrets zijn het makkelijkste doelwit voor de offline brute-force-aanvallen die JWT-kraaktools automatiseren.
Gebruik een uniek secret per omgeving
Ontwikkeling, staging en productie zouden elk hun eigen JWT_SECRET moeten hebben. Eén sleutel delen betekent dat een lek in een omgeving met lage inzet overal tokens vervalst, en het maakt rotatie alles-of-niets. Genereer hier een apart secret voor elke omgeving en bewaar elk in zijn eigen secrets-manager-scope.
Pin het algoritme wanneer je verifieert
Geef aan de verifiërende kant altijd een expliciete algoritme-whitelist mee — algorithms: ['HS256'] in jsonwebtoken, algorithms=["HS256"] in PyJWT — en vertrouw nooit het alg-veld in het token. Het zelf-gedeclareerde algoritme van het token accepteren maakt de klassieke alg-confusion- en alg:none-vervalsingsaanvallen mogelijk, hoe sterk je secret ook is.
Roteer met een kid-header en overlappende sleutels
Voorzie ondertekende tokens van een sleutel-identificator (kid) en publiceer actieve sleutels via een JWKS-endpoint, zodat je zonder downtime kunt roteren: onderteken nieuwe tokens met de nieuwe sleutel terwijl je de oude nog accepteert tot zijn tokens verlopen. Bij een vermoede compromittering sla je de overlap over en trek je de oude sleutel meteen in.

Veelgestelde vragen

Wordt mijn gegenereerde JWT-secret naar jullie server gestuurd?
Nee. Het secret wordt volledig in je browser gegenereerd met crypto.getRandomValues, de cryptografisch veilige generator voor willekeurige getallen van het platform. De bytes worden op je apparaat geproduceerd, lokaal gecodeerd en alleen aan jou getoond. Er wordt niets geüpload, niets gelogd, niets naar schijf geschreven en niets naar een derde partij gestuurd — open DevTools → Netwerk en je ziet nul verzoeken vertrekken wanneer je op Opnieuw genereren of Kopiëren klikt. Dat betekent dat een sleutel die je hier genereert vanaf het moment dat hij verschijnt alleen van jou is; geen enkele server ziet hem ooit. Dit is precies het punt van het genereren van een ondertekeningssecret aan de clientzijde in plaats van op een website die in principe een kopie van elke uitgegeven sleutel zou kunnen bewaren.
Hoe genereer ik een veilig JWT-secret?
Drie stappen. Kies eerst het ondertekeningsalgoritme dat je applicatie gebruikt — HS256, HS384 of HS512 — en de generator stelt de sleutel meteen in op het RFC 7518 §3.2-minimum voor die variant (32, 48 of 64 bytes), zodat je nooit zelf een getal kiest of een te kleine sleutel riskeert. Laat ten tweede de codering op base64url staan (JWT's eigen, URL-veilige formaat) of schakel naar base64 of hex als je configuratieloader een van die verwacht. Klik ten derde op Kopiëren — of Kopiëren voor .env voor een kant-en-klare JWT_SECRET=…-regel — en bewaar de waarde in een secrets manager of omgevingsvariabele, nooit in versiebeheer. Omdat elke byte uit crypto.getRandomValues komt, draagt een sleutel van 32 bytes al 256 bits entropie, ver buiten het bereik van de offline brute-force-aanvallen die door mensen gekozen secrets breken. Liever de commandoregel? De tool toont ook gelijkwaardige openssl-, Node- en Python-oneliners die je in een terminal kunt plakken.
Hoe lang moet een HS256 JWT-secret zijn?
Minstens 32 bytes (256 bits). RFC 7518 §3.2 — de JSON Web Algorithms-spec — stelt dat voor HMAC-handtekeningen "een sleutel van dezelfde grootte als de hash-uitvoer (bijvoorbeeld 256 bits voor HS256) of groter MOET worden gebruikt." HS256 ondertekent met HMAC-SHA-256 (256-bit hash), dus de minimale sleutel is 32 bytes; HS384 gebruikt HMAC-SHA-384 en heeft minstens 48 bytes (384 bits) nodig; HS512 gebruikt HMAC-SHA-512 en heeft minstens 64 bytes (512 bits) nodig. Deze generator kiest het juiste minimum automatisch wanneer je het algoritme kiest, en je kunt een langere sleutel aanvragen. Een kortere sleutel is niet alleen zwakker — hij schendt de spec, en sommige bibliotheken weigeren ermee te ondertekenen.
Wat is het verschil tussen base64url, base64 en hex, en welke moet ik kiezen?
Alle drie coderen ze dezelfde willekeurige bytes; ze verschillen alleen in het tekenalfabet, niet in entropie. base64url is JWT's eigen codering — het gebruikt een URL-veilig alfabet (- en _ in plaats van + en /) en laat padding weg, zodat het nooit hoeft te worden ge-escaped in een token, een URL of een header. Daarom is het hier de standaard. Standaard base64 gebruikt +, / en =-padding; kies het wanneer een configuratieloader of bibliotheek specifiek klassieke base64 verwacht. hex (base16) schrijft elke byte als twee tekens 0–f, wat een langere maar ondubbelzinnige string oplevert die handig is wanneer een systeem niet-alfanumerieke tekens weigert. Voor een JWT_SECRET-omgevingsvariabele is base64url de veiligste standaard; elk van de drie werkt zolang je de exacte string bewaart en die ongewijzigd terugvoert aan je ondertekeningsbibliotheek.
Kan een zwak JWT-secret worden gekraakt?
Ja — en dit is het allergrootste risico bij HMAC-ondertekende JWT's. Omdat HS256/384/512 één gedeeld secret gebruiken, kan iedereen die een token bezit een offline brute-force- of woordenboekaanval op de handtekening uitvoeren, zonder ratelimiet en zonder servercontact. Tools zoals hashcat (modus 16500 richt zich op JWT) en jwt_tool zijn hier speciaal voor gebouwd; op gangbare GPU's kan een secret met lage entropie doorgaans in seconden tot uren vallen, en een woordenboekwoord of een gelekt wachtwoord kan vrijwel meteen vallen. Een willekeurige sleutel van 32 bytes met volledige entropie uit deze generator is ver buiten het bereik van brute force. Zodra een aanvaller het secret achterhaalt, kan hij elk token vervalsen — ook een dat beheerdersrechten claimt — dus de sterkte van het secret is niet optioneel. Genereer de ondertekeningssleutel met een CSPRNG, nooit een door mensen gekozen string. Voor een diepere behandeling van zwak-secret-, alg-confusion- en token-replay-aanvallen, zie onze gids over JWT-beveiligingsbest practices.
Kan ik een wachtwoord als mijn JWT-secret gebruiken?
Het kan, maar je zou het niet moeten doen. Een voor mensen te onthouden wachtwoord — zelfs een lange wachtwoordzin — draagt veel minder entropie dan 32 willekeurige bytes, wat het een realistisch doelwit maakt voor de hierboven beschreven offline brute-force- en woordenboekaanvallen. JWT-secrets zijn machine-naar-machine-inloggegevens; niemand hoeft ze te onthouden, dus er is geen reden om entropie in te ruilen voor onthoudbaarheid. Genereer hier een willekeurig secret, bewaar het in een secrets manager of een omgevingsvariabele, en laat je applicatie het lezen. Als je voor een ander doel onthoudbare inloggegevens nodig hebt, is dat werk voor een wachtwoordgenerator of, voor het opslaan van gebruikerswachtwoorden, een eenrichtingshash uit de bcrypt-generator — niet voor een token-ondertekeningssleutel.
Hoe roteer ik een JWT-secret zonder live tokens te breken?
Roteer met overlap in plaats van een harde omschakeling. Voeg een sleutel-identificator (de kid-header) toe aan de tokens die je ondertekent, zodat een verifieerder weet tegen welk secret hij moet controleren, en publiceer je actieve sleutels — doorgaans via een JWKS-endpoint dat je services uitlezen. Om te roteren: genereer hier een nieuw secret, begin nieuwe tokens te ondertekenen met de nieuwe kid terwijl je de vorige sleutel nog accepteert voor verificatie, en trek de oude sleutel pas terug nadat elk token dat ermee is ondertekend is verlopen. Dat overlapvenster betekent dat geen geldige sessie halverwege ongeldig wordt. Bij een vermoede compromittering sla je de soepele overlap over: roteer meteen, verwijder de oude sleutel uit de geaccepteerde set, en forceer herauthenticatie zodat gelekte tokens onmiddellijk niet meer verifiëren.
Hoe verschilt een HMAC-sleutel (HS*) van een RSA- of ECDSA-sleutel (RS*/ES*)?
Ze lossen hetzelfde probleem op met tegengestelde sleutelmodellen. HS256/384/512 zijn HMAC-algoritmen: ze gebruiken één symmetrisch secret — het soort dat deze tool genereert — dat zowel ondertekent als verifieert, dus elke partij die een token kan verifiëren kan er ook een vervalsen. Dat is eenvoudig en snel en ideaal wanneer één service zowel zijn eigen tokens uitgeeft als controleert. RS* (RSA) en ES* (ECDSA) zijn asymmetrisch: ze gebruiken een sleutelpaar, waarbij een privésleutel ondertekent en een aparte publieke sleutel alleen verifieert. Je geeft de publieke sleutel aan iedereen die tokens moet valideren zonder ooit de ondertekeningssleutel bloot te stellen — de juiste keuze wanneer een identity provider tokens uitgeeft die veel onafhankelijke services verifiëren. Deze generator produceert alleen HMAC-symmetrische secrets. Gebruik de JWT-encoder om met de gegenereerde sleutel een echt token samen te stellen en te ondertekenen; gebruik de JWT-decoder om er een te inspecteren en te verifiëren.

Gerelateerde tools

Alle tools bekijken →