Token-Generator

Erzeugt Geheimnisse aus dem Krypto-Zufallsgenerator des Browsers — hex, base64url oder ein eigenes Alphabet, dazu EFF-Passphrasen — mit Entropie in Bit.

Wird erzeugt…
Entropie192.0 Bit

Mittlere Zeit bis zum Fund, bei drei Rateraten. Ihr Abstand ist größer als jeder Unterschied, den das Geheimnis selbst macht.

  • Gegen eine Anmeldung mit Ratenbegrenzung — 10 Versuche/s10^49 Jahre
  • Gegen einen geleakten langsamen Hash (bcrypt, argon2) — 10⁴/s10^46 Jahre
  • Gegen einen geleakten schnellen Hash (SHA-256, MD5) — 10¹²/s10^38 Jahre

Gezogen aus 64 Zeichen, jedes trägt also 6.00 Bit.

Was dieses Werkzeug tut

Es erzeugt Geheimnisse: Werte, deren einzige Verteidigung darin besteht, dass niemand sie erraten kann. Wählen Sie ein Alphabet und eine Länge für einen API-Schlüssel oder ein Datenbankpasswort, oder wechseln Sie zu einer Passphrase aus einer veröffentlichten Wortliste für etwas, das ein Mensch tippen muss. Jedes Ergebnis entsteht in Ihrem Browser und wird mit der einen Zahl gezeigt, die seine Stärke ehrlich beschreibt.

Das ist eine andere Aufgabe als die des UUID-Generators auf dieser Seite. Eine UUID muss eindeutig sein, damit zwei Datensätze nie kollidieren; ein Geheimnis muss unerratbar sein, was eine stärkere Forderung und ein anderes Versagen ist. Ein vorhersagbarer Bezeichner ist harmlos. Ein vorhersagbares Geheimnis ist eine offene Tür.

Woher der Zufall kommt

Alles hier zieht aus crypto.getRandomValues, dem kryptografisch sicheren Zufallsgenerator des Browsers, gespeist aus dem Entropiepool des Betriebssystems — derselben Quelle, aus der auch openssl rand und /dev/urandom schöpfen.

Die Alternative, Math.random, ist keine Sicherheitsfunktion und hat das nie behauptet. Sie ist ein schneller Pseudozufallsgenerator mit kleinem inneren Zustand, und in jeder aktuellen Engine lässt sich dieser Zustand aus einer kurzen Folge von Ausgaben zurückrechnen; danach ist jeder vergangene und künftige Wert bekannt. Ein daraus gebautes Token sieht genauso zufällig aus wie ein echtes — der Unterschied zeigt sich erst, wenn jemand sich die Mühe macht hinzusehen.

Man darf fragen, ob eine Webseite überhaupt der richtige Ort für ein Produktivgeheimnis ist. Die Erzeugung selbst ist solide: Es ist der CSPRNG der Plattform, die Seite ist statisch, und nichts wird übertragen. Bedenkenswert ist das Drumherum — ein Geheimnis, das über die Zwischenablage geht, kann für andere Programme lesbar sein, und eines, das in ein Terminal eingefügt wird, landet meist in der Shell-Historie. Das sind dieselben Überlegungen wie bei jedem anderen Weg.

Die Verzerrung, die in der naheliegenden Umsetzung steckt

Zufallsbytes in Zeichen zu verwandeln sieht nach einer Zeile aus: ein Byte nehmen, modulo Alphabetgröße rechnen, indizieren. Für jedes Alphabet, dessen Größe 256 nicht glatt teilt, ist das leise falsch, und die Ausgabe verrät davon nichts.

Bei 62 alphanumerischen Zeichen geht die Teilung nicht auf: 62 passt viermal in 256, und 8 bleiben übrig. Diese 8 übrigen Bytewerte — 248 bis 255 — falten sich auf die ersten 8 Zeichen des Alphabets zurück, jedes von ihnen bekommt also fünf Chancen von 256, die übrigen vier. Die ersten acht Zeichen sind rund 25 % wahrscheinlicher als die anderen.

