如何生成可同时在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
相关产品推荐
相关产品推荐

