React应用JSEencrypt加密数据,Node.js crypto解密失败求助
问题原因
JSEencrypt 默认使用 RSA-PKCS1-V1_5 填充模式加密数据,但你的 Node.js 后端配置了 RSA_PKCS1_OAEP_PADDING 填充模式解密,两者不匹配,导致解密时出现 OAEP 解码错误。
解决方案
两种修复方式任选其一即可:
方式一:后端修改填充模式为 PKCS1_V1_5
将后端解密代码的padding参数改为crypto.constants.RSA_PKCS1_PADDING,移除oaepHash配置:
const crypto = require('crypto'); var privateKey = ` -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd 8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5 rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876 -----END RSA PRIVATE KEY-----` const encryptedData = req.body.encrypted; const decryptedData = crypto.privateDecrypt({ key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING // 修改填充模式 }, Buffer.from(encryptedData, 'base64')); console.log('Decrypted data:', decryptedData.toString('utf8'));
方式二:前端改用 OAEP 填充加密
若需使用更安全的 OAEP 填充,确保 JSEencrypt 版本在 3.0.0 以上(支持 OAEP),调用encryptOAEP方法替代encrypt:
var encrypt = new JSEncrypt(); var publicKey = ` -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76 xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4 gwQco1KRMDSmXSMkDwIDAQAB -----END PUBLIC KEY-----`; encrypt.setPublicKey(publicKey); const objectToEncrypt = {product_name: 'Testing', product_price: 10 }; const jsonString = JSON.stringify(objectToEncrypt); // 使用OAEP加密,哈希算法与后端保持一致 var encrypted = encrypt.encryptOAEP(jsonString, 'sha256');
此时后端解密代码无需修改,保持原有 OAEP 配置即可。
补充说明
- RSA 加密有长度限制:1024位密钥下,PKCS1_V1_5 最多加密117字节内容,OAEP-SHA256 最多加密86字节。若需加密大尺寸数据,建议先用对称加密算法加密数据,再用 RSA 加密对称密钥。
- 你当前使用的密钥对是匹配的,无需更换。
内容的提问来源于stack exchange,提问作者Michael Lafortune
相关产品推荐
相关产品推荐

