使用AES,前端加密,后端解密,spring工具类了

学习python的时候,看到很多会对参数进行加密,于是好奇心驱使下,让我去了解了下AES加密如何在java中实现。

首先

npm install crypto-js

然后在你的方法中,给你们前端源码看看,因为我用的ruoyi框架做的实验,请求可能不是axios发送的请求

<template><div id="app"><div>index2222222</div></div>
</template><script>
import * as echarts from "echarts";
import {listCar} from "@/api/shopcar/car";
import {listSchool, qryName, qryScore} from "@/api/shool/school";
export default {data() {return {// 遮罩层loading: true,// 选中数组ids: [],// 非单个禁用single: true,// 非多个禁用multiple: true,// 显示搜索条件showSearch: true,// 总条数total: 0,// 【请填写功能名称】表格数据carList: [],//测试数组demoList:[],// 弹出层标题title: "",// 是否显示弹出层open: false,// 查询参数queryParams: {pageNum: 1,pageSize: 10,spuId: null,spuName: null,skuId: null,skuInfo: null,num: null,tenantId: null,tenantName: null,userId: null,username: null,isSelect: null,addPrice: null,price: null,},// 表单参数form: {},// 表单校验rules: {}}},created() {},//钩子函数mounted() {this.qryScore();this.jiami();},methods: {jiami(){// 引入crypto-js库const CryptoJS = require('crypto-js');
// 定义密钥const key = CryptoJS.enc.Utf8.parse('1234567890123456'); // 密钥长度为16字节
// 定义待加密的文件内容const fileContent = 'Hello, World!';
// 加密文件内容const encrypted = CryptoJS.AES.encrypt(fileContent, key, {mode: CryptoJS.mode.ECB, // 加密模式为ECBpadding: CryptoJS.pad.Pkcs7 // 填充方式为Pkcs7});
// 打印加密后的内容console.log('加密后的内容:', encrypted.toString());
// 解密文件内容const decrypted = CryptoJS.AES.decrypt(encrypted, key, {mode: CryptoJS.mode.ECB, // 加密模式为ECBpadding: CryptoJS.pad.Pkcs7 // 填充方式为Pkcs7});
// 打印解密后的内容console.log('解密后的内容:', decrypted.toString(CryptoJS.enc.Utf8));},qryScore() {this.loading = true;qryScore().then(response => {console.log(1234)console.log(response)this.draw(response)});},draw(data) {// 初始化echarts实例let myChart = echarts.init(document.getElementById('myChart'))console.log(this.$echarts)myChart.setOption( {title: {text: 'ECharts 入门示例'},tooltip: {},xAxis: {data: data.name},yAxis: {},series: [{name: '销量',type: 'bar',data: data.grade}]});}}
}
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

实现结果

主要代码

// 引入crypto-js库
const CryptoJS = require('crypto-js');// 定义密钥
const key = CryptoJS.enc.Utf8.parse('1234567890123456'); // 密钥长度为16字节// 定义待加密的文件内容
const fileContent = 'Hello, World!';// 加密文件内容
const encrypted = CryptoJS.AES.encrypt(fileContent, key, {mode: CryptoJS.mode.ECB, // 加密模式为ECBpadding: CryptoJS.pad.Pkcs7 // 填充方式为Pkcs7
});// 打印加密后的内容
console.log('加密后的内容:', encrypted.toString());// 解密文件内容
const decrypted = CryptoJS.AES.decrypt(encrypted, key, {mode: CryptoJS.mode.ECB, // 加密模式为ECBpadding: CryptoJS.pad.Pkcs7 // 填充方式为Pkcs7
});// 打印解密后的内容
console.log('解密后的内容:', decrypted.toString(CryptoJS.enc.Utf8));

然后我们对请求加密。

后端我是参照这个文章写的,他是真正的大牛,感觉他的文章都写的好有用,虽然自己看不懂。

AES+自定义密钥实现加密解密(前端+后端)_crypto aes加密 自定义密钥-CSDN博客

先生成我们要的秘钥,然后把我们前端改了就行,我是在spring环境中,记得要在上面文件修改下,因为他好像不是spring环境下的配置。

成功了哈,我根据大佬文件改了改放在spring框架下也能用了,那么大致思路就有了,前端加密,后端解密就行了。

后端解密

大致思路有了,前端根据后端的秘钥进行加密发送,后端解密即可,偷个小懒我就不写了。

我把根据大佬修改后适配于spring环境下的配置文件写在下面了,因为我发现很多文章都只是个类并不适配于spring环境,还要单独修改,所以我改了那么一点点,弄出了工具类,大家粘贴复制即可。

package com.ruoyi.web.controller.utils;import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;/*** AES 加密工具类*/
@Component
public class AesUtil {// 加密算法RSApublic static final String KEY_ALGORITHM = "AES";//编码方式public static final String CODE_TYPE = "UTF-8";//填充类型 AES/ECB/PKCS5Padding   AES/ECB/ISO10126Paddingpublic static final String AES_TYPE = "AES/ECB/PKCS5Padding";/*** 自定义内容加盐,生成AES秘钥*/public  String generateAESKey(){return DigestUtils.md5Hex(getSalt(6)).substring(8, 24);}/*** 随机生成加盐类*/public  String getSalt(int n){char[] chars = ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +"1234567890!@#$%^&*()_+").toCharArray();StringBuilder stringBuilder = new StringBuilder();SecureRandom random = new SecureRandom();for(int i = 0; i < n; i++){stringBuilder.append(chars[random.nextInt(chars.length)]);}return stringBuilder.toString();}/*** 加密* @param clearText 明文* @param aesKey AES秘钥* @return 加密串*/public String encryptAes(String clearText, String aesKey) {try {SecretKeySpec key = new SecretKeySpec(aesKey.getBytes(), KEY_ALGORITHM);Cipher cipher = Cipher.getInstance(AES_TYPE);cipher.init(Cipher.ENCRYPT_MODE, key);byte[] encryptedData = cipher.doFinal(clearText.getBytes(CODE_TYPE));return new BASE64Encoder().encode(encryptedData);} catch (Exception e) {throw new RuntimeException("加密失败", e);}}/*** 解密* @param encryptText 密文* @param aesKey AES秘钥* @return 解密串*/public  String decryptAes(String encryptText, String aesKey) {try {byte[] byteMi = new BASE64Decoder().decodeBuffer(encryptText);SecretKeySpec key = new SecretKeySpec(aesKey.getBytes(), KEY_ALGORITHM);Cipher cipher = Cipher.getInstance(AES_TYPE);cipher.init(Cipher.DECRYPT_MODE, key);byte[] decryptedData = cipher.doFinal(byteMi);return new String(decryptedData, CODE_TYPE);} catch (Exception e) {throw new RuntimeException("解密失败", e);}}//  public static void main(String[] args) {
//    String aesKey = generateAESKey();
//    String json = "中文,abc,!@#";
//    //加密
//    System.out.println("字符串:" + json);
//    String encrypt = encryptAes(json, aesKey);
//    System.out.println(encrypt);
//    System.out.println("加密后字符串:" + encrypt);
//    //私钥解密
//    System.out.println("解密后字符串:" + decryptAes(encrypt, aesKey));
//  }}

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

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

相关文章

四川音盛佳云电子商务有限公司抖音电商的先行者

在当今数字时代&#xff0c;电商行业风起云涌&#xff0c;各大平台竞相争夺市场份额。而在这其中&#xff0c;四川音盛佳云电子商务有限公司以其独特的抖音电商服务模式&#xff0c;悄然崛起&#xff0c;成为了行业中的一股不可忽视的力量。今天&#xff0c;就让我们一起走进音…

【GD32F303红枫派使用手册】第二十六节 EXMC-液晶驱动实验

26.1 实验内容 通过本实验主要学习以下内容&#xff1a; LCD显示原理 EXMC NOR/SRAM模式时序和8080并口时序 LCD显示控制 26.2 实验原理 使用MCU的EXMC外设实现8080并口时序&#xff0c;和TFT-LCD控制器进行通信&#xff0c;控制LCD显示图片、字符、色块等。 26.2.1 TFT…

图像超分辨率重建

一、什么是图像超分辨 图像超分辨是一种技术&#xff0c;旨在通过硬件或软件的方法提高原有图像的分辨率。这一过程涉及从一系列低分辨率的图像中获取一幅高分辨率的图像&#xff0c;实现了时间分辨率向空间分辨率的转换。超分辨率重建的核心思想是利用多帧图像序列的时间带宽来…

计算机毕业设计Thinkphp/Laravel学生考勤管理系统zyoqy

管理员登录学生考勤管理系统后&#xff0c;可以对首页、个人中心、公告信息管理、年级管理、专业管理、班级管理、学生管理、教师管理、课程信息管理、学生选课管理、课程签到管理、请假申请管理、销假申请管理等功能进行相应操作&#xff0c;如图5-2所示。学生登录进入学生考勤…

金蝶云苍穹考试题目大全

前言 受不了某些地方看个答案还要收费&#xff0c;总结多份试卷 题目有重复&#xff0c;关键字检索即可 试卷一 金蝶云苍穹考试题目大全 单选题 开发知识错题反馈1.0分 1.关于编码规则的适用范围说法错误的是 A.单据没有设置主业务组织的情况下&#xff0c;则校验用户当前登…

【Spine学习16】之 人物面部绑定

1、创建头部骨骼 一根头骨 以头骨为父结点创建一个面部控制器face-holder 2、创建头发和face面部控制结点的变换约束 左右头发的约束指向为face结点 3、设定后发的变换约束&#xff0c;约束指向为face结点&#xff0c;反方向移动 设置参数为-100 同理&#xff0c;耳朵也依…

C# 中的 App.manifest 文件:优化应用程序配置与权限管理

前言 在开发 C# 应用程序时&#xff0c;可能会忽略一个重要的文件——App.manifest。这个文件看似不起眼&#xff0c;却在应用程序的运行和用户体验上扮演着关键角色。了解和正确配置 App.manifest 文件&#xff0c;不仅可以确保应用程序在不同操作系统上的兼容性&#xff0c;…

解决uniapp,textarea拉起页面被顶起和键盘被输入框遮挡的问题。

1&#xff1a;Android、ios 同时解决&#xff1b; 2&#xff1a;我们在开发的时候会发现textarea或者input拉起键盘的时候整个页面被顶起了&#xff0c;header也被顶没了&#xff1b;官方给了:adjustPositionfalse属性&#xff0c;设置完之后页面就不会被顶起&#xff0c;但是…

谈谈SQL优化

SQL优化是数据库性能优化中的关键环节&#xff0c;旨在提高查询执行的效率和响应速度。下面是一些常见的SQL优化技巧和策略&#xff0c;涵盖索引、查询设计、表结构设计等方面&#xff1a; 1. 索引优化 创建索引&#xff1a;为常用查询的过滤条件&#xff08;WHERE 子句&…

了解json

一.什么是json 1.什么是json是一种轻量级的数据交互&#xff0c;可以按照指定的json格式去组织和封装数据 2.json本质上是一个带有特定格式的字符串 二.json主要功能&#xff1a;json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同语言中的数据传递和交互&…

【Python时序预测系列】基于CNN+Bi-LSTM实现单变量时间序列预测(案例+源码)

这是我的第309篇原创文章。 一、引言 基于CNN&#xff08;卷积神经网络&#xff09;和Bi-LSTM&#xff08;双向长短期记忆网络&#xff09;的单变量时间序列预测是一种结合空间特征提取和时间依赖建模的方法。以下是一个基于Python和TensorFlow/Keras实现的示例&#xff0c;展…

C++ 高频面试题

C 初级面试题及其详细解答 1. 解释 C 中的基本数据类型。 解答&#xff1a; C 提供了几种基本数据类型&#xff0c;包括&#xff1a; int&#xff1a;整型&#xff0c;用于存储整数。float 和 double&#xff1a;浮点型&#xff0c;用于存储小数。char&#xff1a;字符型&am…

Android 强制使用移动网络访问接口

Android 强制使用移动网络访问接口_安卓连接wifi强制使用移动数据-CSDN博客 Android应用层实现恢复出厂设置功能_android7 intent 打开恢复出厂设置-CSDN博客

YOLOv8改进 | 主干网络| 可变形卷积网络C2f_DCN【CVPR2017】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、B…

java SQL server 多实例的情况

而对于java&#xff0c;对付多个数据库实例就有些要注意的了&#xff1a; 首先&#xff0c;同样连接字符串上加上“\实例名”&#xff1a; jdbc:sqlserver://127.0.0.1\\mssqlserver2008;DatabaseNameLPT; 此处应去掉端口1433。因为连接数据库自命名实例的url中没有端口号1433…

SiLM585x系列SiLM5851NHCG-DG一款具有分离的管脚输出 单通道隔离驱动器 拥有强劲的驱动能力

SiLM585x系列SiLM5851NHCG-DG是一款单通道隔离驱动器&#xff0c;具有分离的管脚输出&#xff0c;提供3.0A源电流和6.0A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 2.5A 米勒钳位。输入侧电源的工作电压为3V至5.5V&#xff0c;输出侧电源的工作电压范围为1…

独孤思维:研发的新赚钱项目,活脱脱掉了几层皮

01 今天有个读者问我&#xff0c;xx项目&#xff0c;成功概率多少&#xff1f; 其实这和做这个项目&#xff0c;能赚多少钱&#xff0c;本质是一个问题。 即&#xff0c;有多大的确定性。 言外之意&#xff0c;没有确定性&#xff0c;不稳定&#xff0c;我就不做了。 可以…

一位软件测试工程师繁忙的一天

早晨&#xff1a;启动一天的工作 7:00 AM - 起床 早晨七点准时起床。洗漱、早餐后&#xff0c;检查了手机上的邮件和消息&#xff0c;了解今天的工作安排和优先事项。 8:00 AM - 前往公司 乘坐地铁前往公司。在地铁上&#xff0c;他习惯性地阅读一些技术博客&#xff0c;了解…

小柴冲刺嵌入式系统设计师系列总目录

工作两年 逐渐意识到基础知识的重要性✌️ 意识到掌握了这个证书好像就已经掌握了80%工作中用到的知识了。剩下的就在工作的实战中学习 来和小柴一起冲刺软考吧&#xff01;加油&#x1f61c; 【小柴冲刺软考中级嵌入式系统设计师系列】总目录 前言 专栏目标&#xff1a;冲刺…

涵盖多项功能的文件外发系统,了解一下

伴随着业务范围的不断扩大&#xff0c;信息化的迅速发展&#xff0c;企业与客户、供应商等合作伙伴之间的文件交换也愈加频繁&#xff0c;尤其涉及到核心数据&#xff0c;像核心技术、设计图纸等敏感数据&#xff0c;对其的保护也是越发重视。文件外发系统&#xff0c;应运而生…