Die Abhilfe ist die Verwerfungsmethode: einen Zug, der in den Überhang fällt, wegwerfen und neu ziehen, statt ihn zurückzufalten. Das kostet bei einem 62-Zeichen-Alphabet etwa einen zusätzlichen Zug von zweiunddreißig und bei hex oder base64url gar nichts, weil deren Größen Zweierpotenzen sind und es keinen Überhang gibt. Dieses Werkzeug verwirft; an keinem einzelnen Token ist das zu sehen, und genau deshalb gehört es gesagt.

Entropie, das einzige ehrliche Maß

Entropie in Bit sagt, wie groß der Raum gleich wahrscheinlicher Geheimnisse ist: n Bit heißt 2^n Möglichkeiten. Sie ist additiv und leicht zu vergleichen, und sie sagt nichts darüber, wie schnell jemand diesen Raum durchsuchen kann — was ein Vorzug ist, denn dieser Teil hängt an Dingen, die ein Generator nicht wissen kann.

Die Rechnung ist absichtlich einfach. Jedes Zeichen trägt log2(Alphabetgröße) Bit bei und jedes Wort log2(Listengröße), also:

  • Ein Hex-Zeichen sind 4 Bit, ein 32-stelliges Hex-Token also genau 128 Bit — ein ausgeschriebener AES-128-Schlüssel.
  • Ein base64url-Zeichen sind 6 Bit, 22 Zeichen überschreiten also 128 Bit und 43 überschreiten 256.
  • Ein alphanumerisches Zeichen sind rund 5,95 Bit; das Ausschließen der Verwechselbaren senkt das Alphabet auf 58 und das Zeichen auf 5,86, was etwa ein Zeichen Länge je zwölf kostet.
  • Ein Wort der langen EFF-Liste sind 12,925 Bit, denn die Liste hat 7776 Einträge, also 6^5 — fünf Würfelwürfe.
  • Ein Wort der kurzen Liste sind 10,34 Bit, aus 1296 Einträgen, also 6^4.

Ein üblicher Zielwert sind 128 Bit — der Punkt, an dem rohe Gewalt aufhört, eine Strategie zu sein, statt bloß teuer zu werden. Das sind 32 Hex-Zeichen, 22 base64url-Zeichen oder 10 Wörter aus der langen EFF-Liste.

Warum es keine einzelne „Knackzeit“ gibt

Ein Geheimnis hat keine Knackzeit. Das Paar aus Geheimnis und dem, was es bewacht, hat eine, und der Wächter wiegt weit schwerer als das Geheimnis. Derselbe Wert, den man durch ein Anmeldeformular länger suchen müsste, als das Universum alt ist, fällt an einem Nachmittag, wenn er als ungesalzener SHA-256 gespeichert war und die Datenbank abfloss.

Deshalb stehen hier drei Raten statt einer Zahl, jede mit Namen:

  • Zehn Versuche pro Sekunde, gegen eine Anmeldung mit Ratenbegrenzung. Das ist die realistische Obergrenze für jemanden, der durch Ihren Dienst hindurch muss.
  • Zehntausend Versuche pro Sekunde, gegen einen geleakten Passwort-Hash, der absichtlich langsam ist — bcrypt mit heutigem Kostenfaktor oder argon2. Diese Langsamkeit ist der ganze Zweck jener Funktionen.
  • Eine Billion Versuche pro Sekunde, gegen einen geleakten Hash, der nie für Passwörter gedacht war. SHA-256 und MD5 sind auf Tempo gebaut, und ein GPU-Verbund ist außerordentlich schnell.

Die Raten sind bewusst auf Zehnerpotenzen gerundet. Etwas Genaueres würde eine Messung eines bestimmten Angreifers nahelegen, während die brauchbare Auskunft die elf Größenordnungen zwischen der ersten und der letzten Zeile sind. Ist ein Geheimnis in allen dreien bequem, ist die Frage ohne die genauen Zahlen erledigt.

Jede Angabe ist der Mittelwert, also der halbe Raum und nicht der ganze — eine Suche findet die Antwort im Mittel auf halbem Weg. Und jenseits einer Million Jahre wird die Antwort als Größenordnung gegeben, denn „vierhundert Billionen Jahre“ ist keine Dauer, die irgendwer vergleichen kann. Das Universum ist etwa 10^10 Jahre alt, ein nützlicher Anker für die Zeilen, die so weit reichen.

