From 63606aff2f70f425b27700ec193a37ced8736bae Mon Sep 17 00:00:00 2001
From: liyuetong
Date: Mon, 25 Oct 2021 09:55:05 +0800
Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=89=8D=E7=AB=AF=E5=BC=80=E5=8F=91?=
=?UTF-8?q?=E3=80=91=E9=9A=8F=E6=9C=BA=E5=AF=86=E9=92=A5=E5=8A=A0=E5=AF=86?=
=?UTF-8?q?=E8=A7=A3=E5=AF=86--=E4=BF=AE=E6=94=B9request.js=E5=92=8Ccrypto?=
=?UTF-8?q?JsUtil.js=E8=84=9A=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package-lock.json | 11 ++++--
package.json | 3 +-
src/assets/js/utils/cryptoJsUtil.js | 29 +++++++++++++++
src/assets/js/utils/request.js | 56 ++++++++++++++++++++++++++---
4 files changed, 90 insertions(+), 9 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 2c9d5a9dd..2bec4473c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4050,9 +4050,9 @@
}
},
"crypto-js": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz",
- "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg=="
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
},
"css": {
"version": "2.2.4",
@@ -9559,6 +9559,11 @@
"xml-name-validator": "^3.0.0"
}
},
+ "jsencrypt": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/jsencrypt/-/jsencrypt-3.2.1.tgz",
+ "integrity": "sha512-k1sD5QV0KPn+D8uG9AdGzTQuamt82QZ3A3l6f7TRwMU6Oi2Vg0BsL+wZIQBONcraO1pc78ExMdvmBBJ8WhNYUA=="
+ },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
diff --git a/package.json b/package.json
index 80e5100d5..aeec3f67e 100644
--- a/package.json
+++ b/package.json
@@ -23,11 +23,12 @@
"animate.css": "^4.1.1",
"axios": "^0.19.0",
"core-js": "^2.6.5",
- "crypto-js": "^4.0.0",
+ "crypto-js": "^4.1.1",
"echarts": "^4.2.1",
"fastclick": "^1.0.6",
"js-base64": "^2.5.1",
"js-md5": "^0.7.3",
+ "jsencrypt": "^3.2.1",
"nprogress": "^0.2.0",
"pdfh5": "^1.2.13",
"vant": "2.2.0",
diff --git a/src/assets/js/utils/cryptoJsUtil.js b/src/assets/js/utils/cryptoJsUtil.js
index 1282179f0..868b5a36a 100644
--- a/src/assets/js/utils/cryptoJsUtil.js
+++ b/src/assets/js/utils/cryptoJsUtil.js
@@ -1,5 +1,23 @@
+import { JSEncrypt } from 'jsencrypt'
import CryptoJS from 'crypto-js'
export default {
+ // 生成本次请求随机密钥
+ randomString: function(len) {
+ len = len || 24
+ var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678oOLl9gqVvUuI1'
+ var maxPos = $chars.length
+ var pwd = ''
+ for (let i = 0; i < len; i++) {
+ pwd += $chars.charAt(Math.floor(Math.random() * maxPos))
+ }
+ return pwd
+ },
+ // RSA加密,公钥加密
+ RSAEncrypt : function (data, publicKey) {
+ let crypt = new JSEncrypt()
+ crypt.setPublicKey(publicKey)
+ return crypt.encrypt(data);
+ },
AESEncrypt: function(data, keys) {
//加密
var key = CryptoJS.enc.Hex.parse(keys)
@@ -45,3 +63,14 @@ export default {
return CryptoJS.enc.Utf8.stringify(decrypted)
}
}
+
+function format(base64, isPrivate = 0) {
+ var text = "-----BEGIN " + (isPrivate ? "PRIVATE" : "PUBLIC") + " KEY-----\n";
+ text += base64.replace(/[^\x00-\xff]/g, "$&\x01").replace(/.{64}\x01?/g, "$&\n");
+ text += "\n-----END " + (isPrivate ? "PRIVATE" : "PUBLIC") + " KEY-----";
+ return text;
+}
+export let MD5 = function (key) {
+ return CryptoJS.MD5(key);
+}
+export let publicKey = format(`MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApkixN3Dc6BLzb/V74VpxRXsSIu9AabGmK4xfcPiIqub0JS99a+P6XAOGuiMT2W4p1C8U9MZDRgHjUOrKGcc5ve9uT+U90LiAgwG58YdrklOTwlGvo6Xh4HQLRXMNoGsn6jLGdOV1RIVfWQ5EWfEB1+5v86QarLyfLIJ4ujVQfafEJ4dCwmoNSJk8xqVBAW9tDZlNOOgaZPJuEXVIFEEjIZCkFkFxkomwVNdp79Xewrj0mCybCDVy6Mcx3jOxY0gGwbGgS3YQxDbOpqYna8rcmf6CVJ2GA75sCU61Y8Of244CR5Rwkspbr1Pbf4UNSbVbpxzI08z1jrJvCVYWNQLMwwIDAQAB`);
diff --git a/src/assets/js/utils/request.js b/src/assets/js/utils/request.js
index 5019f1efa..3bc7ea034 100644
--- a/src/assets/js/utils/request.js
+++ b/src/assets/js/utils/request.js
@@ -1,8 +1,16 @@
import axios from 'axios'
-import AESTools from '@/assets/js/utils/cryptoJsUtil'
+// import AESTools from '@/assets/js/utils/cryptoJsUtil'
+import {
+ MD5,
+ RSAEncrypt,
+ AESEncrypt,
+ AESDecrypt,
+ randomString,
+ publicKey,
+} from '@/assets/js/utils/cryptoJsUtil'
import configApp from '@/config'
import { Dialog, Toast } from 'vant'
-import MD5 from 'js-md5'
+// import MD5 from 'js-md5'
import CacheUtils from '@/assets/js/utils/cacheUtils'
import BusinessCommon from '@/assets/js/business-common'
@@ -147,16 +155,42 @@ service.interceptors.request.use(
message: '加载中……'
})
}
+ // 生成本次请求随机密钥
+ let masterKey
+ if (!window.localStorage.getItem('masterKey')) {
+ masterKey = randomString();
+ window.localStorage.setItem('masterKey',masterKey)
+ } else {
+ masterKey = window.localStorage.getItem('masterKey')
+ }
/**
* 请求拦截处理(待添加 判断走统一网关处理)
*/
+ console.log(config)
if (config.url && /api\/$/.test(config.url.split(configApp.API_VERSION)[0]) && configApp.API_VERSION == 'v2') {
if (!config.data || config.data == null) {
config.data = {}
}
if (!!config.data && config.data != null) {
- let encrypt = AESTools.AESEncrypt(JSON.stringify(config.data), configApp.REQ_PWD)
- config.data = { data: encrypt }
+ // let encrypt = AESTools.AESEncrypt(JSON.stringify(config.data), configApp.REQ_PWD)
+ console.log('随机密钥:' + masterKey);
+ // RSA加密随机密钥
+ let ak = RSAEncrypt(masterKey, publicKey);
+ console.log('加密后的masterKey:' + ak);
+ // 随机密钥加密data
+ let data = AESEncrypt(JSON.stringify(config.data), masterKey);
+ console.log('MD5值:' + MD5(AESEncrypt(data, masterKey)).toString());
+ // 验证数据完整性MD5
+ // 数据完整性MD5需要进行二次AES加密
+ config.headers['signature'] = MD5(AESEncrypt(data, masterKey)).toString();
+ config.data = { ak, data };
+ console.log(config.data);
+ if(AESDecrypt(config.data.data, masterKey)){
+ console.log(JSON.parse(AESDecrypt(config.data.data, masterKey)));
+ }else{
+ console.log(AESDecrypt(config.data.data, masterKey));
+ }
+ // config.data = { data: encrypt }
}
}
@@ -208,7 +242,19 @@ service.interceptors.response.use(
) {
if (res.response) {
// 正常情況返回必有response 节点
- res = JSON.parse(AESTools.AESDecrypt(res.response, configApp.REQ_PWD))
+ // 返回结果的随机密钥
+ let masterKey;
+ if (!window.localStorage.getItem('masterKey')) {
+ return Promise.reject('密钥失效')
+ } else {
+ masterKey = window.localStorage.getItem('masterKey');
+ }
+ console.log('请求结果response' + response)
+ console.log('请求结果masterKey:' + masterKey)
+ console.log(JSON.parse(AESDecrypt(response.data.response, masterKey)))
+ // 使用随机密钥解密返回结果data
+ res = JSON.parse(AESDecrypt(res.response, masterKey))
+ // res = JSON.parse(AESTools.AESDecrypt(res.response, configApp.REQ_PWD))
}
}