fix: use RSA-OAEP

This commit is contained in:
dalaolala committed 2026-03-03 12:46:18 +08:00
1 parent 1f97292aeb
commit f01edf0203
4 files changed
+26 -7

No files matched your search

+2 -2
View File
@@ -21,10 +21,10 @@ function getPublicKey() {
function decryptPayload(encryptedAesKeyBase64, encryptedDataBase64) {
if (!privateKey) throw new Error('Keys not initialized');
// 1. RSA 解密 AES 密钥
// 1. RSA 解密 AES 密钥 (使用 OAEP)
const encryptedAesKeyBuffer = Buffer.from(encryptedAesKeyBase64, 'base64');
const aesKeyStr = crypto.privateDecrypt(
{ key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING },
{ key: privateKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING },
encryptedAesKeyBuffer
).toString('utf8');
+10
View File
@@ -14,6 +14,7 @@
"crypto-js": "^4.2.0",
"element-plus": "^2.3.14",
"jsencrypt": "^3.5.4",
"node-forge": "^1.3.3",
"pinia": "^2.1.7",
"socket.io-client": "^4.7.5",
"vue": "^3.3.4",
@@ -1261,6 +1262,15 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/node-forge": {
"version": "1.3.3",
"resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.3.tgz",
"integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==",
"license": "(BSD-3-Clause OR GPL-2.0)",
"engines": {
"node": ">= 6.13.0"
}
},
"node_modules/normalize-wheel-es": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+1
View File
@@ -14,6 +14,7 @@
"crypto-js": "^4.2.0",
"element-plus": "^2.3.14",
"jsencrypt": "^3.5.4",
"node-forge": "^1.3.3",
"pinia": "^2.1.7",
"socket.io-client": "^4.7.5",
"vue": "^3.3.4",
+13 -5
View File
@@ -1,5 +1,5 @@
import axios from 'axios';
import JSEncrypt from 'jsencrypt';
import forge from 'node-forge';
import CryptoJS from 'crypto-js';
let publicKeyCache = null;
@@ -39,11 +39,19 @@ export async function encryptPayload(data) {
padding: CryptoJS.pad.Pkcs7
}).toString(); // 自动输出 base64
// 3. 使用 RSA 加密 AES 密钥和 IV
const encryptor = new JSEncrypt();
encryptor.setPublicKey(pubKey);
// 3. 使用 RSA-OAEP 加密 AES 密钥和 IV
const publicKeyObj = forge.pki.publicKeyFromPem(pubKey);
const sessionKeyObj = JSON.stringify({ key: aesKeyStr, iv: ivStr });
const encryptedKey = encryptor.encrypt(sessionKeyObj);
// forge 的 encrypt 默认使用 RSAES-PKCS1-V1_5,若需要 OAEP:
const encryptedKeyBytes = publicKeyObj.encrypt(sessionKeyObj, 'RSA-OAEP', {
md: forge.md.sha1.create(),
mgf1: {
md: forge.md.sha1.create()
}
});
const encryptedKey = forge.util.encode64(encryptedKeyBytes);
if (!encryptedKey) {
throw new Error('RSA 加密失败,可能是数据过长或公钥无效');