Skip to content

JWT-Secret-Generator — HS256/384/512

Erzeuge ein starkes, RFC-konformes JWT-Secret für HS256/384/512 — 100 % im Browser, nie an einen Server gesendet. base64url, base64 oder hex; für .env kopieren.

Kein Tracking Läuft im Browser Kostenlos
Dein Secret wird lokal mit crypto.getRandomValues erzeugt und nie hochgeladen, geloggt oder gespeichert. Es bleibt auf diesem Gerät.
16 64

Äquivalente CLI-Befehle

Geprüft auf RFC-7518-§3.2-Korrektheit der Schlüssellänge, RFC-4648-Codierungsgenauigkeit über base64url / base64 / hex, CSPRNG-Quelle (crypto.getRandomValues, nie Math.random), Privatsphäre des erzeugten Secrets ohne Netzwerk/ohne Speicherung und Barrierefreiheit (beschriftete Bedienelemente, Anzeigen/Verbergen-Maskierung, Screenreader-Ansagen bei Erzeugung und Kopie). — Go Tools Security Tooling Team · Jun 16, 2026

Was ist ein JWT-Secret-Generator?

Ein JWT-Secret-Generator erzeugt den zufälligen Signierschlüssel, mit dem ein HMAC-signiertes JSON Web Token beweist, dass es nicht manipuliert wurde. Wenn du ein Token mit HS256, HS384 oder HS512 signierst, führt der Algorithmus HMAC über Header und Payload des Tokens aus, unter Verwendung eines einzigen gemeinsamen Secrets; der Prüfer berechnet denselben HMAC mit demselben Secret neu und akzeptiert das Token nur, wenn die Signaturen übereinstimmen. Die gesamte Sicherheit dieses Verfahrens beruht darauf, dass das Secret lang und unvorhersehbar ist — genau das erzeugt dieses Tool: eine zufällige Zeichenkette mit hoher Entropie, in deinem Browser erzeugt und korrekt für den von dir gewählten Algorithmus dimensioniert.

Es lohnt sich, genau zu sein, was dieses Tool tut und was nicht. Es erzeugt den geheimen Schlüssel — den Wert, den du in deine JWT_SECRET-Umgebungsvariable einträgst — nicht ein fertiges Token. Wenn du einen Header und eine Payload zusammenbauen und sie zu einem tatsächlichen JWT signieren willst, ist das die Aufgabe des JWT-Kodierers; um ein bestehendes Token zu zerlegen und seine Signatur zu prüfen, nutze den JWT-Dekodierer. Stell dir das Secret als Schlüssel und den Kodierer als das Schloss vor, das er bedient: Du erzeugst den Schlüssel einmal, bewahrst ihn sicher auf und verwendest ihn wieder, um viele Tokens zu signieren und zu prüfen.

Wie lang sollte der Schlüssel sein? Die Antwort ist durch die Spezifikation festgelegt, nicht durch Vorliebe. RFC 7518 §3.2 — der JSON-Web-Algorithms-Standard — verlangt, dass ein HMAC-Schlüssel mindestens so groß wie die Hash-Ausgabe ist: „Ein Schlüssel von derselben Größe wie die Hash-Ausgabe (zum Beispiel 256 Bit für HS256) oder größer MUSS verwendet werden.“ Das ergibt eine saubere Tabelle, der der Generator automatisch folgt:

| Algorithmus | HMAC | Min. Byte | Min. Bit | hex-Zeichen | base64-Zeichen | base64url-Zeichen | |-----------|------|-----------|----------|-----------|--------------|-----------------| | 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 |

Die Zeichenanzahlen ergeben sich aus den RFC-4648-Codierungen dieser Byte-Längen: hex verdoppelt die Byte-Anzahl; base64 dehnt um 4⁄3 mit Padding aus; base64url lässt das Padding weg, sodass ein 32-Byte-Schlüssel 43 base64url-Zeichen statt 44 ergibt. base64url ist JWTs native Codierung — URL-sicheres Alphabet, kein Padding — weshalb es hier die Standardausgabe ist; ein Secret in base64url kann in einem Header, einer URL oder einem Konfigurationswert ohne Escaping stehen.

