Signatur
Beschreibung
Die Eigenschaft algorithm eines CryptoKey liefert ein Objekt, das beschreibt, für welchen Algorithmus der Schlüssel erzeugt oder importiert wurde. Es enthält immer die Eigenschaft name (z. B. "AES-GCM", "RSA-PSS", "ECDSA", "HMAC", "Ed25519") und je nach Algorithmus weitere Angaben.
Welche Form das Objekt hat, hängt vom Algorithmus ab:
- AesKeyAlgorithm (AES-CBC, AES-CTR, AES-GCM, AES-KW):
name,length(128, 192 oder 256 Bit). - RsaHashedKeyAlgorithm (RSASSA-PKCS1-v1_5, RSA-PSS, RSA-OAEP):
name,modulusLength,publicExponent(Uint8Array),hash({ name }). - EcKeyAlgorithm (ECDSA, ECDH):
name,namedCurve(z. B."P-256"). - HmacKeyAlgorithm:
name,hash({ name }),lengthin Bit. - KeyAlgorithm (z. B. Ed25519, X25519, PBKDF2, HKDF): nur
name.
Nützlich ist die Eigenschaft vor allem, um unbekannte Schlüssel zu prüfen (etwa nach importKey() oder beim Laden aus IndexedDB), bevor man sie an sign(), encrypt() oder deriveKey() übergibt, sowie für Logging und Debugging. Zusammen mit type, usages und extractable ergibt sich ein vollständiges Bild der Schlüsseleigenschaften.
Rückgabewert
name sowie algorithmusspezifischen Feldern wie length, modulusLength, publicExponent, hash oder namedCurve.Beispiele
AES-GCM-Schlüssel erzeugen und Algorithmus auslesen
const key = await crypto.subtle.generateKey(
{ name: 'AES-GCM', length: 256 },
true,
['encrypt', 'decrypt']
);
console.log(key.algorithm);
console.log(`${key.algorithm.name} mit ${key.algorithm.length} Bit`);
RSA-PSS-Schlüsselpaar: Hash und Modulus prüfen
const { publicKey, privateKey } = await crypto.subtle.generateKey(
{
name: 'RSA-PSS',
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: 'SHA-256'
},
true,
['sign', 'verify']
);
const { name, modulusLength, hash, publicExponent } = publicKey.algorithm;
console.log(name, modulusLength, hash.name, publicExponent);
Importierten Schlüssel vor der Verwendung validieren
// Prüft, ob ein Schlüssel für ECDSA auf P-256 geeignet ist
const assertEcdsaP256 = (key) => {
const alg = key.algorithm;
if (alg.name !== 'ECDSA' || alg.namedCurve !== 'P-256') {
throw new TypeError(`Unerwarteter Schlüssel: ${JSON.stringify(alg)}`);
}
if (!key.usages.includes('verify')) {
throw new TypeError('Schlüssel darf nicht verifizieren');
}
};
const { publicKey } = await crypto.subtle.generateKey(
{ name: 'ECDSA', namedCurve: 'P-256' },
true,
['sign', 'verify']
);
const jwk = await crypto.subtle.exportKey('jwk', publicKey);
const imported = await crypto.subtle.importKey(
'jwk', jwk, { name: 'ECDSA', namedCurve: 'P-256' }, true, ['verify']
);
assertEcdsaP256(imported);
console.log('OK:', imported.algorithm);
HMAC-Schlüssel: Standardlänge ermitteln
const hmacKey = await crypto.subtle.generateKey(
{ name: 'HMAC', hash: 'SHA-512' },
false,
['sign', 'verify']
);
// Ohne length-Angabe entspricht die Länge der Blockgröße des Hashs
console.log(hmacKey.algorithm.hash.name, hmacKey.algorithm.length);
// Wichtig · Fallstricke
- Schreibgeschützt: Zuweisungen an
key.algorithmwerden ignoriert (im Strict ModeTypeError). Das zurückgegebene Objekt ist eine Kopie; Änderungen daran wirken sich nicht auf den Schlüssel aus. - Hash immer als Objekt: Auch wenn beim Erzeugen
hash: 'SHA-256'als String angegeben wurde, liefertalgorithm.hashein Objekt{ name: 'SHA-256' }. Vergleiche daher mitalg.hash.name. - Name-Normalisierung: Algorithmusnamen werden auf die kanonische Schreibweise normalisiert (
'aes-gcm'wird zu'AES-GCM'). - Nicht für Parameter pro Operation: Werte wie IV,
saltLengthoderlabelsind nicht enthalten – sie werden bei jedemencrypt()/sign()-Aufruf übergeben. - Sichere Kontexte:
crypto.subtlesteht nur unter HTTPS bzw.localhostzur Verfügung. Ed25519/X25519 werden erst in neueren Browserversionen unterstützt; in Node.js ist die API überglobalThis.crypto(ab v19 global, ab v15 überrequire('node:crypto').webcrypto) verfügbar. JSON.stringify(key.algorithm)stelltpublicExponent(Uint8Array) als Objekt mit Indexschlüsseln dar – für Logging ggf. vorher umwandeln.