Passphrasen und woher ihre Stärke wirklich kommt

Eine Passphrase ist aus genau einem Grund stark: Mehrere Wörter wurden zufällig aus einer großen Liste gezogen. Nicht weil sie lang ist, und nicht weil sie nach Sprache aussieht. Sechs zufällige Wörter aus einer Liste von 7776 sind rund 77 Bit; sechs Wörter, die sich ein Mensch ausgedacht hat, sind weit weniger wert, denn Menschen wählen nicht gleichverteilt, und ein Angreifer weiß über gängige Wendungen dasselbe wie Sie.

Die beiden Listen hier stammen von der EFF und sind die veröffentlichten Diceware-Listen, unverändert heruntergeladen. Es sind keine hier zusammengestellten Listen, und das zählt: Eine selbst erfundene Wortliste hat unbekannte Größe, unbekannte Überschneidung mit anderen Listen und keine Möglichkeit, die über sie behauptete Entropie zu prüfen.

  • Die lange Liste hat 7776 Wörter, eines je Wurf mit fünf Würfeln, und gibt 12,925 Bit pro Wort.
  • Die kurze Liste hat 1296 Wörter, eines je Wurf mit vier Würfeln, und gibt 10,34 Bit pro Wort. Ihre Wörter sind kürzer — keines über fünf Buchstaben — was das Tippen erleichtert und dafür mehr Wörter für dieselbe Stärke verlangt.

Ein wiederholtes Wort in einer Passphrase ist kein Fehler und wird hier nicht neu gezogen. Jeder Zug ist unabhängig, jedes bestimmte Wortpaar also genauso wahrscheinlich wie jedes andere; Wiederholungen abzulehnen würde den Raum möglicher Passphrasen verkleinern und sie geringfügig schwächer machen, nicht stärker.

Beide EFF-Listen enthalten eine Handvoll Einträge mit Bindestrich: t-shirt, yo-yo, drop-down, felt-tip. Ist das Trennzeichen ebenfalls ein Bindestrich, lässt sich eine Passphrase mit einem solchen Wort nicht mehr eindeutig in ihre Wörter zerlegen. Das ist ein Darstellungs-, kein Sicherheitsproblem, und ein Leerzeichen oder ein Punkt als Trennzeichen vermeidet es ganz.

Die Optionen, die Entropie kosten, und die eine, die keine kostet

Die verwechselbaren Zeichen auszuschließen tauscht Stärke gegen Lesbarkeit, und der Tausch ist sichtbar. 0, O, I und l zu entfernen bringt das alphanumerische Alphabet von 62 auf 58 Zeichen — und das ist genau das base58-Alphabet, das Bitcoin verwendet, aus demselben Grund. Jedes Zeichen fällt von 5,95 auf 5,86 Bit, ein Token braucht also etwa ein Zeichen mehr je zwölf, um gleich stark zu bleiben. Für alles, was ein Mensch vom Bildschirm abliest und anderswo eintippt, lohnt sich das meist.

Die Option wird nur dort angeboten, wo sie etwas bedeutet. Hex und base64url sind Kodierungen, keine Zeichenvorräte: Ihre Alphabete legt eine Spezifikation fest, und Hex ohne 0 ist kein Hex mehr — nichts könnte es dekodieren.

Jedes Wort einer Passphrase groß zu beginnen fügt überhaupt nichts hinzu, und die Stärkeangabe rührt sich beim Einschalten absichtlich nicht. Es ist jedes Mal dieselbe Umformung, sie schafft also keine einzige neue Möglichkeit: Ein Angreifer, der weiß, dass großgeschrieben wird, steht genau dort, wo er anfing. Die Option gibt es, weil Passwortfelder noch immer einen Großbuchstaben verlangen, nicht weil sie hilft.

Die Länge wählen

