SpringBoot(八)使用AES库对字符串进行加密解密

博客的文章详情页面传递参数是使用AES加密过得,如下图所示:

1.jpg

这个AES加密是通用的加密方式,使用同一套算法,前端和后端都可以对加密之后的字符串进行加密解密操作。

目前线上正在使用的是前端javascript进行加密操作,将加密之后的字符串再传递到后端,PHP再进行解密操作。

现在我们将后端换成了SpringBoot,就需要使用java来实现后端解密操作。

一:javascript使用AES加密解密

需要引入加密文件库

https://s3.pstatp.com/cdn/expire-1-M/crypto-js/3.1.9/crypto-js.min.js

加密解密方法如下所示:

/*** @name:crypto-js 加密* @author: camellia* @email: guanchao_gc@qq.com* @date: 2021-01-22*/
export function encryptCode(param)
{var text = JSON.stringify(param);var key = CryptoJS.enc.Latin1.parse(‘1234567890789456’); //为了避免补位,直接用16位的秘钥var iv = CryptoJS.enc.Latin1.parse(‘1234567890789456’); //16位初始向量var encrypted = CryptoJS.AES.encrypt(text, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.ZeroPadding}).toString();return encrypted;
}
/*** @name:crypto-js 解密* @author: camellia* @email: guanchao_gc@qq.com* @date: 2021-01-22*/
export function decryptCode(param)
{var key = CryptoJS.enc.Latin1.parse(‘1234567890789456’); //为了避免补位,直接用16位的秘钥var iv = CryptoJS.enc.Latin1.parse(‘1234567890789456’); //16位初始向量const decrypt = CryptoJS.AES.decrypt(param, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.ZeroPadding}).toString(CryptoJS.enc.Utf8);return decrypt;
}

通过观察上方代码,我们可以发现,我使用的是AES-128算法加密,加解密模式为CBC,ZeroPadding是填充方法。

我的key和iv都是标准的16位,理论上来说,这个填充模式直接选择NoPadding就可以了,因为我不需要补位。

二:java使用AES加密解密

