Node.js读取.cer公钥实现RSA/ECB/OAEPWithSHA-256AndMGF1Padding加密
RSA公钥加密(含.cer证书公钥提取)解决方案
方案1:Node.js内置crypto模块(推荐,无额外依赖)
Node.js 10+ 内置的crypto模块原生支持所需加密算法,无需安装第三方依赖,安全性和维护性优于第三方包,优先推荐使用。
操作步骤
- 读取.cer证书文件,通常.cer为PEM格式(开头为
-----BEGIN CERTIFICATE-----)或DER二进制格式,两种格式都可以直接解析 - 从证书中提取公钥后直接调用加密方法即可
代码示例
const crypto = require('crypto'); const fs = require('fs'); // ------------- 公钥提取 ------------- let publicKey; // 优先尝试解析PEM格式.cer try { const certPem = fs.readFileSync('./publicKey.cer', 'utf8'); publicKey = crypto.createPublicKey(certPem); } catch (e) { // PEM解析失败则按DER二进制格式处理 const certDer = fs.readFileSync('./publicKey.cer'); publicKey = crypto.createPublicKey({ key: certDer, format: 'der', type: 'spki' }); } // ------------- 加密逻辑 ------------- const plainText = '需要加密的文本内容'; const encryptedBuffer = crypto.publicEncrypt( { key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING, oaepHash: 'sha256' }, Buffer.from(plainText, 'utf8') ); // 加密结果转base64方便存储/传输 const encryptedResult = encryptedBuffer.toString('base64');
上述加密逻辑完全匹配RSA/ECB/OAEPWithSHA-256AndMGF1Padding算法要求。
方案2:node-forge兼容实现
如果需兼容旧项目仍使用node-forge,可按以下逻辑提取公钥:
代码示例
const forge = require('node-forge'); const fs = require('fs'); // ------------- 公钥提取 ------------- let publicKey; // 优先尝试解析PEM格式.cer try { const certPem = fs.readFileSync('./publicKey.cer', 'utf8'); const cert = forge.pki.certificateFromPem(certPem); publicKey = cert.publicKey; } catch (e) { // 处理DER二进制格式.cer const certDer = fs.readFileSync('./publicKey.cer'); const certAsn1 = forge.asn1.fromDer(forge.util.createBuffer(certDer)); const cert = forge.pki.certificateFromAsn1(certAsn1); publicKey = cert.publicKey; } // ------------- 加密逻辑(原逻辑可直接复用)------------- const plainText = '需要加密的文本内容'; const bytes = forge.util.encodeUtf8(plainText); const encrypted = publicKey.encrypt(bytes, 'RSA-OAEP', { md: forge.md.sha256.create(), mgf1: { md: forge.md.sha256.create() } }); // 加密结果转base64 const encryptedResult = forge.util.encode64(encrypted.data);
注意事项
- RSA加密有明文长度限制,2048位密钥最多加密约190字节明文,若需加密长文本建议使用混合加密方案:随机生成AES密钥加密长文本,再用RSA加密AES密钥。
内容的提问来源于stack exchange,提问作者Anonymous Creator
相关产品推荐
相关产品推荐

