SubtleCrypto: generateKey()-Methode

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Hinweis: Dieses Feature ist verfügbar in Web Workers.

Die generateKey()-Methode der SubtleCrypto-Schnittstelle wird verwendet, um einen neuen Schlüssel (für symmetrische Algorithmen) oder ein Schlüsselpaar (für Public-Key-Algorithmen) zu generieren.

Syntax

js
generateKey(algorithm, extractable, keyUsages)

Parameter

algorithm

Ein Objekt, das den zu generierenden Schlüsseltyp definiert und zusätzliche algorithmenspezifische Parameter bereitstellt.

extractable

Ein boolescher Wert, der angibt, ob es möglich sein wird, den Schlüssel mit SubtleCrypto.exportKey() oder SubtleCrypto.wrapKey() zu exportieren.

keyUsages

Ein Array von Zeichenfolgen, die angeben, was mit dem neu generierten Schlüssel gemacht werden kann. Mögliche Werte für Array-Elemente sind:

encrypt

Der Schlüssel kann verwendet werden, um Nachrichten zu verschlüsseln.

decrypt

Der Schlüssel kann verwendet werden, um Nachrichten zu entschlüsseln.

sign

Der Schlüssel kann verwendet werden, um Nachrichten zu signieren.

verify

Der Schlüssel kann verwendet werden, um Signaturen zu überprüfen.

deriveKey

Der Schlüssel kann verwendet werden, um einen neuen Schlüssel abzuleiten.

deriveBits

Der Schlüssel kann verwendet werden, um Bits abzuleiten.

wrapKey

Der Schlüssel kann verwendet werden, um einen Schlüssel zu verpacken.

unwrapKey

Der Schlüssel kann verwendet werden, um einen Schlüssel zu entpacken.

Rückgabewert

Ein Promise, das mit einem CryptoKey (für symmetrische Algorithmen) oder einem CryptoKeyPair (für Public-Key-Algorithmen) erfüllt wird.

Ausnahmen

Das Promise wird abgelehnt, wenn die folgende Ausnahme auftritt:

SyntaxError DOMException

Wird ausgelöst, wenn das Ergebnis ein CryptoKey vom Typ secret oder private ist, aber keyUsages leer oder für den Algorithmustyp ungültig ist.

SyntaxError DOMException

Wird ausgelöst, wenn das Ergebnis ein CryptoKeyPair ist und sein privateKey.usages-Attribut leer oder für den Algorithmustyp ungültig ist.

Beispiele

RSA-Schlüsselpaar-Generierung

Dieser Code generiert ein RSA-OAEP Verschlüsselungs-Schlüsselpaar. Sehen Sie sich den vollständigen Code auf GitHub an.

js
let keyPair = await window.crypto.subtle.generateKey(
  {
    name: "RSA-OAEP",
    modulusLength: 4096,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: "SHA-256",
  },
  true,
  ["encrypt", "decrypt"],
);

Elliptische-Kurve-Schlüsselpaar-Generierung

Dieser Code generiert ein ECDSA-Signaturschlüsselpaar. Sehen Sie sich den vollständigen Code auf GitHub an.

js
let keyPair = await window.crypto.subtle.generateKey(
  {
    name: "ECDSA",
    namedCurve: "P-384",
  },
  true,
  ["sign", "verify"],
);

HMAC-Schlüsselerzeugung

Dieser Code generiert einen HMAC-Signaturschlüssel. Sehen Sie sich den vollständigen Code auf GitHub an.

js
let key = await window.crypto.subtle.generateKey(
  {
    name: "HMAC",
    hash: { name: "SHA-512" },
  },
  true,
  ["sign", "verify"],
);

AES-Schlüsselerzeugung

Dieser Code generiert einen AES-GCM Verschlüsselungsschlüssel. Sehen Sie sich den vollständigen Code auf GitHub an.

js
let key = await window.crypto.subtle.generateKey(
  {
    name: "AES-GCM",
    length: 256,
  },
  true,
  ["encrypt", "decrypt"],
);

Ed25519-Schlüsselerzeugung

Dieser Code generiert ein Ed25519 Signatur-Schlüsselpaar. Er stammt aus diesem Quellcode auf GitHub, den Sie hier live ausführen können.

JavaScript

