当前位置: 首页 > article >正文

Vue和Java使用AES加密传输

背景: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.NoPadding
      padding: 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 PkcsPadding
            Cipher 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中的内容


http://www.kler.cn/a/531177.html

相关文章:

  • 阿里云盘PC端打不开解决办法
  • C++底层学习预备:模板初阶
  • 双指针算法思想——OJ例题扩展算法解析思路
  • 【python】python油田数据分析与可视化(源码+数据集)【独一无二】
  • 图像噪声处理技术:让图像更清晰的艺术
  • ubuntu 下使用deepseek
  • DeepSeek系列模型完全使用手册|附安装教程
  • SpringCloud系列教程:微服务的未来(二十)Seata快速入门、部署TC服务、微服务集成Seata
  • Vue.js 异步、延迟组件加载
  • 数据结构:时间复杂度
  • list容器(详解)
  • diffusion 训练trick 多横纵比设置
  • 算法总结-二分查找
  • 取模与加减乘除原理,模拟实现代码及相关公式推导
  • 【线程】基于阻塞队列的生产者消费者模型
  • 【C语言篇】“三子棋”
  • kubernetes(二)
  • 对比JSON和Hessian2的序列化格式
  • 前端 | JavaScript中的reduce方法
  • 【14】WLC3504 HA配置实例
  • 【股票数据API接口49】如何获取股票实时交易数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 自动化构建-make/Makefile 【Linux基础开发工具】
  • 本地快速部署DeepSeek-R1模型——2025新年贺岁
  • relational DB与NoSQL DB有什么区别?该如何选型?
  • C++ Primer 迭代器
  • Unity特效插件GodFX