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 Januar 2020.
* Some parts of this feature may have varying levels of support.
Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
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
generateKey(algorithm, extractable, keyUsages)
Parameter
algorithm-
Ein Objekt, das den Typ des zu generierenden Schlüssels definiert und zusätzliche algorithmusspezifische Parameter bereitstellt.
- Für RSASSA-PKCS1-v1_5, RSA-PSS,
oder RSA-OAEP:
geben Sie ein
RsaHashedKeyGenParamsObjekt an. - Für ECDSA oder ECDH:
geben Sie ein
EcKeyGenParamsObjekt an. - Für HMAC: geben Sie ein
HmacKeyGenParamsObjekt an. - Für AES-CTR, AES-CBC,
AES-GCM, oder AES-KW:
geben Sie ein
AesKeyGenParamsObjekt an. - Für Ed25519: übergeben Sie den String
Ed25519oder ein Objekt der Form{ name: "Ed25519" }. - Für X25519: übergeben Sie den String
X25519oder ein Objekt der Form{ name: "X25519" }.
- Für RSASSA-PKCS1-v1_5, RSA-PSS,
oder RSA-OAEP:
geben Sie ein
extractable-
Ein boolescher Wert, der angibt, ob es möglich sein wird, den Schlüssel mit
SubtleCrypto.exportKey()oderSubtleCrypto.wrapKey()zu exportieren. Beachten Sie, dass beim Erzeugen asymmetrischer Schlüsselpaare (wie RSA oder ECDSA) derextractableParameter bestimmt, ob der private Schlüssel exportiert werden kann; der öffentliche Schlüssel ist immer exportierbar. keyUsages-
Ein
Arrayvon Strings, das angibt, 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 verifizieren.
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 umhüllen.
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:
SyntaxErrorDOMException-
Wird ausgelöst, wenn das Ergebnis ein
CryptoKeyvom Typsecretoderprivateist, aberkeyUsagesleer oder ungültig für den Algorithmustyp ist. SyntaxErrorDOMException-
Wird ausgelöst, wenn das Ergebnis ein
CryptoKeyPairist und seinprivateKey.usagesAttribut leer oder ungültig für den Algorithmustyp ist.
Beispiele
Hinweis: Sie können die funktionierenden Beispiele auf GitHub ausprobieren.
RSA Schlüsselpaargenerierung
Dieser Code generiert ein RSA-OAEP-Verschlüsselungsschlüsselpaar. Sehen Sie den vollständigen Code auf GitHub an.
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üsselpaargenerierung
Dieser Code generiert ein ECDSA-Signaturschlüsselpaar. Sehen Sie den vollständigen Code auf GitHub an.
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 den vollständigen Code auf GitHub an.
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 den vollständigen Code auf GitHub an.
let key = await window.crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256,
},
true,
["encrypt", "decrypt"],
);
Ed25519 Schlüsselerzeugung
Dieser Code generiert ein Ed25519-Signaturschlüsselpaar. Es ist abgeleitet von 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 zur Protokollierung 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.
JavaScript holt zuerst die Elemente #sign-button und #message <input> und fügt dann einen Listener für das click-Ereignis auf der Schaltfläche hinzu.
Der Ereignis-Handler löscht das Protokoll und führt die anderen Operationen aus, indem der Inhalt des <input>-Elements übergeben wird.
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 über die erstellten Schlüssel werden unten protokolliert (oder ein Fehlermeldungs-String, wenn der Browser die Erstellung des Schlüssels nicht erlaubt).
X25519 Schlüsselerzeugung
Dieser Code generiert ein X25519-Öffentlich- und Privatschlüsselpaar, das in SubtleCrypto.deriveKey() zur Erstellung eines gemeinsamen Schlüssels oder in SubtleCrypto.deriveBits() zur Erstellung eines gemeinsamen Geheimnisses verwendet werden kann.
JavaScript
Der Code zur Erzeugung eines Schlüsselpaares mit dem X25519-Algorithmus und zur Protokollierung 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.
JavaScript holt zuerst die Elemente #run-button und #log <input> und fügt dann einen Listener für das click-Ereignis auf der Schaltfläche hinzu.
Der Ereignis-Handler löscht das Protokoll, generiert ein X25519-Schlüsselpaar und protokolliert einige seiner Eigenschaften.
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 über die erstellten Schlüssel werden unten protokolliert (oder ein Fehlermeldungs-String, wenn der Browser die Erstellung des Schlüssels nicht erlaubt).
Spezifikationen
| Specification |
|---|
| Web Cryptography Level 2> # SubtleCrypto-method-generateKey> |