SubtleCrypto:exportKey() 方法
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
。
返回值
一个Promise
。
- 如果
format
为jwk
,则 promise 将以包含密钥的 JSON 对象完成。 - 否则,promise 将以包含密钥的
ArrayBuffer
完成。
异常
当遇到以下异常之一时,promise 将被拒绝
InvalidAccessError
DOMException
-
尝试导出不可提取的密钥时引发。
NotSupported
DOMException
-
尝试以未知格式导出时引发。
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 密码学 API # SubtleCrypto-method-exportKey |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。