sign/verify密钥签名和验证信息,遵循以下的代码可确保不会出现sign 参数2“parameter 2 is not of type ‘CryptoKey‘“的错误

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() 方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值