Zufälligkeit ist der Teil, bei dem du keine Kompromisse machen darfst. Dieser Generator zieht seine Bytes aus crypto.getRandomValues, dem kryptografisch sicheren Pseudo-Zufallszahlengenerator des Browsers, demselben Primitiv, das hinter der Schlüsselerzeugung von Web Crypto steht. Er verwendet nie Math.random, das schnell, aber vorhersehbar und völlig ungeeignet für einen Signierschlüssel ist — ein vorhersehbarer RNG bedeutet ein erratbares Secret, und ein erratbares Secret bedeutet fälschbare Tokens. Weil die HMAC-Prüfung lokal mit dem gemeinsamen Secret geschieht, kann ein Angreifer, der ein Token erbeutet, einen schwachen Schlüssel offline per Brute Force ohne Rate-Limit knacken; Werkzeuge wie hashcat (Modus 16500) und jwt_tool existieren genau dafür. Ein zufälliger 32-Byte-Schlüssel mit voller Entropie hingegen liegt rechnerisch außer Reichweite. Die Lehre ist klar: Verwende nie ein Passwort, ein Wörterbuchwort oder eine von Hand getippte Zeichenkette als JWT-Secret — erzeuge ein zufälliges.

Schließlich ist das clientseitige Erzeugen des Schlüssels selbst eine Sicherheitseigenschaft. Ein Signier-Secret sollte nie an Dritte übertragen werden, nicht einmal an die Website, die dir beim Erstellen hilft. Jedes Byte hier wird in deinem Browser erzeugt und codiert; nichts wird hochgeladen, geloggt oder gespeichert. Wenn du bereit bist, den Schlüssel auszuliefern, gibt dir die Schaltfläche „Für .env kopieren“ eine Zeile JWT_SECRET=… , und falls du ihn in eine größere Konfiguration einfügen musst, kann der JSON-zu-.env-Konverter helfen. Erzeugen, kopieren, in einem Secrets-Manager speichern — und mit einem kid-Header und überlappenden Gültigkeitsfenstern rotieren, wenn die Zeit gekommen ist.

// 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))"

Hauptfunktionen

Algorithmusbewusste Schlüssellänge

Wähle HS256, HS384 oder HS512, und der Generator setzt die minimale Schlüsselgröße gemäß RFC 7518 §3.2 automatisch — 32, 48 oder 64 Byte. Du kannst einen längeren Schlüssel anfordern, aber nie versehentlich einen zu kleinen bereitstellen, der gegen die Spezifikation verstößt oder den eine strenge Bibliothek zum Signieren ablehnt.

Drei text-sichere Ausgabeformate

Erhalte dieselben Zufallsbytes als base64url (JWTs native, URL-sichere Codierung ohne Padding — der Standard), Standard-base64 oder hex, nebeneinander angezeigt. base64url ist der sicherste Standard für ein JWT_SECRET; wechsle das Format, wenn ein bestimmter Loader oder eine Bibliothek ein anderes erwartet. Die Entropie ist über alle drei identisch.

Kryptografisch sichere Zufälligkeit

Jedes Secret stammt aus crypto.getRandomValues, dem CSPRNG des Browsers und dem Primitiv hinter der Schlüsselerzeugung von Web Crypto. Nie Math.random. Das garantiert einen Schlüssel mit voller Entropie ohne vorhersehbare Struktur — die Eigenschaft, die das Secret jenseits der Reichweite von Offline-Brute-Force stellt.

Für .env kopieren mit einem Klick

„Für .env kopieren“ verpackt den Wert in die übliche Zuweisung JWT_SECRET=… , eine Zeile, keine Anführungszeichen — fertig zum Einfügen in eine .env-Datei, ein Docker-Secret oder eine CI-Variable, ohne den Schlüsselnamen abzutippen. Einfaches „Kopieren“ greift das rohe Secret, wenn du nur den Wert brauchst.

Äquivalente CLI-Befehle

Ein Panel gibt die passenden openssl rand-, Node crypto.randomBytes- und Python secrets-Einzeiler für den gewählten Algorithmus aus, sodass du einen gleich starken Schlüssel in einem Bereitstellungsskript oder einem Dockerfile reproduzieren kannst. Die meisten konkurrierenden Tools lassen das weg; hier ist es eingebaut.

Anzeigen / Verbergen per Maskierung

Das Secret ist standardmäßig maskiert, sodass es während einer Demo, eines Tutorials oder einer Bildschirmfreigabe vom Bildschirm fernbleibt. Blende es nur mit dem Augensymbol ein, wenn du zum Kopieren bereit bist. Kopieraktionen legen immer das echte Secret in die Zwischenablage, ob angezeigt oder verborgen.

100 % privat, nur im Browser

