crypto.subtle.sign() 方法的一个完整示例,包括如何生成密钥对、导出私钥、签名数据以及验证签名:
// 1. 异步函数生成 RSA 密钥对
async function generateKeyPair() {
try {
const keyPair = await crypto.subtle.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]), // 65537
hash: "SHA-256",
},
true, // 可导出
["sign", "verify"]
);
return keyPair;
} catch (error) {
console.error("密钥生成失败:", error);
}
}
// 2. 使用私钥对数据进行签名
async function signData(keyPair, data) {
try {
const encoder = new TextEncoder();
const encodedData = encoder.encode(data);
const signature = await crypto.subtle.sign(
{
name: "RSASSA-PKCS1-v1_5"
},
keyPair.privateKey, // 确保传递的是私钥
encodedData
);
return signature;
} catch (error) {
console.error("签名失败:", error);
}
}
// 3. 使用公钥验证签名
async function verifySignature(keyPair, signature, data) {
try {
const encoder = new TextEncoder();
const encodedData = encoder.encode(data);
const isValid = await crypto.subtle.verify(
{
name: "RSASSA-PKCS1-v1_5"
},
keyPair.publicKey, // 使用公钥进行验证
signature,
encodedData
);
return isValid;
} catch (error) {
console.error("验证签名失败:", error);
}
}
// 4. 执行签名和验证流程
(async () => {
const keyPair = await generateKeyPair();
if (!keyPair) return;
const data = "The quick brown fox jumps over the lazy dog";
const signature = await signData(keyPair, data);
const isValid = await verifySignature(keyPair, signature, data);
console.log("签名验证结果:", isValid);
})();
确保 generateKey 函数返回的 keyPair 对象包含 privateKey 和 publicKey 属性。
在调用 signData 函数时,确保传递 keyPair.privateKey 作为参数。
在调用 verifySignature 函数时,确保传递 keyPair.publicKey 作为参数。
示例中使用了 TextEncoder 来将字符串数据编码为 Uint8Array,因为 Web Crypto API 需要这样的格式。
错误处理是通过 try…catch 语句实现的,以捕获并报告可能发生的任何异常。
遵循这些步骤应该可以避免 “parameter 2 is not of type ‘CryptoKey’” 错误,并正确使用 crypto.subtle.sign() 方法