From d0d67b90bc5808da88740dc81e4b3bcffbd482a5 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 10 七月 2023 18:20:38 +0800 Subject: [PATCH] add 新增 请求加密传输 合并优化 !pr377 --- src/utils/jsencrypt.ts | 3 + src/utils/request.ts | 11 +++++ package.json | 2 + src/api/login.ts | 3 + src/utils/crypto.ts | 45 ++++++++++++++++++++++ 5 files changed, 62 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index fdc8979..98195b8 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "fuse.js": "6.6.2", "js-cookie": "3.0.1", "jsencrypt": "3.3.1", + "crypto-js": "^4.1.1", "nprogress": "0.2.0", "path-browserify": "1.0.1", "path-to-regexp": "6.2.0", @@ -42,6 +43,7 @@ "devDependencies": { "@iconify/json": "^2.2.40", "@intlify/unplugin-vue-i18n": "0.8.2", + "@types/crypto-js": "^4.1.1", "@types/file-saver": "2.0.5", "@types/js-cookie": "3.0.3", "@types/node": "18.14.2", diff --git a/src/api/login.ts b/src/api/login.ts index e85ce3e..2f75ecb 100644 --- a/src/api/login.ts +++ b/src/api/login.ts @@ -19,7 +19,8 @@ return request({ url: '/auth/login', headers: { - isToken: false + isToken: false, + isEncrypt: true }, method: 'post', data: params diff --git a/src/utils/crypto.ts b/src/utils/crypto.ts new file mode 100644 index 0000000..a3eef8f --- /dev/null +++ b/src/utils/crypto.ts @@ -0,0 +1,45 @@ +import CryptoJS from 'crypto-js'; + +/** + * 闅忔満鐢熸垚32浣嶇殑瀛楃涓� + * @returns {string} + */ +const generateRandomString = () => { + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let result = ''; + const charactersLength = characters.length; + for (let i = 0; i < 32; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +}; + +/** + * 闅忔満鐢熸垚aes 瀵嗛挜 + * @returns {string} + */ +export const generateAesKey = () => { + return CryptoJS.enc.Utf8.parse(generateRandomString()); +}; + +/** + * 闅忔満鐢熸垚aes 瀵嗛挜 + * @returns {string} + */ +export const encryptBase64 = (str: string) => { + return CryptoJS.enc.Base64.stringify(str); +}; + +/** + * 浣跨敤瀵嗛挜瀵规暟鎹繘琛屽姞瀵� + * @param message + * @param aesKey + * @returns {string} + */ +export const encryptWithAes = (message: string, aesKey: CryptoJS.lib.WordArray) => { + const encrypted = CryptoJS.AES.encrypt(message, aesKey, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }); + return encrypted.toString(); +}; diff --git a/src/utils/jsencrypt.ts b/src/utils/jsencrypt.ts index 18493ad..2d93757 100644 --- a/src/utils/jsencrypt.ts +++ b/src/utils/jsencrypt.ts @@ -2,7 +2,8 @@ // 瀵嗛挜瀵圭敓鎴� http://web.chacuo.net/netrsakeypair const publicKey = - 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='; + 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=='; const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + diff --git a/src/utils/request.ts b/src/utils/request.ts index d5fac4e..74f0d19 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -8,6 +8,8 @@ import { LoadingInstance } from 'element-plus/es/components/loading/src/loading'; import FileSaver from 'file-saver'; import { getLanguage } from '@/lang'; +import { encryptBase64, encryptWithAes, generateAesKey } from '@/utils/crypto'; +import { encrypt } from '@/utils/jsencrypt'; let downloadLoadingInstance: LoadingInstance; // 鏄惁鏄剧ず閲嶆柊鐧诲綍 @@ -29,6 +31,8 @@ const isToken = (config.headers || {}).isToken === false; // 鏄惁闇�瑕侀槻姝㈡暟鎹噸澶嶆彁浜� const isRepeatSubmit = (config.headers || {}).repeatSubmit === false; + // 鏄惁闇�瑕佸姞瀵� + const isEncrypt = (config.headers || {}).isEncrypt === 'true'; if (getToken() && !isToken) { config.headers['Authorization'] = 'Bearer ' + getToken(); // 璁╂瘡涓姹傛惡甯﹁嚜瀹氫箟token 璇锋牴鎹疄闄呮儏鍐佃嚜琛屼慨鏀� } @@ -63,6 +67,13 @@ } } } + // 褰撳紑鍚弬鏁板姞瀵� + if (isEncrypt && (config.method === 'post' || config.method === 'put')) { + // 鐢熸垚涓�涓� AES 瀵嗛挜 + const aesKey = generateAesKey(); + config.headers['encrypt-key'] = encrypt(encryptBase64(aesKey)); + config.data = typeof config.data === 'object' ? encryptWithAes(JSON.stringify(config.data), aesKey) : encryptWithAes(config.data, aesKey); + } // FormData鏁版嵁鍘昏姹傚ごContent-Type if (config.data instanceof FormData) { delete config.headers['Content-Type']; -- Gitblit v1.9.3