Das Secret wird vollständig auf deinem Gerät erzeugt, codiert und angezeigt. Keine Netzwerkanfragen, kein Logging, keine Speicherung — prüfe es in den DevTools → Netzwerk. Ein Signierschlüssel sollte nie zu Dritten gelangen, und hier tut er das nie, was der ganze Grund ist, ihn clientseitig zu erzeugen.

In 15 Sprachen verfügbar

Die gesamte Oberfläche — Beschriftungen, Anweisungen und Hinweise — ist in 15 Sprachen lokalisiert, sodass das Tool nutzbar und der Sicherheitsrat klar ist, egal wo dein Team arbeitet.

Durchgearbeitete Beispiele

Ein HS256-Secret in base64url erzeugen (Standard)

Algorithmus: HS256 · Format: base64url
3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

HS256 signiert mit HMAC-SHA-256, daher verlangt RFC 7518 §3.2 einen Schlüssel von mindestens 32 Byte (256 Bit). Der Generator zieht 32 kryptografisch sichere Zufallsbytes aus crypto.getRandomValues und codiert sie als base64url — das URL-sichere Alphabet ohne Padding, das JWT selbst verwendet. 32 Byte werden zu einer 43-Zeichen-base64url-Zeichenkette. Setze den Wert direkt in JWT_SECRET. Jeder Klick erzeugt ein frisches Secret; nichts ist jemals zweimal gleich.

Ein HS512-Secret erzeugen (64 Byte / 512 Bit)

Algorithmus: HS512 · Format: base64url
k2Lp9XqA0mNbVcZ7rT4wYsHfGjUe8RoIdPlNkBvM3xQ1aWtCyZuS6FhEgJ (86 chars)

HS512 verwendet HMAC-SHA-512, dessen Hash-Ausgabe 64 Byte beträgt, daher schreibt RFC 7518 §3.2 einen Schlüssel von mindestens 64 Byte (512 Bit) vor. Das Tool erkennt den Algorithmus und erhöht die Byte-Anzahl automatisch — du musst dir das Minimum nie merken. 64 Zufallsbytes codieren zu einer 86-Zeichen-base64url-Zeichenkette, 88 Zeichen in Standard-base64 oder 128 hex-Zeichen. Hier einen längeren Algorithmus zu wählen ist der Ein-Klick-Weg, ein Secret mit höherer Entropie bereitzustellen.

Das Secret als .env-Zeile kopieren

Auf „Für .env kopieren“ klicken
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

„Für .env kopieren“ verpackt den erzeugten Wert in die übliche Zuweisung JWT_SECRET=… , sodass du ihn direkt in eine .env-Datei, ein Docker-Secret oder eine CI-Variable einfügen kannst, ohne den Schlüsselnamen abzutippen. Der Wert bleibt in einer Zeile ohne umschließende Anführungszeichen — genau das, was dotenv-artige Loader erwarten. Brauchst du die Variable in eine größere Konfiguration eingebettet? Kombiniere dies mit dem unten verlinkten JSON-zu-.env-Konverter.

Das Secret per CLI reproduzieren (gleiche Stärke)

Den CLI-Befehl anzeigen
openssl rand -base64 32

Das CLI-Panel gibt die openssl-, Node- und Python-Befehle aus, die für den gewählten Algorithmus dieselbe Anzahl sicherer Zufallsbytes ziehen — openssl rand -base64 32 für HS256, …48 für HS384, …64 für HS512. Die Ausgabe ist ein gleich starkes Secret, keine byte-identische Zeichenkette: openssl gibt Standard-base64 mit Padding aus, während dieses Tool standardmäßig base64url nutzt, sodass sich Alphabete und Endzeichen unterscheiden. Verwende, was zu deinem Bereitstellungsskript passt; die Entropie ist dieselbe.

Das Secret anzeigen und verbergen

Auf das Augensymbol klicken
•••••••••••••••••••••••••••••••••••••••••••  ↔  3sJ9aFq2kP7m…

Das Secret ist standardmäßig maskiert, sodass es während einer Demo oder Bildschirmfreigabe nicht über die Schulter ausgespäht oder per Bildschirmaufnahme erfasst werden kann. Klicke auf das Augensymbol, um es einzublenden, wenn du zum Kopieren bereit bist, und blende es danach wieder aus. „Kopieren“ und „Für .env kopieren“ funktionieren, ob der Wert angezeigt oder maskiert ist — das echte Secret landet immer in deiner Zwischenablage, nie die Punkte.

