SubtleCrypto:generateKey() 方法
SubtleCrypto
接口的 generateKey()
方法用于生成新的密钥(用于对称算法)或密钥对(用于公钥算法)。
语法
generateKey(algorithm, extractable, keyUsages)
参数
algorithm
-
一个对象,用于定义要生成的密钥类型并提供额外的特定于算法的参数。
- 对于 RSASSA-PKCS1-v1_5、RSA-PSS 或 RSA-OAEP:传递一个
RsaHashedKeyGenParams
对象。 - 对于 ECDSA 或 ECDH:传递一个
EcKeyGenParams
对象。 - 对于 HMAC:传递一个
HmacKeyGenParams
对象。 - 对于 AES-CTR、AES-CBC、AES-GCM 或 AES-KW:传递一个
AesKeyGenParams
对象。 - 对于 Ed25519:传递字符串
Ed25519
或格式为{ name: "Ed25519" }
的对象。 - 对于 X25519:传递字符串
X25519
或格式为{ name: "X25519" }
的对象。
- 对于 RSASSA-PKCS1-v1_5、RSA-PSS 或 RSA-OAEP:传递一个
extractable
-
一个布尔值,指示是否可以使用
SubtleCrypto.exportKey()
或SubtleCrypto.wrapKey()
导出密钥。 keyUsages
-
一个
Array
,其中包含字符串,指示可以使用新生成的密钥执行的操作。数组元素的可能值为
返回值
一个 Promise
,该 Promise 将解析为一个 CryptoKey
(用于对称算法)或一个 CryptoKeyPair
(用于公钥算法)。
异常
当遇到以下异常时,promise 将被拒绝
SyntaxError
DOMException
-
当结果是类型为
secret
或private
的CryptoKey
但keyUsages
为空或对于算法类型无效时引发。 SyntaxError
DOMException
-
当结果是
CryptoKeyPair
且其privateKey.usages
属性为空或对于算法类型无效时引发。
示例
注意:您可以在 GitHub 上尝试使用示例。
RSA 密钥对生成
此代码生成 RSA-OAEP 加密密钥对。在 GitHub 上查看完整代码。
let keyPair = await window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 4096,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256",
},
true,
["encrypt", "decrypt"],
);
椭圆曲线密钥对生成
此代码生成 ECDSA 签名密钥对。在 GitHub 上查看完整代码。
let keyPair = await window.crypto.subtle.generateKey(
{
name: "ECDSA",
namedCurve: "P-384",
},
true,
["sign", "verify"],
);
HMAC 密钥生成
此代码生成 HMAC 签名密钥。在 GitHub 上查看完整代码。
let key = await window.crypto.subtle.generateKey(
{
name: "HMAC",
hash: { name: "SHA-512" },
},
true,
["sign", "verify"],
);
AES 密钥生成
此代码生成 AES-GCM 加密密钥。在 GitHub 上查看完整代码。
let key = await window.crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256,
},
true,
["encrypt", "decrypt"],
);
Ed25519 密钥生成
此代码生成 Ed25519 签名密钥对。它源自GitHub 上的此源代码,您可以在此处在线运行。
JavaScript
下面显示了使用 Ed25519
算法生成密钥对并在每个密钥中记录信息的代码。请注意,代码在 try..catch
块中运行,因为并非所有浏览器都支持此算法。
JavaScript 首先获取 #sign-button
和 #message
<input>
元素,然后为按钮上的 click
事件添加侦听器。事件处理程序清除日志并运行其他操作,并将 <input>
元素的内容作为参数传递。
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);
}
}
结果
已创建密钥的信息记录在下面(如果浏览器不允许创建密钥,则为错误字符串)。
X25519 密钥生成
此代码生成可用于 SubtleCrypto.deriveKey()
创建共享密钥或用于 SubtleCrypto.deriveBits()
创建共享密钥的 X25519 公钥和私钥对。
JavaScript
下面显示了使用 X25519
算法生成密钥对并在每个密钥中记录信息的代码。请注意,代码在 try..catch
块中运行,因为并非所有浏览器都支持此算法。
JavaScript 首先获取 #run-button
和 #log
<input>
元素,然后为按钮上的 click
事件添加侦听器。事件处理程序清除日志、生成 X25519 密钥对并记录其某些属性。
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);
}
}
结果
已创建密钥的信息记录在下面(如果浏览器不允许创建密钥,则为错误字符串)。
规范
规范 |
---|
Web 密码学 API # SubtleCrypto-method-generateKey |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。