Der Code zur Erzeugung eines Schlüsselpaares mit dem Ed25519-Algorithmus und zum Protokollieren der Informationen in jedem Schlüssel wird unten gezeigt. Beachten Sie, dass der Code in einem try..catch-Block ausgeführt wird, da nicht alle Browser diesen Algorithmus unterstützen.

Das JavaScript holt zuerst die #sign-button und #message <input> Elemente und fügt dann einen Listener für das click Ereignis auf dem Button hinzu. Der Ereignishandler löscht das Protokoll und führt die anderen Operationen aus, indem er den Inhalt des <input> Elements übergibt.

js
const button = document.querySelector("#run-button");
const input = document.querySelector("#log");

button.addEventListener("click", () => {
  // Clear log
  logElement.innerText = "";
  logElement.scrollTop = logElement.scrollHeight;
  // Run test
  test();
});

async function test() {
  try {
    // Create a key pair and use destructuring assignment to assign to variables
    const { publicKey, privateKey } = await crypto.subtle.generateKey(
      {
        name: "Ed25519",
      },
      true,
      ["sign", "verify"],
    );

    // Log the properties of the keys
    log(`publicKey: ${publicKey}`);
    log(` type: ${publicKey.type}`);
    log(` extractable: ${publicKey.extractable}`);
    log(` algorithm: ${JSON.stringify(publicKey.algorithm)}`);
    log(` usages: ${publicKey.usages}`);
    log(`privateKey: ${privateKey}`);
    log(` type: ${privateKey.type}`);
    log(` extractable: ${privateKey.extractable}`);
    log(` algorithm: ${JSON.stringify(privateKey.algorithm)}`);
    log(` usages: ${privateKey.usages}`);
  } catch (error) {
    log(error);
  }
}

Ergebnis

Die Informationen zu den erstellten Schlüsseln werden unten protokolliert (oder eine Fehlermeldung, wenn der Browser das Erstellen des Schlüssels nicht zulässt).

X25519-Schlüsselerzeugung

Dieser Code generiert ein X25519-Öffentliches und Privates Schlüsselpaar, das in SubtleCrypto.deriveKey() zum Erstellen eines gemeinsamen Schlüssels oder in SubtleCrypto.deriveBits() zum Erstellen eines gemeinsamen Geheimnisses verwendet werden kann.

JavaScript

Der Code zur Erzeugung eines Schlüsselpaares mit dem X25519-Algorithmus und zum Protokollieren der Informationen in jedem Schlüssel wird unten gezeigt. Beachten Sie, dass der Code in einem try..catch-Block ausgeführt wird, da nicht alle Browser diesen Algorithmus unterstützen.

Das JavaScript holt zuerst die #run-button und #log <input> Elemente und fügt dann einen Listener für das click Ereignis auf dem Button hinzu. Der Ereignishandler löscht das Protokoll, generiert ein X25519-Schlüsselpaar und protokolliert einige seiner Eigenschaften.

js
const button = document.querySelector("#run-button");
const input = document.querySelector("#log");

button.addEventListener("click", () => {
  // Clear log
  logElement.innerText = "";
  logElement.scrollTop = logElement.scrollHeight;
  // Run test
  test();
});

async function test() {
  try {
    // Create a key pair and use destructuring assignment to assign to variables
    const { publicKey, privateKey } = await crypto.subtle.generateKey(
      {
        name: "X25519",
      },
      true,
      ["deriveKey", "deriveBits"],
    );

    // Log the properties of the keys
    log(`publicKey: ${publicKey}`);
    log(` type: ${publicKey.type}`);
    log(` extractable: ${publicKey.extractable}`);
    log(` algorithm: ${JSON.stringify(publicKey.algorithm)}`);
    log(` usages: ${publicKey.usages}`);
    log(`privateKey: ${privateKey}`);
    log(` type: ${privateKey.type}`);
    log(` extractable: ${privateKey.extractable}`);
    log(` algorithm: ${JSON.stringify(privateKey.algorithm)}`);
    log(` usages: ${privateKey.usages}`);
  } catch (error) {
    log(error);
  }
}

Ergebnis

Die Informationen zu den erstellten Schlüsseln werden unten protokolliert (oder eine Fehlermeldung, wenn der Browser das Erstellen des Schlüssels nicht zulässt).

Spezifikationen

Specification
Web Cryptography API
# SubtleCrypto-method-generateKey

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch