Signatur
Beschreibung
Die Eigenschaft usages eines CryptoKey enthält ein Array von Strings, das festlegt, welche Operationen der Web Crypto API mit diesem Schlüssel erlaubt sind. Mögliche Werte sind "encrypt", "decrypt", "sign", "verify", "deriveKey", "deriveBits", "wrapKey" und "unwrapKey".
Die Verwendungszwecke werden beim Erzeugen oder Importieren des Schlüssels über den Parameter keyUsages von SubtleCrypto.generateKey(), importKey(), deriveKey() oder unwrapKey() festgelegt. Danach lassen sie sich nicht mehr ändern. Ruft man eine Operation auf, die nicht in usages steht (z. B. subtle.sign() mit einem Schlüssel, der nur ["verify"] erlaubt), wird das Promise mit einer InvalidAccessError-DOMException abgelehnt.
In der Praxis dient usages vor allem dazu, das Prinzip der minimalen Rechte umzusetzen. Ein Schlüssel sollte nur die Operationen erlauben, die er wirklich braucht. Beim Prüfen von Schlüsseln, etwa vor dem Speichern in IndexedDB oder in Hilfsfunktionen, kann man anhand von usages vorab feststellen, ob eine Operation erlaubt ist.
Bei asymmetrischen Schlüsselpaaren (CryptoKeyPair) verteilt der Browser die angegebenen Verwendungszwecke automatisch: Der öffentliche Schlüssel bekommt z. B. "encrypt"/"verify"/"wrapKey", der private "decrypt"/"sign"/"unwrapKey"/"deriveKey"/"deriveBits".
Rückgabewert
["encrypt", "decrypt"]. Kann leer sein, etwa bei öffentlichen ECDH-Schlüsseln.Beispiele
Verwendungszwecke eines AES-Schlüssels auslesen
const key = await crypto.subtle.generateKey(
{ name: 'AES-GCM', length: 256 },
true,
['encrypt', 'decrypt']
);
console.log(key.usages);
Automatische Aufteilung bei einem Schlüsselpaar
const { publicKey, privateKey } = await crypto.subtle.generateKey(
{ name: 'ECDSA', namedCurve: 'P-256' },
false,
['sign', 'verify']
);
console.log('öffentlich:', publicKey.usages);
console.log('privat:', privateKey.usages);
Operation vorab prüfen statt Fehler abfangen
const canUse = (key, usage) => key.usages.includes(usage);
const key = await crypto.subtle.generateKey(
{ name: 'HMAC', hash: 'SHA-256' },
false,
['verify'] // bewusst nur Prüfen erlaubt
);
if (!canUse(key, 'sign')) {
console.log('Schlüssel darf nicht signieren');
}
try {
await crypto.subtle.sign('HMAC', key, new TextEncoder().encode('Hallo'));
} catch (err) {
console.log(err.name);
}
Verwendungszwecke beim Import einschränken
const rawKey = crypto.getRandomValues(new Uint8Array(32));
// Nur zum Entschlüsseln importieren – Verschlüsseln ist damit ausgeschlossen
const decryptOnly = await crypto.subtle.importKey(
'raw',
rawKey,
'AES-GCM',
false,
['decrypt']
);
console.log(decryptOnly.usages, decryptOnly.extractable);
// Wichtig · Fallstricke
- Schreibgeschützt:
usageskann nach der Erzeugung nicht geändert werden. Wer andere Verwendungszwecke braucht, muss den Schlüssel neu erzeugen oder, fallsextractablegesetzt ist, exportieren und mit anderenkeyUsagesneu importieren. - Ungültige Kombinationen: Gibt man Verwendungszwecke an, die der Algorithmus nicht unterstützt (z. B.
"sign"bei AES-GCM), lehntgenerateKey()/importKey()mit einemSyntaxErrorab. Das passiert auch bei einem leerenkeyUsages-Array für geheime oder private Schlüssel. - Reihenfolge: Die Reihenfolge der Einträge ist nicht garantiert. Deshalb mit
includes()prüfen und nicht per Index oder Array-Vergleich. - Sicherheit:
usagesschränkt nur die Nutzung über die Web Crypto API ein. Ist ein Schlüsselextractable, kann das Schlüsselmaterial trotzdem exportiert und anderswo beliebig genutzt werden. Für echte Einschränkungextractable: falsemit minimalenusageskombinieren. - Kompatibilität: Wird in allen modernen Browsern unterstützt, allerdings nur in sicheren Kontexten (HTTPS,
localhost). In Node.js steht die Eigenschaft übercrypto.webcryptobzw. ab Version 19 über das globalecryptozur Verfügung.