如何在 React 应用程序上加密数据并在 NodeJS 中解密?

问题描述 投票:0回答:1

我正在尝试使用 RSA 加密对我的 React 应用程序中的数据进行加密,然后在我的后端对其进行解密。对于前端我想使用 encryptJS,在后端我想使用内置的加密库。我知道 encrpypton 方面正在工作,因为我用 https://travistidwell.com/jsencrypt/demo/ 测试了它并且工作正常。但我无法解密它。我总是收到错误:

解密过程中出错(可能是错误的密钥)。

原始错误:错误:错误:02000079:rsa例程::oaep解码错误

这是我的前端代码:

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);
var encrypted = encrypt.encrypt(jsonString);

然后通过 API 发送。这是我的后端代码:

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_OAEP_PADDING,
    oaepHash: 'sha256', // Adjust hash function if needed
}, Buffer.from(encryptedData, 'base64'));

console.log('Decrypted data:', decryptedData.toString('utf8'));
reactjs node.js cryptojs jsencrypt
1个回答
0
投票

JSEncrypt 使用 PKCS#1 v1.5 填充,不支持 OAEP。由于加密代码中使用了 OAEP,因此实现不兼容。

修复:在加密代码中也使用 PKCS#1 v1.5 填充(即应用

crypto.constants.RSA_PKCS1_PADDING
)或使用除 JSEncrypt 之外的其他库,该库也支持 OAEP。

© www.soinside.com 2019 - 2024. All rights reserved.