兰宝车间质量管理系统-前端
疯狂的狮子Li
2023-07-10 d0d67b90bc5808da88740dc81e4b3bcffbd482a5
add 新增 请求加密传输 合并优化 !pr377
已添加1个文件
已修改4个文件
64 ■■■■■ 文件已修改
package.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/login.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/crypto.ts 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/jsencrypt.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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",
src/api/login.ts
@@ -19,7 +19,8 @@
  return request({
    url: '/auth/login',
    headers: {
      isToken: false
      isToken: false,
      isEncrypt: true
    },
    method: 'post',
    data: params
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();
};
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' +
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'];