SubtleCrypto: exportKey() 方法
Baseline 广泛可用 *
注意:此功能在 Web Workers 中可用。
SubtleCrypto 接口的 exportKey() 方法用于导出密钥:它接受一个 CryptoKey 对象作为输入,并以外部、可移植的格式返回该密钥。
要导出密钥,该密钥的 CryptoKey.extractable 必须设置为 true。
密钥可以导出为多种格式:有关详细信息,请参阅 SubtleCrypto.importKey() 页面的 支持的格式。
密钥不会以加密格式导出:要在导出密钥时对其进行加密,请改用 SubtleCrypto.wrapKey() API。
语法
js
exportKey(format, key)
参数
格式(format)-
一个描述密钥应导出数据格式的字符串值。它可以是以下之一:
raw:原始格式。pkcs8:PKCS #8 格式。spki:SubjectPublicKeyInfo 格式。jwk:JSON Web Key 格式。
key-
要导出的
CryptoKey。
返回值
- 如果
format是jwk,则 Promise 将以包含密钥的 JSON 对象解析。 - 否则,Promise 将以包含密钥的
ArrayBuffer解析。
异常
当遇到以下任一异常时,Promise 将被拒绝:
InvalidAccessErrorDOMException-
尝试导出不可提取的密钥时引发。
NotSupportedDOMException-
尝试以未知格式导出时引发。
TypeError-
当尝试使用无效格式时抛出。
示例
注意:您可以在 GitHub 上尝试工作示例。
原始导出
此示例将 AES 密钥导出为包含密钥字节的 ArrayBuffer。 在 GitHub 上查看完整代码。
js
/*
Export the given key and write it into the "exported-key" space.
*/
async function exportCryptoKey(key) {
const exported = await window.crypto.subtle.exportKey("raw", key);
const exportedKeyBuffer = new Uint8Array(exported);
const exportKeyOutput = document.querySelector(".exported-key");
exportKeyOutput.textContent = `[${exportedKeyBuffer}]`;
}
/*
Generate an encrypt/decrypt secret key,
then set up an event listener on the "Export" button.
*/
window.crypto.subtle
.generateKey(
{
name: "AES-GCM",
length: 256,
},
true,
["encrypt", "decrypt"],
)
.then((key) => {
const exportButton = document.querySelector(".raw");
exportButton.addEventListener("click", () => {
exportCryptoKey(key);
});
});
PKCS #8 导出
此示例将 RSA 私钥签名密钥导出为 PKCS #8 对象。然后对导出的密钥进行 PEM 编码。 在 GitHub 上查看完整代码。
js
/*
Convert an ArrayBuffer into a string
from https://developer.chrome.com/blog/how-to-convert-arraybuffer-to-and-from-string/
*/
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
/*
Export the given key and write it into the "exported-key" space.
*/
async function exportCryptoKey(key) {
const exported = await window.crypto.subtle.exportKey("pkcs8", key);
const exportedAsString = ab2str(exported);
const exportedAsBase64 = window.btoa(exportedAsString);
const pemExported = `-----BEGIN PRIVATE KEY-----\n${exportedAsBase64}\n-----END PRIVATE KEY-----`;
const exportKeyOutput = document.querySelector(".exported-key");
exportKeyOutput.textContent = pemExported;
}
/*
Generate a sign/verify key pair,
then set up an event listener on the "Export" button.
*/
window.crypto.subtle
.generateKey(
{
name: "RSA-PSS",
// Consider using a 4096-bit key for systems that require long-term security
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true,
["sign", "verify"],
)
.then((keyPair) => {
const exportButton = document.querySelector(".pkcs8");
exportButton.addEventListener("click", () => {
exportCryptoKey(keyPair.privateKey);
});
});
SubjectPublicKeyInfo 导出
此示例将 RSA 公钥加密密钥导出为 PEM 编码的 SubjectPublicKeyInfo 对象。 在 GitHub 上查看完整代码。
js
/*
Convert an ArrayBuffer into a string
from https://developer.chrome.com/blog/how-to-convert-arraybuffer-to-and-from-string/
*/
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
}
/*
Export the given key and write it into the "exported-key" space.
*/
async function exportCryptoKey(key) {
const exported = await window.crypto.subtle.exportKey("spki", key);
const exportedAsString = ab2str(exported);
const exportedAsBase64 = window.btoa(exportedAsString);
const pemExported = `-----BEGIN PUBLIC KEY-----\n${exportedAsBase64}\n-----END PUBLIC KEY-----`;
const exportKeyOutput = document.querySelector(".exported-key");
exportKeyOutput.textContent = pemExported;
}
/*
Generate an encrypt/decrypt key pair,
then set up an event listener on the "Export" button.
*/
window.crypto.subtle
.generateKey(
{
name: "RSA-OAEP",
// Consider using a 4096-bit key for systems that require long-term security
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true,
["encrypt", "decrypt"],
)
.then((keyPair) => {
const exportButton = document.querySelector(".spki");
exportButton.addEventListener("click", () => {
exportCryptoKey(keyPair.publicKey);
});
});
JSON Web Key 导出
此示例将 ECDSA 私钥签名密钥导出为 JSON Web Key 对象。 在 GitHub 上查看完整代码。
js
/*
Export the given key and write it into the "exported-key" space.
*/
async function exportCryptoKey(key) {
const exported = await window.crypto.subtle.exportKey("jwk", key);
const exportKeyOutput = document.querySelector(".exported-key");
exportKeyOutput.textContent = JSON.stringify(exported, null, " ");
}
/*
Generate a sign/verify key pair,
then set up an event listener on the "Export" button.
*/
window.crypto.subtle
.generateKey(
{
name: "ECDSA",
namedCurve: "P-384",
},
true,
["sign", "verify"],
)
.then((keyPair) => {
const exportButton = document.querySelector(".jwk");
exportButton.addEventListener("click", () => {
exportCryptoKey(keyPair.privateKey);
});
});
规范
| 规范 |
|---|
| Web 加密级别 2 # SubtleCrypto-method-exportKey |
浏览器兼容性
加载中…