Signatur
Beschreibung
Das Crypto-Interface stellt grundlegende Kryptografie-Funktionen des aktuellen Kontexts bereit. Du erreichst die Instanz über die globale Eigenschaft crypto (window.crypto im Hauptthread, self.crypto in Workern). Ein eigener Konstruktor existiert nicht – new Crypto() löst einen TypeError aus.
Das Interface besteht aus drei Bausteinen:
crypto.getRandomValues(typedArray)– füllt ein Integer-Typed-Array mit kryptografisch sicheren Zufallswerten, zum Beispiel für Tokens, Nonces oder Salts.crypto.randomUUID()– liefert eine zufällige UUID der Version 4 als String mit 36 Zeichen.crypto.subtle– einSubtleCrypto-Objekt für Hashing, Signaturen, Ver- und Entschlüsselung sowie Schlüsselverwaltung (AES, RSA, ECDSA, HMAC, SHA-256 u. a.).
Nimm Crypto immer dann, wenn Zufall sicherheitsrelevant ist. Math.random() ist dafür nicht geeignet, weil seine Ausgabe vorhersagbar sein kann. Für echte kryptografische Operationen wie Hashes und Verschlüsselung nimmst du crypto.subtle statt selbst gebauter Algorithmen.
Rückgabewert
globalThis.crypto. Sie hat die Eigenschaft subtle (SubtleCrypto) sowie die Methoden getRandomValues() (gibt dasselbe Typed Array zurück) und randomUUID() (gibt string zurück).Beispiele
Sicheren Zufalls-Token erzeugen (getRandomValues)
// 32 zufällige Bytes als Hex-String, z. B. für CSRF-Tokens
const createToken = (byteLength = 32) => {
const bytes = crypto.getRandomValues(new Uint8Array(byteLength));
return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
};
const token = createToken();
console.log(token.length);
Eindeutige IDs mit randomUUID()
// Client-seitige IDs für neue Einträge in einer Liste
const todos = [];
const addTodo = (text) => {
const todo = { id: crypto.randomUUID(), text, done: false };
todos.push(todo);
return todo;
};
const todo = addTodo('Referenz schreiben');
console.log(/^[0-9a-f-]{36}$/.test(todo.id), todo.id[14]);
SHA-256-Hash über crypto.subtle berechnen
const sha256 = async (text) => {
const data = new TextEncoder().encode(text);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
return Array.from(new Uint8Array(hashBuffer), (b) => b.toString(16).padStart(2, '0')).join('');
};
console.log(await sha256('hallo'));
Zufällige Ganzzahl ohne Modulo-Verzerrung
// Gleichverteilte Zahl im Bereich [0, max) per Rejection Sampling
const secureRandomInt = (max) => {
const limit = Math.floor(0x100000000 / max) * max;
const buf = new Uint32Array(1);
do {
crypto.getRandomValues(buf);
} while (buf[0] >= limit);
return buf[0] % max;
};
// Würfelwurf 1–6
console.log(secureRandomInt(6) + 1);
// Wichtig · Fallstricke
- Sicherer Kontext:
crypto.subtleundrandomUUID()gibt es nur in sicheren Kontexten (HTTPS oderlocalhost). Über reines HTTP istcrypto.subtleundefined.getRandomValues()funktioniert dagegen überall. - Größenlimit:
getRandomValues()akzeptiert höchstens 65.536 Bytes pro Aufruf, sonst kommt einQuotaExceededError. Erlaubt sind nur Integer-Typed-Arrays.Float32ArrayundFloat64Arraylösen einenTypeMismatchErroraus. - Kein Ersatz für Server-Sicherheit: Code im Client lässt sich einsehen und manipulieren. Geheime Schlüssel gehören nicht in den Browser-Quelltext.
Math.random()ist nicht sicher: Für Passwörter, Tokens oder Session-IDs musst du immercryptonehmen.- Methoden nicht abtrennen:
const { getRandomValues } = crypto; getRandomValues(arr)wirft einenTypeError(Illegal invocation). Rufe die Methoden immer über dascrypto-Objekt auf oder binde sie mit.bind(crypto). - Node.js: Global verfügbar als
globalThis.cryptoab Node.js 19. In älteren Versionen nutzt durequire('node:crypto').webcrypto. Das Node-Modulnode:cryptoist eine eigene, abweichende API. - Kompatibilität:
getRandomValues()undsubtlelaufen in allen modernen Browsern.randomUUID()gibt es seit Chrome 92, Firefox 95 und Safari 15.4.