Für alles, was eine Maschine handhabt — API-Schlüssel, Sitzungs-Token, Webhook-Geheimnisse, Datenbankpasswörter — gibt es keinen Grund zu sparen. 32 Hex-Zeichen oder 22 base64url-Zeichen ergeben 128 Bit, und weiterzugehen kostet nur Bytes in einer Konfigurationsdatei.

Für alles, was ein Mensch tippt, ist die Randbedingung eine andere, und eine Passphrase ist meist die bessere Form. Sechs Wörter aus der langen Liste sind stärker als ein zwölfstelliges Zufallspasswort und erheblich leichter im ersten Anlauf richtig zu treffen, was mehr wiegt, als es klingt: Ein Geheimnis, das Leute vertippen, ist ein Geheimnis, das Leute aufschreiben.

Für einen Zahlencode lautet die ehrliche Lesart, dass vier Ziffern 13 Bit sind und von allem, was nicht die Rate begrenzt, in Sekunden erschöpft werden. Eine PIN ist nur durch die Sperrrichtlinie um sie herum sicher, nie durch ihre eigene Stärke.

Häufig gestellte Fragen

Wie lang sollte ein API-Schlüssel sein?
Zielen Sie auf 128 Bit Entropie oder mehr — dort hört rohe Gewalt auf, eine Strategie zu sein. Das sind 32 Hex-Zeichen, 22 base64url-Zeichen, oder 43 base64url-Zeichen für 256 Bit. Für einen Wert, den nur Software anfasst, kostet die längere Variante nichts.
Ist das sicherer, als ein Geheimnis mit Math.random zu erzeugen?
Ja, und der Unterschied ist kein gradueller. Math.random ist ein Pseudozufallsgenerator mit kleinem Zustand, den heutige Engines aus einer kurzen Folge von Ausgaben zurückrechnen lassen; danach ist jeder Wert bekannt, den er je liefern wird. Dieses Werkzeug nutzt crypto.getRandomValues, den CSPRNG der Plattform, dieselbe Quelle, aus der openssl rand schöpft.
Warum zeigen Sie keine einzelne „Knackzeit“?
Weil es diese Zahl nicht gibt. Dasselbe Geheimnis ist hinter einer ratenbegrenzten Anmeldung unerreichbar und fällt hinter einem geleakten schnellen Hash rasch — elf Größenordnungen auseinander. Eine einzelne Angabe muss eine Annahme wählen und sie dann verbergen, und Leser behalten die Zahl, nicht die Annahme. Drei benannte Raten stellen die Annahme dorthin, wo man sie sieht.
Sind Passphrasen schwächer als Zufallszeichenketten?
Nein — die Stärke hängt allein daran, wie viele Wörter aus einer wie großen Liste gezogen werden, und beides wird angezeigt. Sechs Wörter aus der langen EFF-Liste sind rund 77 Bit, mehr als ein zehnstelliges Zufallspasswort. Was eine Passphrase schwächt, ist, die Wörter selbst zu wählen — was hier nicht geschieht.
Soll ich die verwechselbaren Zeichen ausschließen?
Wenn ein Mensch das Geheimnis vom Bildschirm abliest und anderswo eintippt: ja, der Preis ist klein und ein falsch gelesenes Token wird zum Support-Ticket. Wenn nur Software es anfasst, gibt es keinen Grund. 0, O, I und l zu entfernen bringt das Alphabet von 62 auf 58 Zeichen — genau das base58-Alphabet — und kostet etwa ein Zeichen Länge je zwölf.
Macht Großschreibung eine Passphrase stärker?
Nein. Es ist jedes Mal dieselbe Änderung und fügt dem Raum der Passphrasen keine einzige Möglichkeit hinzu. Die Entropieangabe bleibt beim Einschalten stehen, und das ist das richtige Verhalten. Die Option gibt es, weil manche Passwortfelder auf einem Großbuchstaben bestehen.
Wird etwas von dem, was ich erzeuge, an einen Server gesendet?
Nein. Die Erzeugung läuft vollständig in Ihrem Browser mit dem Zufallsgenerator der Plattform; nichts wird hochgeladen oder protokolliert, und es funktioniert ohne Netzverbindung. Die Token werden nirgends gespeichert — ein Neuladen erzeugt neue, und die alten sind fort.