So nutzt du den JWT-Secret-Generator

  1. 1

    Den Signieralgorithmus wählen

    Wähle HS256, HS384 oder HS512. Der Generator wendet sofort die minimale Schlüssellänge gemäß RFC 7518 §3.2 für diese HMAC-Variante an — 32, 48 oder 64 Byte — sodass du die Zahl nie nachschlagen oder einen zu kleinen Schlüssel riskieren musst.

  2. 2

    Das Ausgabeformat wählen

    base64url ist der Standard — JWTs native URL-sichere Codierung ohne Padding. Wechsle zu Standard-base64, falls ein Loader es erwartet, oder zu hex, wenn ein System nur 0–f-Zeichen akzeptiert. Alle drei codieren dieselben Zufallsbytes mit identischer Entropie.

  3. 3

    Das Secret einblenden und kopieren

    Das Secret ist standardmäßig maskiert, um es während einer Demo oder Bildschirmfreigabe vom Bildschirm fernzuhalten. Klicke auf das Augensymbol, um es einzublenden, dann auf „Kopieren“, um den Rohwert zu greifen, oder „Für .env kopieren“, um eine Zeile JWT_SECRET=… fertig für eine .env-Datei oder CI-Variable zu kopieren.

  4. 4

    Bei Bedarf neu erzeugen

    Klicke auf „Neu erzeugen“ für ein frisches, unabhängiges Secret aus crypto.getRandomValues. Erzeuge eines pro Umgebung — verwende denselben Signierschlüssel nie über Entwicklung, Staging und Produktion hinweg wieder.

  5. 5

    Das CLI-Äquivalent nutzen oder zum Signieren übergehen

    Das CLI-Panel zeigt die passenden openssl-, Node- und Python-Einzeiler für skriptgesteuerte Bereitstellung. Mit deinem Secret in der Hand signierst du ein Token mit dem JWT-Kodierer und bestätigst die Signatur mit dem JWT-Dekodierer.

Häufige Fehler bei JWT-Secrets

Ein Passwort oder eine kurze Phrase als Secret verwendet

Eine menschlich gewählte Zeichenkette hat viel zu wenig Entropie für einen Signierschlüssel und kann offline mit einem Wörterbuch- oder Brute-Force-Angriff wiederhergestellt werden, woraufhin jedes Token gefälscht werden kann. Erzeuge stattdessen ein zufälliges Secret mit voller Entropie.

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

Schlüssel kürzer als vom Algorithmus verlangt

RFC 7518 §3.2 schreibt einen HMAC-Schlüssel mindestens so lang wie die Hash-Ausgabe vor. Ein 16-Byte-Schlüssel für HS256 liegt unter der 32-Byte-Untergrenze — er schwächt die Signatur, und manche Bibliotheken lehnen ihn direkt ab.

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

Den Schlüssel mit Math.random erzeugt

Math.random ist nicht kryptografisch sicher — seine Ausgabe ist vorhersehbar, sodass ein damit gebautes Secret erratbar ist und die damit signierten Tokens fälschbar sind. Ein Signierschlüssel muss aus einem CSPRNG wie crypto.getRandomValues stammen.

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

Das Secret vor dem Signieren neu codiert

Speichere und gib die exakte Zeichenkette zurück, die das Tool erzeugt hat. Es in einem Dienst zu Bytes base64-zu-decodieren, in einem anderen aber als wörtliche Zeichenkette zu behandeln, gibt den beiden Seiten unterschiedliche Schlüssel, und jede Signaturprüfung schlägt fehl.

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

Dasselbe Secret über alle Umgebungen hinweg wiederverwendet

Ein von Entwicklung, Staging und Produktion geteiltes JWT_SECRET bedeutet, dass ein Leak irgendwo überall Tokens fälscht und die Rotation zu Alles-oder-nichts wird. Stelle ein eigenes Secret pro Umgebung bereit.

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

Dem alg des Tokens bei der Prüfung vertraut

Den Prüfer akzeptieren zu lassen, welchen Algorithmus auch immer das Token deklariert, ermöglicht alg:none- und HS/RS-confusion-Fälschungen. Übergib eine explizite Algorithmus-Whitelist, egal wie stark das Secret ist.

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

Wer dieses Tool nutzt

