Start · Sprachen · JavaScript · Referenz · Window.crypto

Window.crypto

Eigenschaft

Schreibgeschützte Eigenschaft, die das <code>Crypto</code>-Objekt des aktuellen Fensters liefert – Zugang zu kryptografisch sicheren Zufallswerten und zur Web Crypto API.

seit JavaScript Baseline: alle Browser (window.crypto seit langem, Kategorie: webapi

Signatur

get Window.crypto

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 ein SubtleCrypto-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

Typ
Crypto
Beschreibung
Das 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);
32

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);
z. B. "3b241101-e2bb-4255-8caf-4136c566a962"

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'));
d3751d33f9cd5049c4af2b462735457e4d3baf130bcbb87f389e349fbaeb20b9

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
z. B. 4

// Wichtig · Fallstricke

  • Sicherer Kontext: crypto.subtle und crypto.randomUUID() sind nur in sicheren Kontexten (HTTPS oder localhost) verfügbar. Über unverschlüsseltes HTTP ist crypto.subtle undefined. getRandomValues() funktioniert dagegen überall.
  • Größenlimit: getRandomValues() wirft einen QuotaExceededError, wenn das Array größer als 65.536 Bytes ist. Größere Mengen muss man in Blöcken erzeugen.
  • Nur ganzzahlige Typed Arrays: Float32Array und Float64Array werden abgelehnt (TypeMismatchError).
  • Modulo-Verzerrung: wert % n verteilt 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-Objekt window.msCrypto.