So erstellen Sie ein signiertes JWT
- Wählen Sie den Algorithmus. Das Feld
algin Header (JSON) folgt der Auswahl automatisch. - Bearbeiten Sie Payload (JSON). + iat jetzt fügt die aktuelle Zeit ein, + exp in 1 h setzt den Ablauf auf eine Stunde ab jetzt; beide verwenden Sekunden, wie es die JWT-Spezifikation verlangt.
- Für HS256, HS384 oder HS512 geben Sie das Secret ein und stellen Secret als auf Text, Base64 oder Hex. Für die anderen Algorithmen fügen Sie einen privaten Schlüssel ein oder drücken Schlüsselpaar erzeugen.
- Token kopieren, oder drücken Sie Im Decoder öffnen, um es zu prüfen: Der Tab Dekodieren & prüfen öffnet sich mit Token und Prüfschlüssel bereits ausgefüllt.
Das Beispiel beim Laden ist ein gültiges HS256-Token, signiert mit dem Secret base64hub-demo-secret. Ändern Sie einen Claim und sehen Sie, wie sich die Signatur mit ändert.
Einen Algorithmus wählen
| Algorithmus | Schlüsseltyp | Wer prüfen kann | Signatur im Token |
|---|---|---|---|
| HS256 | Gemeinsames Secret (HMAC-SHA256) | Jeder mit demselben Secret | 43 Zeichen |
| RS256, PS256 | Privater RSA-Schlüssel, 2048 Bit oder mehr | Jeder mit dem öffentlichen Schlüssel | 342 Zeichen (RSA-2048) |
| ES256 | Privater EC-Schlüssel auf P-256 | Jeder mit dem öffentlichen Schlüssel | 86 Zeichen |
| EdDSA | Privater Ed25519-Schlüssel | Jeder mit dem öffentlichen Schlüssel | 86 Zeichen |
HS256 ist die einfachste Wahl, wenn ein Dienst signiert und prüft, etwa bei einem Session-Token, das dasselbe Backend kontrolliert. Sobald eine zweite Partei prüfen muss, erlaubt ihr ein geteiltes HMAC-Secret auch, Tokens auszustellen. Wechseln Sie dann zu einem asymmetrischen Algorithmus und veröffentlichen Sie nur den öffentlichen Schlüssel. ES256 und EdDSA ergeben viel kürzere Tokens als RSA, was bei Cookies und Headern zählt. PS256 ist RSA mit dem Padding-Verfahren PSS; wählen Sie es nur, wenn jeder Prüfer es unterstützt.
none steht zum Testen von Parsern in der Liste. Ein Token mit alg: none hat eine leere Signatur, und jeder Server, der es akzeptiert, lässt sich von jedem täuschen. Das Tool warnt daher davor.
Schlüssel, die dieser Encoder annimmt und erzeugt
Zum Signieren nimmt er einen PEM-PKCS#8-Schlüssel (BEGIN PRIVATE KEY), einen PKCS#1-RSA PRIVATE KEY, einen SEC1-EC PRIVATE KEY oder ein privates JWK. Um Testschlüssel mit OpenSSL statt mit dem Generator zu erstellen:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out rsa.pem
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec.pem
openssl genpkey -algorithm ed25519 -out ed.pem
openssl pkey -in ec.pem -pubout -out ec.pub
Schlüsselpaar erzeugen erstellt je nach Algorithmus RSA-2048-, P-256-, P-384-, P-521- oder Ed25519-Schlüssel im Browser mit WebCrypto. Sie erhalten den privaten Schlüssel als PKCS#8-PEM, den öffentlichen als SPKI-PEM und ein JWKS, dessen kid der RFC-7638-Fingerabdruck des Schlüssels ist. Dieses JWKS würden Sie unter einer jwks_uri bereitstellen, damit Prüfer es herunterladen können.
Bei HS256 wird das Secret als Bytes verwendet. Liest Ihr Server das Secret aus einer Umgebungsvariable und dekodiert es zuerst aus Base64, stellen Sie auch hier Secret als auf Base64, sonst stimmen die Signaturen nicht überein. Ein Wert aus der JWT-Secret-Voreinstellung des Base64-Schlüsselgenerators ist Base64URL und ergibt dekodiert 32 Bytes.
Welche Claims in die Payload gehören
Ein brauchbares Access-Token enthält meist iss (wer es ausgestellt hat), sub (um wen es geht), aud (für welche API es ist), iat und ein kurzes exp. Ergänzen Sie jti, wenn Sie einzelne Tokens widerrufen müssen. Zeiten sind ganze Sekunden seit 1970; bauen Sie sie in JavaScript, verwenden Sie Math.floor(Date.now() / 1000), denn Date.now() liefert Millisekunden.
Die Payload ist signiert, nie verschlüsselt. Jeder, der das Token sieht, kann es mit einem JWT-Decoder dekodieren. Lassen Sie also Passwörter, API-Schlüssel und personenbezogene Daten weg, die Sie nicht in ein Log schreiben würden.
Ein JWT im Code signieren
Das Format ist so einfach, dass man es von Hand bauen kann, was beim Debuggen einer Bibliothek hilft. Diese Node.js-Funktion erzeugt genau das Token, das jwt.encode(payload, secret, algorithm="HS256") von PyJWT für dieselbe Eingabe liefert:
const crypto = require("crypto");
const b64url = (obj) => Buffer.from(JSON.stringify(obj)).toString("base64url");
function signHS256(payload, secret) {
const input = b64url({ alg: "HS256", typ: "JWT" }) + "." + b64url(payload);
const sig = crypto.createHmac("sha256", secret).update(input).digest("base64url");
return input + "." + sig;
}
console.log(signHS256({ sub: "user-42", iat: 1767225600, exp: 1767229200 },
"replace-me-with-32-random-bytes!"));
Sie gibt eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyLTQyIiwiaWF0IjoxNzY3MjI1NjAwLCJleHAiOjE3NjcyMjkyMDB9.F3xnXnXW8nUQy-Ay37DF626Lb5lHPKI3IFvqoEf3mTw aus. Geben Sie auf dieser Seite denselben Header, dieselbe Payload und dasselbe Secret ein, erhalten Sie dieselbe Zeichenkette. Das Tool kompaktiert das JSON vor dem Signieren, Einrückungen spielen also keine Rolle, die Reihenfolge der Schlüssel aber schon, weil die Signatur genau diese Bytes abdeckt. In Produktion verwenden Sie eine gepflegte Bibliothek; zur Kodierungsseite siehe Base64 in Node.js.
Häufige Fragen
Wie lang sollte ein HS256-Secret sein?
Mindestens 256 Bit, also 32 Zufallsbytes. RFC 7518 verlangt einen Schlüssel, der mindestens so lang ist wie die Hash-Ausgabe. Ein kurzes, passwortartiges Secret lässt sich anhand eines einzigen Tokens offline per Brute Force knacken; erzeugen Sie daher eines mit dem Base64-Schlüsselgenerator.
Sollte ich HS256 oder RS256 verwenden?
HS256, wenn derselbe Dienst Tokens ausstellt und prüft, denn beide Seiten teilen ein Secret. RS256, ES256 oder EdDSA, wenn andere Parteien prüfen müssen, da sie nur den öffentlichen Schlüssel bekommen und selbst keine Tokens ausstellen können.
Warum zeigt mein privater Schlüssel einen Fehler?
Passwortgeschützte Schlüssel (BEGIN ENCRYPTED PRIVATE KEY) werden abgelehnt. Entfernen Sie die Passphrase mit openssl pkey -in key.pem -out plain.pem und fügen Sie das Ergebnis ein. Außerdem muss der Schlüsseltyp zum Algorithmus passen: Ein EC-Schlüssel kann kein RS256 signieren.
Wie füge ich dem Token eine kid hinzu?
Kopieren Sie nach Schlüsselpaar erzeugen die kid aus der JWKS-Ausgabe und ergänzen Sie sie im Header-JSON, zum Beispiel "kid": "…". Prüfer wählen damit den richtigen Schlüssel aus ihrem Schlüsselsatz.