Signatur
Beschreibung
Die schreibgeschützte Eigenschaft window.crypto gibt das Crypto-Objekt zurück, das dem globalen Gültigkeitsbereich des Fensters zugeordnet ist. Da crypto global ist, kann man es auch direkt als crypto ansprechen. In Web Workern gibt es das gleiche Objekt als self.crypto (WorkerGlobalScope.crypto), in Node.js ab Version 19 als globales crypto (vorher über require('node:crypto').webcrypto).
Über das Crypto-Objekt stehen drei zentrale Funktionen zur Verfügung:
crypto.getRandomValues(typedArray)– füllt ein ganzzahliges Typed Array mit kryptografisch sicheren Zufallswerten.crypto.randomUUID()– erzeugt eine zufällige UUID der Version 4 als String.crypto.subtle– liefert einSubtleCrypto-Objekt für Hashing, Verschlüsselung, Signaturen und Schlüsselverwaltung.
Man verwendet window.crypto immer dann, wenn Zufall sicherheitsrelevant ist – etwa für Tokens, Nonces, Session-IDs, Passwörter oder Schlüssel. Math.random() ist dafür ungeeignet, weil es nicht kryptografisch sicher ist und vorhersagbare Werte liefern kann.
Rückgabewert
Crypto-Objekt des Fensters mit den Methoden getRandomValues(), randomUUID() und der Eigenschaft subtle.Beispiele
Sichere Zufallszahlen erzeugen
// 16 zufällige Bytes für ein Token
const bytes = window.crypto.getRandomValues(new Uint8Array(16));
// In Hex-String umwandeln
const token = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
console.log(token.length);
Eindeutige ID mit randomUUID()
// z. B. als Schlüssel für neue Einträge im Client
const createTodo = (text) => ({ id: crypto.randomUUID(), text, done: false });
const todo = createTodo('Einkaufen');
console.log(todo.id);
SHA-256-Hash über crypto.subtle
const sha256 = async (text) => {
const data = new TextEncoder().encode(text);
const hashBuffer = await window.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'));
Unverzerrte Zufallszahl in einem Bereich
// Ganzzahl in [min, max] ohne Modulo-Verzerrung
const randomInt = (min, max) => {
const range = max - min + 1;
const limit = Math.floor(0x100000000 / range) * range;
const buf = new Uint32Array(1);
do {
crypto.getRandomValues(buf);
} while (buf[0] >= limit);
return min + (buf[0] % range);
};
console.log(randomInt(1, 6)); // Würfelwurf
// Wichtig · Fallstricke
- Sicherer Kontext:
crypto.subtleundcrypto.randomUUID()sind nur in sicheren Kontexten (HTTPS oderlocalhost) verfügbar. Über unverschlüsseltes HTTP istcrypto.subtleundefined.getRandomValues()funktioniert dagegen überall. - Größenlimit:
getRandomValues()wirft einenQuotaExceededError, wenn das Array größer als 65.536 Bytes ist. Größere Mengen muss man in Blöcken erzeugen. - Nur ganzzahlige Typed Arrays:
Float32ArrayundFloat64Arraywerden abgelehnt (TypeMismatchError). - Modulo-Verzerrung:
wert % nverteilt die Werte nicht gleichmäßig, wenn n kein Teiler des Wertebereichs ist – für faire Ergebnisse das Rejection-Sampling aus dem Beispiel oben verwenden. - Kein Ersatz für Server-Sicherheit: Code und Schlüssel im Browser kann der Nutzer einsehen und verändern. Clientseitige Kryptografie schützt nicht vor einem kompromittierten Skript (z. B. durch XSS).
- Kompatibilität:
randomUUID()gibt es seit Chrome 92, Firefox 95 und Safari 15.4. Der alte IE 11 kannte nur das Präfix-Objektwindow.msCrypto.