背景:Vue對參數進行加密,對響應進行解密。Java對參數進行解密,對響應進行解密。不攔截文件上傳類請求、GET請求。
【1】前端配置
安裝crypto
npm install crypto-js
編寫加解密工具類encrypt.js
import CryptoJS from 'crypto-js'const KEY = CryptoJS.enc.Utf8.parse('0123456789123456')
const IV = CryptoJS.enc.Utf8.parse('0123456789123456')// 加密函數
export function encryptData(data) {const encrypted = CryptoJS.AES.encrypt(data,KEY,{iv: IV,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7// padding: CryptoJS.pad.Pkcs7})return encrypted.toString()
}// 解密函數
export function decryptData(data) {const decrypted = CryptoJS.AES.decrypt(data,KEY,{iv: IV,mode: CryptoJS.mode.CBC,// padding: CryptoJS.pad.NoPaddingpadding: CryptoJS.pad.Pkcs7})return CryptoJS.enc.Utf8.stringify(decrypted)
}
axios對請求和響應進行處理
對請求進行參數加密:
// 對非文件上傳/下載請求的參數進行加密
if (!request.url.includes('file')) {if (request.method.toLowerCase() === 'post' || request.method.toLowerCase() === 'put') {let reqParams = {}reqParams.params=encryptData(request.data)request.data = Qs.stringify(reqParams)}
}
對響應進行參數解密:
let checkData=response.data
// 去除換行符
// checkData=checkData.replace(/(\r\n|\n|\r)/gm, '')
//去除空格
// checkData = checkData.replace(/\s/g,'')
let resData = decryptData(checkData)
// SyntaxError: Unexpected non-whitespace character after JSON at position 283 (line 1 column 284)
resData=resData.replace(/[^\x20-\x7E\u4E00-\u9FFF]+/g, "");
response.data = JSON.parse(resData.trim());
【2】后端配置
AesUtil 加解密工具類
public class AesUtil {/**** key和iv值可以隨機生成*/private static final String KEY = "0123456789123456";private static final String IV = "0123456789123456";/**** 加密* @param data 要加密的數據* @return encrypt*/public static String encrypt(String data){return encrypt(data, KEY, IV);}/**** param data 需要解密的數據* 調用desEncrypt()方法*/public static String desEncrypt(String data){return desEncrypt(data, KEY, IV);}/*** 加密方法* @param data 要加密的數據* @param key 加密key* @param iv 加密iv* @return 加密的結果*/private static String encrypt(String data, String key, String iv){try {//"算法/模式/補碼方式"NoPadding PkcsPaddingCipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");int blockSize = cipher.getBlockSize();byte[] dataBytes = data.getBytes();int plaintextLength = dataBytes.length;if (plaintextLength % blockSize != 0) {plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));}byte[] plaintext = new byte[plaintextLength];System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);byte[] encrypted = cipher.doFinal(plaintext);return new Base64().encodeToString(encrypted);} catch (Exception e) {e.printStackTrace();return null;}}/*** 解密方法* @param data 要解密的數據* @param key 解密key* @param iv 解密iv* @return 解密的結果*/private static String desEncrypt(String data, String key, String iv){try {byte[] encrypted1 = new Base64().decode(data);Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);byte[] original = cipher.doFinal(encrypted1);return new String(original).trim();} catch (Exception e) {e.printStackTrace();return null;}}
}
使用過濾器對請求進行解密、響應進行加密,參考博文:修改Request與Response中的內容