Vue和Java使用AES加密传输

news/2025/2/4 18:51:58 标签: vue.js, 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.niftyadmin.cn/n/5841744.html

相关文章

54【ip+端口+根目录通信】

上节课讲到,根目录起到定位作用,比如我们搭建一个php网站后,注册系统是由根目录的register.php文件执行,那么我们给这个根目录绑定域名https://127.0.0.1,当我们浏览器访问https://127.0.0.1/register.php时&#xff0…

5分钟在本地PC上使用VLLM快速启动DeepSeek-R1-Distill-Qwen-32B

5分钟在本地PC上使用VLLM快速启动DeepSeek-R1-Distill-Qwen-32B 前言环境准备所需工具创建虚拟环境安装VLLM及依赖库 模型下载安装Hugging Face CLI下载DeepSeek-R1-Distill-Qwen-32B 模型启动启动命令启动确认 模型验证发送API请求示例输出 注意事项参考链接 前言 VLLM 是一个…

虚幻基础17:动画层接口

能帮到你的话,就给个赞吧 😘 文章目录 animation layer interface animation layer interface 动画层接口:动画图表的集。仅有名字。 添加到动画蓝图中,由动画蓝图实现动画图表。

Golang 并发机制-4:用Mutex管理共享资源

并发性是Go的强大功能之一,它允许多个线程(并发线程)同时执行。然而,权力越大,责任越大。当多个例程并发地访问和修改共享资源时,可能会导致数据损坏、竞争条件和不可预测的程序行为。为了解决这些问题&…

【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙

目录 1. 梯度基本计算 2. 控制梯度计算 3. 梯度计算注意 4. 小节 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活…

centos如何压缩zip

在CentOS系统中,压缩和解压缩文件是常见的任务之一。zip命令行工具可以方便地将文件或目录压缩成zip格式文件。本文将详细介绍如何在CentOS上安装并使用zip工具进行文件和目录的压缩。 安装zip工具 首先,确保系统安装了zip工具。如果未安装&#xff0c…

数据结构:时间复杂度

文章目录 为什么需要时间复杂度分析?一、大O表示法:复杂度的语言1.1 什么是大O?1.2 常见复杂度速查表 二、实战分析:解剖C语言代码2.1 循环结构的三重境界单层循环:线性时间双重循环:平方时间动态边界循环&…

【玩转 Postman 接口测试与开发2_015】第12章:模拟服务器(Mock servers)在 Postman 中的创建与用法(含完整实测效果图)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十二章 模拟服务器(Mock servers)在 Postman 中的创建与用法1 模拟服务器的概念2 模拟服务器的创建2.1 开启侧边栏2.2 模拟服务器的两种创建方式2.3 私有模拟器的 API 秘钥的用法…