NodeJS RSA加密后Java解密抛出BadPaddingException问题解决
解决NodeJS RSA加密后Java解密抛出BadPaddingException的问题
这个问题基本是NodeJS与Java在RSA加密的密钥格式、明文编码、填充配置上的差异导致的,既然Java代码无法修改,直接调整NodeJS代码适配Java逻辑即可,具体步骤如下:
1. 统一密钥格式
Java端的公钥/私钥一般用标准PEM格式(带首尾标记+每64字符换行),如果你的NodeJS用的是纯Base64编码密钥,必须先转成PEM格式:
// 将Base64公钥转为标准PEM格式 function formatToPemPublicKey(base64Key) { const cleanedKey = base64Key.replace(/\s/g, ''); // 清除所有空格、换行 const splitKey = cleanedKey.match(/.{1,64}/g).join('\n'); // 每64字符换行 return `-----BEGIN PUBLIC KEY-----\n${splitKey}\n-----END PUBLIC KEY-----`; }
2. 强制明文用UTF-8编码
Java默认用UTF-8处理明文,NodeJS加密时必须显式指定编码,避免默认编码差异导致明文不一致:
// 错误写法:可能隐式使用系统默认编码 // Buffer.from(plainText) // 正确写法:强制UTF-8编码 Buffer.from(plainText, 'utf8')
3. 明确指定PKCS1填充模式
NodeJS的crypto.publicEncrypt方法若不指定填充,可能默认使用OAEP填充,必须手动指定PKCS1Padding对齐Java逻辑:
const crypto = require('crypto'); function rsaEncrypt(plainText, base64PublicKey) { const pemPublicKey = formatToPemPublicKey(base64PublicKey); const encryptedBuffer = crypto.publicEncrypt( { key: pemPublicKey, padding: crypto.constants.RSA_PKCS1_PADDING, // 强制指定PKCS1PADDING }, Buffer.from(plainText, 'utf8') ); return encryptedBuffer.toString('base64'); // 返回Base64编码,与Java端解码逻辑对齐 }
4. 清理密钥无效字符
如果密钥是从其他渠道复制的,可能带有多余换行、空格甚至特殊字符,必须先清除,否则NodeJS解析密钥出错会导致加密结果异常。
验证方法
用上述代码加密测试文本"test_rsa_verify",将得到的Base64字符串拿到Java端解密,若能正常解密则问题解决。
内容的提问来源于stack exchange,提问作者vivek
相关产品推荐
相关产品推荐