protected String key = "1234567890789456";protected String iv = "1234567890789456";/*** @Description AES算法加密明文* @param data 明文* @param key 密钥,长度16* @param iv 偏移量,长度16* @return 密文*/public String encryptAES(String data,String key,String iv) throws Exception{try{//            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");//            Cipher cipher = Cipher.getInstance("AES/CBC/ZeroPadding"); java中没有实现这个方法// 声明加密算法 / 加密方式  / 填充方式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());  // CBC模式,需要一个向量iv,可增加加密算法的强度cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);byte[] encrypted = cipher.doFinal(plaintext);return encode(encrypted).trim(); // BASE64做转码。}catch (Exception e){e.printStackTrace();return null;}}/*** @Description AES算法解密密文* @param data 密文* @param key 密钥,长度16* @param iv 偏移量,长度16* @return 明文*/public String decryptAES(String data,String key,String iv) throws Exception{try{byte[] encrypted1 = decode(data);//先用base64解密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);String originalString = new String(original,"UTF-8");return originalString.trim();}catch (Exception e){e.printStackTrace();return null;}}/*** 编码* @param byteArray* @return*/public String encode(byte[] byteArray){return new String(new Base64().encode(byteArray));}/*** 解码* @param base64EncodedString* @return*/public byte[] decode(String base64EncodedString){return new Base64().decode(base64EncodedString);}

这里注意一下,我使用的是java11,他是没有实现ZeroPadding这个填充方式的,但是,由于我的key和iv都是16位,不需要补位,因此我这里直接使用NoPadding即可。如果我的上述条件您不满足,可能您就需要换一个填充方式了。

三:AES加密简单介绍

AES加密又分成AES-128、AES-196、AES-256,其中128、196、256是针对加解密密钥长度的要求,即128位(16字节),196位(24字节),256位(32字节);

关于加解密模式和填充方式

针对待加解密明文、密文,长度有严格要求,即必须为16字节的整数倍(所以针对不同长度的数据,需要对齐,不够16位的需要填充数据,由此产生了不同的填充方式)。整个加解密的过程是对所有分割成16个字节长度的数据块进行循环加解密,最后合并起来形成最终结果集(加解密过程的不同产生了不同的加解密模式)。

常见加密模式:

2.jpg

常见填充方式:

3.jpg

以上大概就是java中AES加密和解密的使用。

有好的建议,请在下方输入你的评论。

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

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

相关文章

拦截器实现http请求访问本地图片

本文来记录下拦截器实现http请求访问本地图片 文章目录 概述代码实现本文小结 概述 如下图,本机(服务器)存储的图片想要在浏览器上通过Url地址访问: 浏览器直接访问 代码实现 烂机器实现文件真实地址和物理地址之间的映射 Slf4j Configuration public cl…

gpu-V100显卡相关知识

一、定义 RuntimeError: FlashAttention only supports Ampere GPUs or newer.torch attention注意力接口学习V100 架构是什么? 二、实现 RuntimeError: FlashAttention only supports Ampere GPUs or newer. 报错原因分析: GPU机器配置低,…

C++初阶——list

一、什么是list list是一个可以在序列的任意位置进行插入和删除的容器,并且可以进行双向迭代。list的底层是一个双向链表,双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来&…

《DiffusionDet: Diffusion Model for Object Detection》ICCV2023

摘要 本文提出了一种新的框架DiffusionDet,它将目标检测任务表述为从带噪声的边界框到目标边界框的去噪扩散过程(如图一所示)。在训练阶段,目标边界框逐渐扩散到随机分布,模型学习逆转这一加噪过程。在推理阶段&#…

词嵌入方法(Word Embedding)

词嵌入方法(Word Embedding) Word Embedding是NLP中的一种技术,通过将单词映射到一个空间向量来表示每个单词 ✨️常见的词嵌入方法: 🌟Word2Vec:由谷歌提出的方法,分为CBOW(conti…

Mit6.S081-实验环境搭建

Mit6.S081-实验环境搭建 注:大家每次做一些操作的时候觉得不太保险就先把虚拟机克隆一份 前言 qemu(quick emulator):这是一个模拟硬件环境的软件,利用它可以运行我们编译好的操作系统。 准备一个Linux系统&#xf…

qt QVideoWidget详解

1. 概述 QVideoWidget是Qt框架中用于视频播放的控件。它继承自QWidget,并提供了与QMediaPlayer等多媒体播放类集成的功能。QVideoWidget可以嵌入到Qt应用程序的用户界面中,用于显示视频内容。它支持多种视频格式,并提供了基本的视频播放控制…

10款PDF合并工具的使用体验与推荐!!!

在如今的信息洪流中,我们几乎每个人都被淹没在大量的数字文档之中。无论是学生、教师还是职场人士,我们都需要高效地管理和处理这些文档。而PDF文件,凭借其跨平台的稳定性和通用性,成了最常用的文档格式之一。我们经常需要处理、编…

【AI大模型】ELMo模型介绍:深度理解语言模型的嵌入艺术

学习目标 了解什么是ELMo.掌握ELMo的架构.掌握ELMo的预训练任务.了解ELMo的效果和成绩.了解ELMo的优缺点. 目录 🍔 ELMo简介 🍔 ELMo的架构 2.1 总体架构 2.2 Embedding模块 2.3 两部分的双层LSTM模块 2.4 词向量表征模块 🍔 ELMo的预…

Gurobi学术版+Anaconda安装步骤

注意:在anaconda虚拟环境中安装gurobi库是不需要在本地下载gurobi这个软件的,只需要conda install gurobi即可,或者指定版本的安装conda install -c gurobi gurobi11.0.3。 step0:安装ananconda step1:获得学术许可&a…

【C++】类与对象的基础概念

目录: 一、inline 二、类与对象基础 (一)类的定义 (二)访问限定符 (三)类域 (四)实例化概念 正文 一、inline 在C语言的学习过程中,大家肯定了解过宏这个概…

解决表格出现滚动条样式错乱问题

自定义表格出现滚动条时,会因为宽度不对等导致样式错乱; 解决思路: 监听表格数据的变化,当表格出现滚动条时,再调用更新宽度的方法updateWidth,去改变表格头部的宽度,最终保持表格头部和内容对…

天才的懈怠 : 平衡二叉树

力扣110:平衡二叉树 描述: 二叉树的每一个节点的左右子树高度差不超过1,即为平衡二叉树 递归 树:还是用递归,从最深的节点开始向上判断,保证每个节点的左右子树高度差不大于1,大于1的用 -1 做标…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包,而该项目的构建工具为 Webpack 或 Vite。同时,您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法,请随时留言。 安装 npm install three types/three react-three/fiber rea…

MySQL:CRUD

MySQL表的增删改查(操作的是表中的记录) CRUD(增删改查) C-Create新增R-Retrieve检查,查询U-Update更新D-Delete删除 新增(Create) 语法: 单行数据全列插入 insert into 表名[字段一,字段…

DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程

一、概述 【软件资源文件下载在文章最后】 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程 点餐软件以其实用的功能和简便的操作,为小型餐饮店提供了高效的点餐管理解决方案,提高了工作效率和服务质量 ‌点餐管理‌:支持电…

5G时代的关键元件:射频微波MLCCs市场前景广阔

根据QYResearch调研团队最新发布的《全球射频微波多层陶瓷电容器市场报告2023-2029》显示,预计到2029年,全球射频微波多层陶瓷电容器市场规模将攀升至12.4亿美元,其未来几年内的年复合增长率(CAGR)预计为5.1%。 以下图…

ElasticSearch学习笔记一:简单使用

一、前言 该系列的文章用于记录本人从0学习ES的过程,首先会对基本的使用进行讲解。本文默认已经安装了ES单机版本(当然后续也会有对应的笔记),且对ES已经有了相对的了解,闲话少叙,书开正文。 二、ES简介 …

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码原理.编码相关api

前提: 从前面的学习我们知道 AVFrame中是最原始的 视频数据,这一节开始我们需要将这个最原始的视频数据 压缩成 AVPacket数据, 我们前面,将YUV数据或者 RGBA 数据装进入了 AVFrame里面,并且在SDL中显示。 也就是说&…