You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成可同时在Node.js和浏览器中使用的RSA密钥对

浏览器端和node-rsa对齐的RSA密钥生成方案

核心原因是node-rsa默认导出的公钥是PKCS#8格式的PEM编码,SubtleCrypto原生导出的是二进制SPKI结构,只需要做一次格式转换就可以对齐。

1. 参数对齐要求

首先保证两端加密参数完全一致,node-rsa初始化new RSA({b: 512})的默认配置如下,浏览器端需要完全匹配:

  • 密钥长度:512位
  • 公钥格式:PKCS#8
  • 加密填充:PKCS#1 v1.5
  • 哈希算法:SHA1

2. 浏览器端完整实现代码

/**
 * ArrayBuffer转Base64
 */
function arrayBufferToBase64(buffer) {
  const bytes = new Uint8Array(buffer);
  let binary = '';
  for (let i = 0; i < bytes.byteLength; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  return window.btoa(binary);
}

/**
 * 生成和node-rsa格式一致的RSA密钥对
 */
async function generateRsaKeyPair() {
  // 生成密钥对,参数和node-rsa默认配置对齐
  const keyPair = await window.crypto.subtle.generateKey(
    {
      name: "RSAES-PKCS1-v1_5", // 和node端加密填充方案对齐
      modulusLength: 512, // 密钥长度和node端一致
      publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // 固定公钥指数65537,和node-rsa默认一致
      hash: "SHA-1" // 哈希算法和node端对齐
    },
    true, // 允许导出密钥
    ["encrypt", "decrypt"] // 按需配置权限,签名的话换成["sign", "verify"]
  );

  // 导出公钥的SPKI二进制结构
  const publicKeyBuffer = await window.crypto.subtle.exportKey("spki", keyPair.publicKey);
  // 转Base64并格式化为PEM格式
  const publicKeyBase64 = arrayBufferToBase64(publicKeyBuffer);
  // 每64个字符换行,加PEM头尾
  const pemPublicKey = `-----BEGIN PUBLIC KEY-----\n${publicKeyBase64.match(/.{1,64}/g).join('\n')}\n-----END PUBLIC KEY-----`;

  return {
    keyPair, // 原生密钥对,用于后续加密/解密/签名/验签
    pemPublicKey // 和node-rsa输出格式完全一致的公钥
  }
}

// 调用示例
generateRsaKeyPair().then(res => {
  console.log(res.pemPublicKey); // 输出格式和node端导出的完全一致
})

3. 注意事项

  • 512位RSA安全性极低,仅适合本地测试,生产环境必须替换为2048位及以上长度
  • 如果使用签名/验签能力,只需要把生成密钥时的name参数改为RSASSA-PKCS1-v1_5,权限改为["sign", "verify"]即可
  • SubtleCrypto API仅在HTTPS、localhost环境下可用,普通HTTP环境会被浏览器禁止调用

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:15:05