Woher der Zufall kommt
crypto.getRandomValues fragt den CSPRNG des Betriebssystems (getrandom() auf Linux, SecRandomCopyBytes auf macOS, BCryptGenRandom auf Windows), der aus Hardware-Ereignissen und auf modernen CPUs der RDRAND-Instruktion gespeist wird. Er ist in beide Richtungen unvorhersagbar: Eine Million Ausgaben zu kennen verrät nichts über die nächste. Math.random() ist das nicht; es ist ein schneller PRNG mit kleinem internem Zustand, gut für Spiele und nie für Geheimnisse.
Wie viele Bytes
| Zweck | Bytes | Warum |
|---|---|---|
| Session-ID, CSRF-Token | 16–32 | 128 Bit sind jenseits von Brute Force; 32 Bytes sind die übliche Vorgabe. |
| API-Key / Secret | 32 | 256 Bit; zur Speicherung mit SHA-256 gehasht, wie ein Passwort, aber ohne langsames Hashing, weil es zufällig ist. |
| HMAC- / JWT-Signierschlüssel | 32–64 | An die Hash-Ausgabe angepasst: 32 für SHA-256, 64 für SHA-512. |
| AES-Schlüssel | 16 / 32 | AES-128 oder AES-256. |
| Salt | 16 | Eindeutigkeit zählt; 128 Bit garantieren sie. |
| Passwort-Reset-Token in einer URL | 16–24 | Base64URL hält es kurz; den Hash speichern, schnell ablaufen lassen. |
Zufallszahlen ohne Verzerrung
zufallsbyte % 6 für einen Würfel ist subtil falsch: 256 ist nicht durch 6 teilbar, also kommen 1–4 etwas häufiger als 5–6. Die korrekte Methode zieht einen Wert, verwirft ihn, wenn er in den Restbereich oben fällt, und versucht es erneut; das macht dieser Generator, und das machen secrets.randbelow, crypto.randomInt und rand.Intn.
Keys mit Präfix
Präfixe wie sk_live_, ghp_ oder AKIA bringen keine Sicherheit, machen Keys aber in Logs erkennbar und lassen Secret-Scanner (GitHubs, gitleaks) geleakte finden. Wählen Sie ein für Ihren Dienst eindeutiges Präfix und halten Sie den Zufallsteil bei 32 Bytes.
Fragen
Ist das so gut wie openssl rand oder /dev/urandom?
Ja: Der Browser ruft denselben Betriebssystem-Generator auf, den diese Werkzeuge lesen. Die Ausgabe eignet sich für Schlüssel und Geheimnisse. Wenn Sie es ohnehin in einer Shell brauchen: openssl rand -hex 32, oder head -c 32 /dev/urandom | base64.
Soll ich API-Keys gehasht speichern?
Ja, mit einem schnellen Hash wie SHA-256; weil der Key zufällig ist, ist ein langsamer Passwort-Hash unnötig. Zeigen Sie den Key einmal bei der Erstellung und behalten Sie nur den Hash, wie GitHub und Stripe es tun.
Was ist Base64URL?
Base64 mit - und _ statt + und /, meist ohne Padding, sodass der Wert ohne Escaping in einer URL oder einem Cookie stehen kann. JWTs und die meisten modernen Tokens nutzen es.
Warum nicht einfach eine UUID als Token?
Eine UUIDv4 hat 122 Zufallsbits, was reicht, aber ihr festes Format verrät, was sie ist, und verschwendet Zeichen auf Bindestriche. Für Geheimnisse sind rohe Zufallsbytes in Base64URL kürzer und stärker. UUIDs sind für Kennungen, nicht für Geheimnisse.