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

Node.js 20下Express框架RSA_PKCS1_PADDING私钥解密解决方案求助

Node.js 20下RSA PKCS1_PADDING加密解密的可行解决方案

优先推荐:切换到OAEP填充(符合安全规范)

Node.js 20默认禁用RSA_PKCS1_PADDING是因为该填充方式存在侧信道攻击风险,官方推荐使用更安全的RSA_PKCS1_OAEP_PADDING。修改后的代码兼容Node.js 20,同时保留核心加密解密逻辑:

const crypto = require('crypto');

encrypt(data) {
  const encryptedBuffer = crypto.publicEncrypt(
    { 
      key: this.pubKey, 
      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
      oaepHash: 'sha256' // 哈希算法可按需调整,默认是sha1,建议用sha256提升安全性
    },
    Buffer.from(JSON.stringify(data))
  );
  return encryptedBuffer.toString('base64');
}

decrypt(data) {
  const decryptedBuffer = crypto
    .privateDecrypt(
      { 
        key: this.privKey, 
        padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
        oaepHash: 'sha256' // 必须和加密时的哈希算法一致
      }, 
      Buffer.from(data, 'base64')
    );
  return JSON.parse(decryptedBuffer.toString());
}

强制兼容PKCS1_PADDING的方案(使用node-forge库)

如果因为旧系统对接等原因必须保留RSA_PKCS1_PADDING,可以使用纯JS实现的node-forge加密库,它不受Node.js crypto模块的安全限制:

  1. 安装依赖:
npm install node-forge
  1. 替换原有加密解密代码:
const forge = require('node-forge');

encrypt(data) {
  // 将PEM格式公钥转为forge可用的对象
  const publicKey = forge.pki.publicKeyFromPem(this.pubKey);
  // 用PKCS1 v1.5填充加密数据
  const encryptedBytes = publicKey.encrypt(JSON.stringify(data), 'RSA-PKCS1-V1_5');
  // 转base64返回
  return forge.util.encode64(encryptedBytes);
}

decrypt(data) {
  // 将PEM格式私钥转为forge可用的对象
  const privateKey = forge.pki.privateKeyFromPem(this.privKey);
  // 解密base64编码的数据
  const decryptedStr = privateKey.decrypt(forge.util.decode64(data), 'RSA-PKCS1-V1_5');
  return JSON.parse(decryptedStr);
}

注意事项

  • node-forge支持标准PEM格式密钥,和你原有代码的密钥格式完全兼容,无需额外转换。
  • 尽管该方案能满足需求,但RSA-PKCS1-V1_5的安全性确实低于OAEP,建议后续系统迭代时逐步迁移到安全标准更高的填充方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:09:50