Ein JWT_SECRET für einen neuen Dienst bereitstellen
Startest du eine API, die HMAC-signierte Tokens ausstellt? Wähle den Algorithmus, den deine Bibliothek verwendet, kopiere das Secret als Zeile JWT_SECRET=… und setze es in die Umgebung des Dienstes. Erzeuge je einen eigenen Schlüssel für Entwicklung, Staging und Produktion — teile nie ein Secret über Umgebungen hinweg.
Ein kompromittiertes oder veraltetes Secret rotieren
Wenn ein Schlüssel als geleakt vermutet wird oder einfach zur Rotation ansteht, erzeuge hier ein frisches Secret, weise ihm ein neues kid zu und rolle es mit einem Überlappungsfenster aus, sodass aktive Tokens bis zu ihrem Ablauf weiter verifizieren. Bei bestätigtem Kompromittieren rotiere sofort und entferne den alten Schlüssel aus der akzeptierten Menge.
Einen schwachen oder von Hand getippten Schlüssel ersetzen
Eine Codebasis geerbt, deren JWT_SECRET eine kurze Phrase oder ein kopierter Beispielwert ist? Dieser Schlüssel ist offline per Brute Force knackbar. Erzeuge einen 32-Byte-Ersatz mit voller Entropie, tausche ihn hinter einem Rotationsfenster ein und schließe die Token-Fälschungslücke, bevor sie ausgenutzt wird.
Schlüsselerzeugung in einer Pipeline skripten
Den Schlüssel lieber in CI oder einem Dockerfile statt von Hand erzeugt? Verwende den openssl-, Node- oder Python-Einzeiler des CLI-Panels, um ein gleich starkes Secret in deinem Bereitstellungsskript zu prägen, und nutze diese Seite, um die Byte-Längen und Codierungen zu verstehen, die jeder Befehl erzeugt.
JWT-Signieren sicher vermitteln
Führe ein Team durch die Funktionsweise von HS256, ohne je einen echten Produktionsschlüssel offenzulegen — erzeuge ein Wegwerf-Secret auf dem Bildschirm (maskiert, bis du es einblendest), signiere ein Beispiel-Token mit dem JWT-Kodierer und prüfe es mit dem JWT-Dekodierer, sodass der gesamte Signier-und-Prüf-Kreislauf sichtbar wird.
HS256-, HS384- und HS512-Schlüsselgrößen vergleichen
Du entscheidest, welche HMAC-Variante du standardisieren willst? Wechsle zwischen den Algorithmen, um zu sehen, wie die erforderliche Schlüssellänge und die codierte Zeichenkette wachsen — 43, 64 und 86 base64url-Zeichen — und wähle den Kompromiss aus Stärke und Token-Größe, der zu deinem System passt, bevor du ihn in die Konfiguration übernimmst.
Schlüssel für die lokale Entwicklung erzeugen
Brauchst du ein schnelles, gültiges Secret, um einen lokalen Auth-Ablauf zum Laufen zu bringen? Erzeuge eines mit einem Klick, kopiere es für .env, und du bist entblockt — mit einem echten CSPRNG-Schlüssel statt eines Platzhalters, den du vor dem Deploy zu ersetzen vergisst.

So funktioniert der Generator

crypto.getRandomValues (CSPRNG)
Secrets werden erzeugt, indem ein Uint8Array mit crypto.getRandomValues gefüllt wird, dem kryptografisch sicheren Pseudo-Zufallszahlengenerator von Web Crypto. Es ist dieselbe Entropiequelle, die hinter der Schlüsselerzeugung von Web Crypto steht. Math.random wird nirgends verwendet — es ist statistisch vorhersehbar und für jeden kryptografischen Schlüssel ungeeignet.
Schlüsseldimensionierung nach RFC 7518 §3.2
Die Byte-Anzahl pro Algorithmus folgt der JSON-Web-Algorithms-Anforderung, dass ein HMAC-Schlüssel mindestens so groß wie die Hash-Ausgabe ist: 32 Byte für HS256 (SHA-256), 48 für HS384 (SHA-384), 64 für HS512 (SHA-512). Die Wahl des Algorithmus setzt das Minimum; der Generator gibt keinen Schlüssel unterhalb der Spezifikationsuntergrenze aus.
RFC-4648-Codierungen (base64url / base64 / hex)
Die Rohbytes werden mit den RFC-4648-Alphabeten codiert. base64url verwendet das URL-sichere Alphabet ohne Padding (32 Byte → 43 Zeichen), Standard-base64 verwendet +, / und =-Padding (→ 44 Zeichen), und hex schreibt zwei Zeichen pro Byte (→ 64 Zeichen). Das Wechseln des Formats codiert dieselben Bytes neu — die zugrunde liegende Entropie bleibt unverändert.
Warum base64url der Standard ist
JWT-Komponenten sind selbst base64url-codiert, und das URL-sichere Alphabet ohne Padding bedeutet, dass ein Secret in base64url in einem Header, einer URL oder einer Konfigurationsdatei nie escaped werden muss. Das +, / und abschließende = von Standard-base64 kann in diesen Kontexten brechen, daher ist base64url der konservative Standard für ein JWT_SECRET.
Formatierung für „Für .env kopieren“
„Für .env kopieren“ gibt JWT_SECRET= in einer einzigen Zeile ohne umschließende Anführungszeichen aus — die Form, die dotenv-artige Loader ohne Änderung parsen. Das rohe Secret enthält nie Zeichen, die in einer .env-Datei Anführungszeichen erfordern würden, sodass die Zeile sicher unverändert eingefügt werden kann.
Gleich starke CLI-Befehle, nicht byte-identisch
Die Befehle openssl rand -base64 N, Node randomBytes(N).toString('base64url') und Python secrets.token_urlsafe(N) des CLI-Panels ziehen alle N sichere Zufallsbytes für den gewählten Algorithmus. Sie erzeugen gleich starke Schlüssel, nicht dieselbe Zeichenkette — openssl gibt gepolstertes Standard-base64 aus, sodass sich Alphabet und Endzeichen vom base64url-Standard dieses Tools unterscheiden.

