SpringBoot+Vue使用AES进行接口加密

目录

前言

一、前端工作准备

  1.下载crypto-js

  2.加密解密工具类

  3.对axios请求拦截加密

二、后端工作准备

  1.所需依赖

  2.实现RequestBodyAdvice 

  3.实现HttpInputMessage

三、数据响应加密(扩展)

  1.实现 ResponseBodyAdvice(后端)

  2.axios响应拦截器(前端)


前言

        在数字化时代,数据安全已成为企业和社会关注的焦点。为了确保数据的机密性和完整性,我们采用SpringBoot和Vue技术,结合AES对称加密,构建一个高效且安全的系统。AES加密算法以其高度的安全性和广泛的应用场景,成为了数据加密的首选方案。通过在SpringBoot后端实现AES加密和解密逻辑,我们能够确保数据在传输和存储过程中的安全。同时,在Vue前端,我们利用相应的加密和解密方法,实现了与后端的无缝对接。这样,无论是数据的发送还是接收,都能够得到充分的保护。这种加密方案不仅提高了系统的安全性,也增强了用户的信任度。

一、前端工作准备

  1.下载crypto-js

npm install crypto-js --save-dev

  2.加密解密工具类

        keyOne是自己设置的一个key,可以根据你自己的业务来设置

import cryptoJs from 'crypto-js'
// 加密
let keyOne = '313233343536373a'
export function encrypt(word) {let key = cryptoJs.enc.Utf8.parse(keyOne)let enc = ''if (typeof word === 'string') {enc = cryptoJs.AES.encrypt(word, key, {// iv: ivmode: cryptoJs.mode.ECB,padding: cryptoJs.pad.Pkcs7})} else if (typeof word === 'object') {let data = JSON.stringify(word)enc = cryptoJs.AES.encrypt(data, key, {// iv: ivmode: cryptoJs.mode.ECB,padding: cryptoJs.pad.Pkcs7})}let encryptedData = enc.ciphertext;var encryptedBase64Str = encryptedData.toString().replace(/\//g, "_");encryptedBase64Str = encryptedBase64Str.replace(/\+/g,"-");console.log(encryptedBase64Str)return encryptedBase64Str;
}//解密
export function decrypt(word) {console.log('传入的密文:', word)let key = cryptoJs.enc.Hex.parse(keyOne)let dec = cryptoJs.AES.decrypt(cryptoJs.format.Hex.parse(word), key, {// vi: vimode: cryptoJs.mode.ECB,padding: cryptoJs.pad.Pkcs7})return cryptoJs.enc.Utf8.stringify(dec)
}

  3.对axios请求拦截加密

        这边我设置有一个拦截器,并且我只对Post请求进行拦截,其他请求不拦截,如果你想要其他请求(get、put、delete)进行拦截,则可以仿照Post请求来进行数据加密

const whiteList = ['/user/login',"/upload/oss"]; //排除的路径
// 请求拦截器
service.interceptors.request.use(config => {if (store.getters.token) {// 设置令牌请求头config.headers['authorization'] = store.getters.token;}if (config.method === 'post' && whiteList.indexOf(config.url)===-1 && config.data){config.headers['Content-Type'] = 'application/json;charset=UTF-8';config.data = encrypt(config.data)}return config},error => {return Promise.reject(error)}
);

二、后端工作准备

  1.所需依赖

        <!--        hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.17</version></dependency>

  2.自定义注解

        该注解用于在Post请求的方法上添加,open字段为是否打开解密,默认为true(打开)。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AESCrypto {boolean open() default true;
}

  3.实现RequestBodyAdvice 

package com.pzg.chat.handler;
@Slf4j
@ControllerAdvice
public class DecryptRequestBodyAdviceHandler implements RequestBodyAdvice {@Value("${crypto.charset}")private String charset = "UTF-8";@Value("${crypto.key}")private String key;@Overridepublic boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {return true;}@Overridepublic HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) throws IOException {AESCrypto methodAnnotation = methodParameter.getMethodAnnotation(AESCrypto.class);if (methodAnnotation!=null && BooleanUtil.isTrue(methodAnnotation.open())){return new DecryptHttpInputMessageHandler(inputMessage , charset , key);//请求信息解密,参考DecryptHttpInputMessage解密类}return inputMessage;}@Overridepublic Object afterBodyRead(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {return body;}@Overridepublic Object handleEmptyBody(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {return body;}
}

  4.实现HttpInputMessage

public class DecryptHttpInputMessageHandler implements HttpInputMessage {private HttpInputMessage inputMessage;private String charset;private String key;public DecryptHttpInputMessageHandler(HttpInputMessage inputMessage, String charset , String key) {this.inputMessage = inputMessage;this.charset = charset;this.key = key;}@Overridepublic InputStream getBody() throws IOException {//使用hutool开始解密InputStream body = inputMessage.getBody();String content = IoUtil.read(body , charset);byte[] bytes = SecureUtil.aes(key.getBytes(charset)).decrypt(content);return new ByteArrayInputStream(bytes);}@Overridepublic HttpHeaders getHeaders() {return inputMessage.getHeaders();}
}

        最后当前端发送post请求到后端后,就会被我们定义的 DecryptRequestBodyAdviceHandler 类所拦截,并获取其中信息并进行解密。

三、数据响应加密(扩展)

  1.实现 ResponseBodyAdvice<Object>(后端)

@ControllerAdvice
public class EncryptResponseBodyAdviceHandler implements ResponseBodyAdvice<Object> {@Overridepublic boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {return true;}@Overridepublic Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {sout("-------------->你的加密逻辑")return null;}
}

  2.axios响应拦截器(前端)

axios.interceptors.response.use((response) => {console.log("----------->解密逻辑")switch (response.data.code) {case 40001:Vue.prototype.$message({type: 'error',message: response.data.message})router.push({ path: '/login' })breakcase 50000:Vue.prototype.$message({type: 'error',message: response.data.message})break}return response},(error) => {return Promise.reject(error)}
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】RGB色彩空间转Lab色彩空间

用于检验的网站&#xff1a;颜色空间转换 - 在线工具 (buyaocha.com) 单个输入 import numpy as npdef rgb_to_xyz(rgb):# 将RGB值转换为XYZ空间rgb np.array(rgb) / 255.0rgb np.where(rgb < 0.04045, rgb / 12.92, ((rgb 0.055) / 1.055) ** 2.4)rgb rgb.reshape((…

格式化内存卡后,如何找回丢失的监控视频?

随着摄像头的应用越来越广泛&#xff0c;很多监控摄像头采用了内存卡作为存储介质&#xff0c;方便用户存储和查看摄像头拍摄的视频文件。然而&#xff0c;由于各种原因&#xff0c;监控摄像头的内存卡有时会被意外格式化导致重要数据的丢失&#xff0c;给用户带来诸多困扰。 那…

SpringMVC请求和响应

文章目录 1、请求映射路径2、请求参数3、五种类型参数传递3.1、普通参数3.2、POJO类型参数3.3、嵌套POJO类型参数3.4、数组类型参数3.5、集合类型参数 4、json数据传递4.1、传递json对象4.2、传递json对象数组 5、日期类型参数传递6、响应6.1、响应页面6.2、文本数据6.3、json数…

PHP集成开发 -- PhpStorm 2023

PhpStorm 2023是一款强大的PHP集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在提高开发人员的生产力和代码质量。以下是关于PhpStorm 2023软件的详细介绍&#xff1a; 首先&#xff0c;PhpStorm 2023提供了丰富的代码编辑功能&#xff0c;包括语法高亮、自动补全、代…

【DDD】学习笔记-代码模型的架构决策

代码模型属于软件架构的一部分&#xff0c;它是设计模型的进化与实现&#xff0c;体现出了代码模块&#xff08;包&#xff09;的结构层次。在架构视图中&#xff0c;代码模型甚至会作为其中的一个视图&#xff0c;通过它来展现模块的划分&#xff0c;并定义运行时实体与执行视…

sklearn.preprocessing 标准化、归一化、正则化

文章目录 数据标准化的原因作用归一化最大最小归一化针对规模化有异常的数据标准化线性比例标准化法log函数标准化法正则化Normalization标准化的意义数据标准化的原因 某些算法要求样本具有零均值和单位方差;需要消除样本不同属性具有不同量级时的影响: ① 数量级的差异将导…

比较以下Unity AStar Pathfinding, NavMesh, Recast Navigation 寻路算法的优点与缺点

一、AStar Pathfinding AStar Pathfinding是一种基于图搜索的寻路算法&#xff0c;它使用启发式搜索来找到最短路径。AStar Pathfinding的优点包括&#xff1a; 高效性&#xff1a;AStar Pathfinding是一种高效的寻路算法&#xff0c;因为它使用启发式搜索来找到最短路径&…

【AudioPolicy To AudioHAL笔记(三)】安卓S上audio_policy_configuration.xml 加载过程分析

安卓S上audio_policy_configuration.xml 加载过程分析 /*****************************************************************************************************************/ 声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创&#xff0c;转载or引用请注明…

「效果图渲染」效果图与3D影视动画渲染平台

效果图渲染和3D影视动画渲染都是视觉图像渲染的领域应用。效果图渲染主要服务于建筑、室内设计和产品设计等行业&#xff0c;这些领域通常对视觉呈现的精度和细节有较高要求。与之相比&#xff0c;3D影视动画渲染则普遍应用于电影、电视、视频游戏和广告等媒体领域&#xff0c;…

LLM(3) | 自注意力机制 (self-attention mechanisms)

LLM(3) | 自注意力机制 (self-attention mechanisms) self-attention 是 transformer 的基础&#xff0c; 而 LLMs 大语言模型也都是 transformer 模型&#xff0c; 理解 self-attention, 才能理解为什么 LLM 能够处理好上下文关联性。 本篇是对于 Must-Read Starter Guide t…

题目: 有1234个数字, 组成多个互不相同且无重复数字的三位数? 都是多少?

lua脚本如下 最原始的解题方法 local str{} local i, j, k0, 0, 0 for i1, 4 do for j1, 4 do for k1, 4 do if i~j and i~k and j~k then str[#str1]i..j..k end end end end print("组成的数有"..#str) print(table.unpack(str)) 运行的结果如下 组成的数有24 1…

SpringbootWeb案例

准备工作 需求说明 部门管理 部门管理功能开发包括&#xff1a;查询部门列表、删除部门、新增部门、修改部门   员工管理功能开发包括&#xff1a;查询员工列表(分页、条件)、删除员工、新增员工、修改员工 环境搭建 环境搭建步骤&#xff1a;1. 准备数据库表(dept、emp)…

【Chrono Engine学习总结】2-可视化

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 0、基本概念 类型说明&#xff1a; Chrono的可视化包括两块&#xff1a;实时可视化&#xff0c;以及离线/后处理可视化。 其中&#xff0c;实时可视化&#xff0c;又…

获取ping值最小IP

有时候我们访问一个网站&#xff0c;想要选择最佳的IP地址&#xff0c;那就可能需要修改hosts文件。那么怎么获取最佳的IP地址呢&#xff0c;我们以访问github为例。 获取IP 首先是看对应的url会解析出哪些IP。可以在通过站长工具测试多个地点Ping服务器,网站测速 - 站长工具…

近期CCF系列会议截稿时间

专属领域会议订阅 关注{晓理紫}&#xff0c;每日更新会议信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新会议信息。 CSFW (CCF B) IEEE Computer Security Foun…

Redis -- list列表

只有克服了情感的波动&#xff0c;才能专心致志地追求事业的成功 目录 列表 list命令 lpush lpushx rpush rpushx lrange lpop rpop lindex linsert llen lrem ltrim 阻塞命令 小结 列表 列表相当于 数组或者顺序表。 列表类型是用来存储多个有序的字符串&…

c++ 语法 类和对象

类的特性&#xff1a; 封装&#xff0c;继承&#xff0c;多态 封装&#xff1a; 将属性和行为作为一个整体&#xff0c;表现生活中的事务 将属性和行为加以权限控制 语法 class 类名{访问权限&#xff1a;属性/行为} // // main.cpp // cpplearn // // Created by KIN…

unity角色触摸转向

1、挂载脚本到角色的父物体A上 2 、以屏幕左边的触摸为移动&#xff0c;右边为转向操作 3、加载角色时&#xff0c;将角色的父物体设置为A&#xff0c;须将角色的位置和角度置0 using System; using System.Collections; using System.Collections.Generic; using UnityEngin…

Springboot校验注解

Spring Boot 提供了一组基于 Hibernate Validator 的校验注解&#xff0c;用于验证请求参数、实体对象等数据的合法性。下面是一些常用的 Spring Boot 校验注解及其功能&#xff1a; 导入依赖 <dependency><groupId>org.springframework.boot</groupId><…

Redis核心技术与实战【学习笔记】 - 8.Redis 时间序列数据处理

在做 web 产品是&#xff0c;都会有这么一个需求&#xff1a; 记录用户在网站或 APP 上的点击行为数据&#xff0c;来分析用户行为。这里的数据一般包括用户 ID、行为类型&#xff08;如浏览、登录、下单等&#xff09;、行为发生的时间戳。 userID, type, timeStamp 与之类似&…