SubtleCrypto: importKey() 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 importKey() Methode des SubtleCrypto-Interfaces importiert einen Schlüssel: Das heißt, sie nimmt als Eingabe einen Schlüssel in einem externen, portablen Format und liefert Ihnen ein CryptoKey-Objekt, das Sie in der Web Crypto API verwenden können.
Die Funktion akzeptiert mehrere Importformate: Einzelheiten finden Sie unter Unterstützte Formate.
Syntax
importKey(format, keyData, algorithm, extractable, keyUsages)
Parameter
format-
Ein String, der das Datenformat des zu importierenden Schlüssels beschreibt. Es kann eines der folgenden sein:
raw: Rohformat.pkcs8: PKCS #8 Format.spki: SubjectPublicKeyInfo Format.jwk: JSON Web Key Format.
keyData-
Ein
ArrayBuffer, ein TypedArray, einDataView, oder einJSONWebKey-Objekt, das den Schlüssel im angegebenen Format enthält. algorithm-
Ein Objekt, welches den Typ des zu importierenden Schlüssels definiert und zusätzliche algorithmen-spezifische Parameter bereitstellt.
- Für RSASSA-PKCS1-v1_5, RSA-PSS oder RSA-OAEP übergeben Sie ein
RsaHashedImportParams-Objekt. - Für ECDSA oder ECDH übergeben Sie ein
EcKeyImportParams-Objekt. - Für HMAC übergeben Sie ein
HmacImportParams-Objekt. - Für AES-CTR, AES-CBC, AES-GCM und AES-KW übergeben Sie den String, der den Algorithmus identifiziert, oder ein Objekt der Form
{ name: ALGORITHM }, wobeiALGORITHMder Name des Algorithmus ist. - Für PBKDF2 übergeben Sie den String
PBKDF2oder ein Objekt der Form{ name: "PBKDF2" }. - Für HKDF übergeben Sie den String
HKDFoder ein Objekt der Form{ name: "HKDF" }. - 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 übergeben Sie ein
extractable-
Ein boolescher Wert, der angibt, ob es möglich sein wird, den Schlüssel mit
SubtleCrypto.exportKey()oderSubtleCrypto.wrapKey()zu exportieren. keyUsages-
Ein
Array, das angibt, was mit dem Schlüssel gemacht werden kann. Mögliche Array-Werte sind:encrypt: Der Schlüssel kann zum Verschlüsseln von Nachrichten verwendet werden.decrypt: Der Schlüssel kann zum Entschlüsseln von Nachrichten verwendet werden.sign: Der Schlüssel kann zum Signieren von Nachrichten verwendet werden.verify: Der Schlüssel kann zur Überprüfung von Signaturen verwendet werden.deriveKey: Der Schlüssel kann zur Ableitung eines neuen Schlüssels verwendet werden.deriveBits: Der Schlüssel kann zur Ableitung von Bits verwendet werden.wrapKey: Der Schlüssel kann zum Verpacken eines Schlüssels verwendet werden.unwrapKey: Der Schlüssel kann zum Entpacken eines Schlüssels verwendet werden.
Rückgabewert
Ein Promise, das mit dem importierten Schlüssel als CryptoKey-Objekt erfüllt wird.
Ausnahmen
Das Promise wird zurückgewiesen, wenn eine der folgenden Ausnahmen auftritt:
SyntaxErrorDOMException-
Wird ausgelöst, wenn
keyUsagesleer ist, aber der unverpackte Schlüssel vom Typsecretoderprivateist. TypeError-
Wird ausgelöst, wenn versucht wird, ein ungültiges Format zu verwenden oder wenn die
keyDatanicht für dieses Format geeignet sind.
Unterstützte Formate
Diese API unterstützt vier verschiedene Schlüsselimport-/exportformate: Rohformat, PKCS #8, SubjectPublicKeyInfo und JSON Web Key.
Roh
Sie können dieses Format verwenden, um AES- oder HMAC-Geheimschlüssel oder elliptische Kurven-Öffentliche Schlüssel zu importieren oder zu exportieren.
In diesem Format wird der Schlüssel als ein ArrayBuffer bereitgestellt, das die Rohbytes für den Schlüssel enthält.
PKCS #8
Sie können dieses Format verwenden, um RSA- oder elliptische Kurven-Private Schlüssel zu importieren oder zu exportieren.
Das PKCS #8 Format wird in RFC 5208 definiert und verwendet die ASN.1 Notation:
PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
privateKey PrivateKey,
attributes [0] IMPLICIT Attributes OPTIONAL }
Die importKey() Methode erwartet, dass dieses Objekt als ein ArrayBuffer bereitgestellt wird, der die DER-kodierte Form des PrivateKeyInfo enthält. DER ist eine Reihe von Regeln zur Kodierung von ASN.1-Strukturen in eine binäre Form.
Sie werden wahrscheinlich auf dieses Objekt im PEM-Format treffen. Das PEM-Format ist eine Möglichkeit, Binärdaten in ASCII zu kodieren. Es besteht aus einem Header und einem Footer und dazwischen den base64-kodierten Binärdaten. Ein PEM-kodiertes PrivateKeyInfo sieht so aus:
-----BEGIN PRIVATE KEY----- MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDAU9BD0jxDfF5OV380z 9VIEUN2W5kJDZ3hbuaDenCxLiAMsoquKTfFaou71eLdN0TShZANiAARMUhCee/cp xmjGc1roj0D0k6VlUqtA+JVCWigXcIAukOeTHCngZDKCrD4PkXDBvbciJdZKvO+l ml2FIkoovZh/8yeTKmjUMb804g6OmjUc9vVojCRV0YdaSmYkkJMJbLg= -----END PRIVATE KEY-----
Um dies in ein Format zu bringen, das Sie an importKey() übergeben können, müssen Sie zwei Dinge tun:
- Die Teile zwischen Header und Footer mit
Window.atob()base64-dekodieren. - Den resultierenden String in einen
ArrayBufferkonvertieren.
Sehen Sie im Abschnitt Beispiele nach, um konkretere Anleitungen zu erhalten.
SubjectPublicKeyInfo
Sie können dieses Format verwenden, um RSA- oder elliptische Kurven-Öffentliche Schlüssel zu importieren oder zu exportieren.
SubjectPublicKey ist in RFC 5280, Abschnitt 4.1 unter Verwendung der ASN.1 Notation definiert:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
Genau wie PKCS #8 erwartet die importKey() Methode, dass dieses Objekt als ein ArrayBuffer bereitgestellt wird, der die DER-kodierte Form des SubjectPublicKeyInfo enthält.
Auch hier werden Sie dieses Objekt wahrscheinlich im PEM-Format finden. Ein PEM-kodiertes SubjectPublicKeyInfo sieht so aus:
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3j+HgSHUnc7F6XzvEbD0 r3M5JNy+/kabiJVu8IU1ERAl3Osi38VgiMzjDBDOrFxVzNNzl+SXAHwXIV5BHiXL CQ6qhwYsDgH6OqgKIwiALra/wNH4UHxj1Or/iyAkjHRR/kGhUtjyVCjzvaQaDpJW 2G+syd1ui0B6kJov2CRUWiPwpff8hBfVWv8q9Yc2yD5hCnykVL0iAiyn+SDAk/rv 8dC5eIlzCI4efUCbyG4c9O88Qz7bS14DxSfaPTy8P/TWoihVVjLaDF743LgM/JLq CDPUBUA3HLsZUhKm3BbSkd7Q9Ngkjv3+yByo4/fL+fkYRa8j9Ypa2N0Iw53LFb3B gQIDAQAB -----END PUBLIC KEY-----
Ebenso wie bei PKCS #8 müssen Sie, um dies in ein Format zu bringen, das Sie an importKey() übergeben können, zwei Dinge tun:
- Die Teile zwischen Header und Footer mit
Window.atob()base64-dekodieren. - Den resultierenden String in einen
ArrayBufferkonvertieren.
Sehen Sie im Abschnitt Beispiele nach, um konkretere Anleitungen zu erhalten.
JSON Web Key
Sie können das JSON Web Key Format verwenden, um RSA- oder elliptische Kurven-Öffentliche oder Private Schlüssel sowie AES- und HMAC-Geheimschlüssel zu importieren oder zu exportieren.
Das JSON Web Key Format wird in RFC 7517 definiert. Es beschreibt eine Möglichkeit, öffentliche, private und geheime Schlüssel als JSON-Objekte darzustellen.
Ein JSON Web Key sieht etwa so aus (dies ist ein EC Privatschlüssel):
{
"crv": "P-384",
"d": "wouCtU7Nw4E8_7n5C1-xBjB4xqSb_liZhYMsy8MGgxUny6Q8NCoH9xSiviwLFfK_",
"ext": true,
"key_ops": ["sign"],
"kty": "EC",
"x": "SzrRXmyI8VWFJg1dPUNbFcc9jZvjZEfH7ulKI1UkXAltd7RGWrcfFxqyGPcwu6AQ",
"y": "hHUag3OvDzEr0uUQND4PXHQTXP5IDGdYhJhL-WLKjnGjQAw0rNGy5V29-aV-yseW"
}
Beispiele
Hinweis: Sie können die funktionierenden Beispiele auf GitHub ausprobieren.
Rohimport
Dieses Beispiel importiert einen AES-Schlüssel aus einem ArrayBuffer, der die zu verwendenden Rohbytes enthält. Sehen Sie den vollständigen Code auf GitHub.
const rawKey = window.crypto.getRandomValues(new Uint8Array(16));
/*
Import an AES secret key from an ArrayBuffer containing the raw bytes.
Takes an ArrayBuffer string containing the bytes, and returns a Promise
that will resolve to a CryptoKey representing the secret key.
*/
function importSecretKey(rawKey) {
return window.crypto.subtle.importKey("raw", rawKey, "AES-GCM", true, [
"encrypt",
"decrypt",
]);
}
PKCS #8 Import
Dieses Beispiel importiert einen RSA privaten Signaturschlüssel aus einem PEM-kodierten PKCS #8 Objekt. Sehen Sie den vollständigen Code auf GitHub.
/*
Convert a string into an ArrayBuffer
from https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String
*/
function str2ab(str) {
const buf = new ArrayBuffer(str.length);
const bufView = new Uint8Array(buf);
for (let i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
const pemEncodedKey = `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDD0tPV/du2vftjvXj1t/gXTK39sNBVrOAEb/jKzXae+Xa0H+3LhZaQIQNMfACiBSgIfZUvEGb+7TqXWQpoLoFR/R7MvGWcSk98JyrVtveD8ZmZYyItSY7m2hcasqAFiKyOouV5vzyRe87/lEyzzBpF3bQQ4IDaQu+K9Hj5fKuU6rrOeOhsdnJc+VdDQLScHxvMoLZ9Vtt+oK9J4/tOLwr4CG8khDlBURcBY6gPcLo3dPU09SW+6ctX2cX4mkXx6O/0mmdTmacr/vu50KdRMleFeZYOWPAEhhMfywybTuzBiPVIZVP8WFCSKNMbfi1S9A9PdBqnebwwHhX3/hsEBt2BAgMBAAECggEABEI1P6nf6Zs7mJlyBDv+Pfl5rjL2cOqLy6TovvZVblMkCPpJyFuNIPDK2tK2i897ZaXfhPDBIKmllM2Hq6jZQKB110OAnTPDg0JxzMiIHPs32S1d/KilHjGff4Hjd4NXp1l1Dp8BUPOllorR2TYm2x6dcCGFw9lhTr8O03Qp4hjn84VjGIWADYCk83mgS4nRsnHkdiqYnWx1AjKlY51yEK6RcrDMi0Th2RXrrINoC35sVv+APt2rkoMGi52RwTEseA1KZGFrxjq61ReJif6p2VXEcvHeX6CWLx014LGk43z6Q28P6HgeEVEfIjyqCUea5Du/mYb/QsRSCosXLxBqwQKBgQD1+fdC9ZiMrVI+km7Nx2CKBn8rJrDmUh5SbXn2MYJdrUd8bYNnZkCgKMgxVXsvJrbmVOrby2txOiqudZkk5mD3E5O/QZWPWQLgRu8ueYNpobAX9NRgNfZ7rZD+81vh5MfZiXfuZOuzv29iZhU0oqyZ9y75eHkLdrerNkwYOe5aUQKBgQDLzapDi1NxkBgsj9iiO4KUa7jvD4JjRqFy4Zhj/jbQvlvM0F/uFp7sxVcHGx4r11C+6iCbhX4u+Zuu0HGjT4d+hNXmgGyxR8fIUVxOlOtDkVJa5sOBZK73/9/MBeKusdmJPRhalZQfMUJRWIoEVDMhfg3tW/rBj5RYAtP2dTVUMQKBgDs8yr52dRmT+BWXoFWwaWB0NhYHSFz/c8v4D4Ip5DJ5M5kUqquxJWksySGQa40sbqnD05fBQovPLU48hfgr/zghn9hUjBcsoZOvoZR4sRw0UztBvA+7jzOz1hKAOyWIulR6Vca0yUrNlJ6G5R56+sRNkiOETupi2dLCzcqb0PoxAoGAZyNHvTLvIZN4iGSrjz5qkM4LIwBIThFadxbv1fq6pt0O/BGf2o+cEdq0diYlGK64cEVwBwSBnSg4vzlBqRIAUejLjwEDAJyA4EE8Y5A9l04dzV7nJb5cRak6CrgXxay/mBJRFtaHxVlaZGxYPGSYE6UFS0+3EOmmevvDZQBf4qECgYEA0ZF6Vavz28+8wLO6SP3w8NmpHk7K9tGEvUfQ30SgDx4G7qPIgfPrbB4OP/E0qCfsIImi3sCPpjvUMQdVVZyPOIMuB+rV3ZOxkrzxEUOrpOpR48FZbL7RN90yRQsAsrp9e4iv8QwB3VxLe7X0TDqqnRyqrc/osGzuS2ZcHOKmCU8=
-----END PRIVATE KEY-----`;
/*
Import a PEM encoded RSA private key, to use for RSA-PSS signing.
Takes a string containing the PEM encoded key, and returns a Promise
that will resolve to a CryptoKey representing the private key.
*/
function importPrivateKey(pem) {
// fetch the part of the PEM string between header and footer
const pemHeader = "-----BEGIN PRIVATE KEY-----";
const pemFooter = "-----END PRIVATE KEY-----";
const pemContents = pem.substring(
pemHeader.length,
pem.length - pemFooter.length - 1,
);
// base64 decode the string to get the binary data
const binaryDerString = window.atob(pemContents);
// convert from a binary string to an ArrayBuffer
const binaryDer = str2ab(binaryDerString);
return window.crypto.subtle.importKey(
"pkcs8",
binaryDer,
{
name: "RSA-PSS",
hash: "SHA-256",
},
true,
["sign"],
);
}
SubjectPublicKeyInfo Import
Dieses Beispiel importiert einen RSA öffentlichen Verschlüsselungsschlüssel aus einem PEM-kodierten SubjectPublicKeyInfo Objekt. Sehen Sie den vollständigen Code auf GitHub.
// from https://developers.google.com/web/updates/2012/06/How-to-convert-ArrayBuffer-to-and-from-String
function str2ab(str) {
const buf = new ArrayBuffer(str.length);
const bufView = new Uint8Array(buf);
for (let i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
const pemEncodedKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy3Xo3U13dc+xojwQYWoJLCbOQ5fOVY8LlnqcJm1W1BFtxIhOAJWohiHuIRMctv7dzx47TLlmARSKvTRjd0dF92jx/xY20Lz+DXp8YL5yUWAFgA3XkO3LSJgEOex10NB8jfkmgSb7QIudTVvbbUDfd5fwIBmCtaCwWx7NyeWWDb7A9cFxj7EjRdrDaK3ux/ToMLHFXVLqSL341TkCf4ZQoz96RFPUGPPLOfvN0x66CM1PQCkdhzjE6U5XGE964ZkkYUPPsy6Dcie4obhW4vDjgUmLzv0z7UD010RLIneUgDE2FqBfY/C+uWigNPBPkkQ+Bv/UigS6dHqTCVeD5wgyBQIDAQAB
-----END PUBLIC KEY-----`;
function importRsaKey(pem) {
// fetch the part of the PEM string between header and footer
const pemHeader = "-----BEGIN PUBLIC KEY-----";
const pemFooter = "-----END PUBLIC KEY-----";
const pemContents = pem.substring(
pemHeader.length,
pem.length - pemFooter.length - 1,
);
// base64 decode the string to get the binary data
const binaryDerString = window.atob(pemContents);
// convert from a binary string to an ArrayBuffer
const binaryDer = str2ab(binaryDerString);
return window.crypto.subtle.importKey(
"spki",
binaryDer,
{
name: "RSA-OAEP",
hash: "SHA-256",
},
true,
["encrypt"],
);
}
JSON Web Key Import
Dieser Code importiert einen ECDSA privaten Signaturschlüssel, gegeben durch ein JSON Web Key Objekt, das ihn darstellt. Sehen Sie den vollständigen Code auf GitHub.
const jwkEcKey = {
crv: "P-384",
d: "wouCtU7Nw4E8_7n5C1-xBjB4xqSb_liZhYMsy8MGgxUny6Q8NCoH9xSiviwLFfK_",
ext: true,
key_ops: ["sign"],
kty: "EC",
x: "SzrRXmyI8VWFJg1dPUNbFcc9jZvjZEfH7ulKI1UkXAltd7RGWrcfFxqyGPcwu6AQ",
y: "hHUag3OvDzEr0uUQND4PXHQTXP5IDGdYhJhL-WLKjnGjQAw0rNGy5V29-aV-yseW",
};
/*
Import a JSON Web Key format EC private key, to use for ECDSA signing.
Takes an object representing the JSON Web Key, and returns a Promise
that will resolve to a CryptoKey representing the private key.
*/
function importPrivateKey(jwk) {
return window.crypto.subtle.importKey(
"jwk",
jwk,
{
name: "ECDSA",
namedCurve: "P-384",
},
true,
["sign"],
);
}
Spezifikationen
| Specification |
|---|
| Web Cryptography Level 2> # SubtleCrypto-method-importKey> |
Browser-Kompatibilität
Loading…