Best Practices für JWT-Secrets

Die Schlüssellänge an den Algorithmus anpassen
Verwende mindestens 32 Byte für HS256, 48 für HS384 und 64 für HS512, wie RFC 7518 §3.2 verlangt. Dieser Generator erledigt das für dich, aber wenn du einen Schlüssel von Hand dimensionierst, gehe nie unter die Länge der Hash-Ausgabe — ein zu kleiner HMAC-Schlüssel schwächt sowohl die Signatur als auch kann er von strengen Bibliotheken abgelehnt werden.
Immer mit einem CSPRNG erzeugen, nie mit einem Passwort
Ein JWT-Secret ist eine Maschinen-Anmeldung, die sich niemand merken muss, also gib die volle Entropie aus: Verwende einen kryptografisch sicheren Zufallsschlüssel, keine Passphrase, kein Wörterbuchwort und keine von Hand getippte Zeichenkette. Menschlich gewählte Secrets sind das leichteste Ziel für die Offline-Brute-Force-Angriffe, die JWT-Knack-Werkzeuge automatisieren.
Ein eindeutiges Secret pro Umgebung verwenden
Entwicklung, Staging und Produktion sollten je ein eigenes JWT_SECRET haben. Einen Schlüssel zu teilen bedeutet, dass ein Leak in einer risikoarmen Umgebung überall Tokens fälscht, und es macht die Rotation zu einer Alles-oder-nichts-Angelegenheit. Erzeuge hier ein separates Secret für jede Umgebung und speichere jedes in seinem eigenen Secrets-Manager-Bereich.
Den Algorithmus beim Prüfen festschreiben
Übergib auf der Prüfseite immer eine explizite Algorithmus-Whitelist — algorithms: ['HS256'] in jsonwebtoken, algorithms=["HS256"] in PyJWT — und vertraue nie dem alg-Feld im Token. Das selbstdeklarierte Algorithmus-Feld des Tokens zu akzeptieren, ermöglicht die klassischen alg-confusion- und alg:none-Fälschungsangriffe, egal wie stark dein Secret ist.
Mit einem kid-Header und überlappenden Schlüsseln rotieren
Versieh signierte Tokens mit einer Schlüsselkennung (kid) und veröffentliche aktive Schlüssel über einen JWKS-Endpunkt, sodass du ohne Ausfallzeit rotieren kannst: Signiere neue Tokens mit dem neuen Schlüssel, während du den alten noch akzeptierst, bis dessen Tokens ablaufen. Bei vermutetem Kompromittieren überspringe die Überlappung und widerrufe den alten Schlüssel sofort.

Häufig gestellte Fragen

