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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:39:03