Wird mein erzeugtes JWT-Secret an euren Server gesendet?
Nein. Das Secret wird vollständig in deinem Browser mit crypto.getRandomValues erzeugt, dem kryptografisch sicheren Zufallszahlengenerator der Plattform. Die Bytes entstehen auf deinem Gerät, werden lokal codiert und nur dir angezeigt. Nichts wird hochgeladen, nichts geloggt, nichts auf die Festplatte geschrieben und nichts an Dritte gesendet — öffne die DevTools → Netzwerk und du siehst beim Klick auf „Neu erzeugen“ oder „Kopieren“ null Anfragen. Das heißt, ein hier erzeugter Schlüssel gehört in dem Moment, in dem er erscheint, allein dir; kein Server bekommt ihn je zu sehen. Genau darum geht es beim clientseitigen Erzeugen eines Signierschlüssels statt auf einer Website, die im Prinzip eine Kopie jedes ausgegebenen Schlüssels behalten könnte.
Wie erzeuge ich ein sicheres JWT-Secret?
Drei Schritte. Erstens: Wähle den Signieralgorithmus, den deine Anwendung verwendet — HS256, HS384 oder HS512 — und der Generator dimensioniert den Schlüssel sofort auf das RFC-7518-§3.2-Minimum für diese Variante (32, 48 oder 64 Byte), sodass du nie eine Zahl von Hand wählst oder einen zu kleinen Schlüssel riskierst. Zweitens: Belasse die Codierung auf base64url (JWTs nativem, URL-sicherem Format) oder wechsle zu base64 oder hex, falls dein Konfigurationsloader eines davon erwartet. Drittens: Klicke auf „Kopieren“ — oder „Für .env kopieren“, um eine fertig einfügbare Zeile JWT_SECRET=… zu erhalten — und speichere den Wert in einem Secrets-Manager oder einer Umgebungsvariable, niemals in der Versionsverwaltung. Weil jedes Byte aus crypto.getRandomValues stammt, trägt ein 32-Byte-Schlüssel bereits 256 Bit Entropie, weit jenseits der Reichweite der Offline-Brute-Force-Angriffe, die menschlich gewählte Secrets knacken. Lieber die Kommandozeile? Das Tool gibt auch äquivalente openssl-, Node- und Python-Einzeiler aus, die du in ein Terminal einfügen kannst.
Wie lang sollte ein HS256-JWT-Secret sein?
Mindestens 32 Byte (256 Bit). RFC 7518 §3.2 — die JSON-Web-Algorithms-Spezifikation — legt fest, dass für HMAC-Signaturen „ein Schlüssel von derselben Größe wie die Hash-Ausgabe (zum Beispiel 256 Bit für HS256) oder größer verwendet werden MUSS“. HS256 signiert mit HMAC-SHA-256 (256-Bit-Hash), daher ist der minimale Schlüssel 32 Byte; HS384 verwendet HMAC-SHA-384 und braucht mindestens 48 Byte (384 Bit); HS512 verwendet HMAC-SHA-512 und braucht mindestens 64 Byte (512 Bit). Dieser Generator wählt das korrekte Minimum automatisch, wenn du den Algorithmus wählst, und du kannst einen längeren Schlüssel anfordern. Ein kürzerer Schlüssel ist nicht nur schwächer — er verstößt gegen die Spezifikation, und manche Bibliotheken weigern sich, damit zu signieren.
Was ist der Unterschied zwischen base64url, base64 und hex, und welches sollte ich wählen?
Alle drei codieren dieselben Zufallsbytes; sie unterscheiden sich nur im Zeichen-Alphabet, nicht in der Entropie. base64url ist JWTs native Codierung — es nutzt ein URL-sicheres Alphabet (- und _ statt + und /) und lässt das Padding weg, sodass es in einem Token, einer URL oder einem Header nie escaped werden muss. Deshalb ist es hier der Standard. Standard-base64 verwendet +, / und =-Padding; wähle es, wenn ein Konfigurationsloader oder eine Bibliothek ausdrücklich klassisches base64 erwartet. hex (base16) schreibt jedes Byte als zwei Zeichen 0–f und erzeugt eine längere, aber eindeutige Zeichenkette, die praktisch ist, wenn ein System nicht-alphanumerische Zeichen ablehnt. Für eine JWT_SECRET-Umgebungsvariable ist base64url der sicherste Standard; jedes der drei funktioniert, solange du die exakte Zeichenkette speicherst und unverändert an deine Signierbibliothek zurückgibst.
Kann ein schwaches JWT-Secret geknackt werden?
Ja — und das ist das größte Einzelrisiko bei HMAC-signierten JWTs. Weil HS256/384/512 ein einziges gemeinsames Secret verwenden, kann jeder, der ein Token hält, einen Offline-Brute-Force- oder Wörterbuchangriff gegen die Signatur fahren — ohne Rate-Limit und ohne Serverkontakt. Werkzeuge wie hashcat (Modus 16500 zielt auf JWT) und jwt_tool sind eigens dafür gebaut; auf Standard-GPUs fällt ein Secret mit niedriger Entropie typischerweise in Sekunden bis Stunden, und ein Wörterbuchwort oder ein geleaktes Passwort fällt fast sofort. Ein zufälliger 32-Byte-Schlüssel mit voller Entropie aus diesem Generator liegt weit jenseits der Reichweite von Brute Force. Sobald ein Angreifer das Secret erlangt, kann er jedes beliebige Token fälschen — auch eines, das Admin-Rechte beansprucht — daher ist die Stärke des Secrets nicht optional. Erzeuge den Signierschlüssel mit einem CSPRNG, niemals als menschlich gewählte Zeichenkette. Eine tiefere Behandlung von Schwaches-Secret-, alg-confusion- und Token-Replay-Angriffen findest du in unserem Leitfaden zu JWT-Sicherheits-Best-Practices.
Kann ich ein Passwort als mein JWT-Secret verwenden?
Du kannst, aber du solltest nicht. Ein menschlich merkbares Passwort — selbst eine lange Passphrase — trägt weit weniger Entropie als 32 Zufallsbytes, was es zu einem realistischen Ziel für die oben beschriebenen Offline-Brute-Force- und Wörterbuchangriffe macht. JWT-Secrets sind Maschine-zu-Maschine-Anmeldedaten; niemand muss sie sich merken, also gibt es keinen Grund, Entropie gegen Merkbarkeit einzutauschen. Erzeuge hier ein zufälliges Secret, speichere es in einem Secrets-Manager oder einer Umgebungsvariable und lass deine Anwendung es lesen. Wenn du merkbare Anmeldedaten für einen anderen Zweck brauchst, ist das eine Aufgabe für einen Passwort-Generator oder, zum Speichern von Nutzerpasswörtern, einen Einweg-Hash aus dem bcrypt-Generator — nicht für einen Token-Signierschlüssel.
Wie rotiere ich ein JWT-Secret, ohne aktive Tokens zu brechen?
Rotiere mit Überlappung statt mit hartem Umschalten. Füge den signierten Tokens eine Schlüsselkennung (den kid-Header) hinzu, damit ein Prüfer weiß, gegen welches Secret er prüfen muss, und veröffentliche deine aktiven Schlüssel — typischerweise über einen JWKS-Endpunkt, den deine Dienste lesen. Zum Rotieren: Erzeuge hier ein neues Secret, beginne neue Tokens mit dem neuen kid zu signieren, während du den vorherigen Schlüssel zur Prüfung noch akzeptierst, und ziehe den alten Schlüssel erst zurück, nachdem jedes damit signierte Token abgelaufen ist. Dieses Überlappungsfenster bedeutet, dass keine gültige Sitzung mitten im Flug ungültig wird. Bei vermutetem Kompromittieren überspringe die sanfte Überlappung: Rotiere sofort, entferne den alten Schlüssel aus der akzeptierten Menge und erzwinge eine erneute Authentifizierung, damit geleakte Tokens sofort nicht mehr verifizieren.
Wie unterscheidet sich ein HMAC-Schlüssel (HS*) von einem RSA- oder ECDSA-Schlüssel (RS*/ES*)?
Sie lösen dasselbe Problem mit gegensätzlichen Schlüsselmodellen. HS256/384/512 sind HMAC-Algorithmen: Sie verwenden ein symmetrisches Secret — die Art, die dieses Tool erzeugt — das sowohl signiert als auch prüft, sodass jede Partei, die ein Token prüfen kann, auch eines fälschen kann. Das ist einfach, schnell und ideal, wenn ein einziger Dienst seine eigenen Tokens sowohl ausstellt als auch prüft. RS* (RSA) und ES* (ECDSA) sind asymmetrisch: Sie verwenden ein Schlüsselpaar, bei dem ein privater Schlüssel signiert und ein separater öffentlicher Schlüssel nur prüft. Du gibst den öffentlichen Schlüssel an jeden weiter, der Tokens validieren muss, ohne je den Signierschlüssel offenzulegen — die richtige Wahl, wenn ein Identitätsanbieter Tokens ausstellt, die viele unabhängige Dienste prüfen. Dieser Generator erzeugt ausschließlich symmetrische HMAC-Secrets. Um mit dem erzeugten Schlüssel ein tatsächliches Token zusammenzubauen und zu signieren, nutze den JWT-Kodierer; um eines zu inspizieren und zu prüfen, nutze den JWT-Dekodierer.

Verwandte Werkzeuge

Alle Werkzeuge anzeigen →