Vue前端服务加密后端服务解密--AES算法实现
在实际项目中考虑到用户数据的安全性,在用户登录时,前端需要对用户密码加密(防止用户密码泄露),服务端收到登录请求时先对密码进行解密,然后再进行用户验证登操作。本文使用 AES ECB 模式算法来实现前端机密后端解密基本流程。
基本流程
- 用户在登录页输入用户信息,点击登录按钮时,前端需要对用户密码进行加密,再去请求登录接口,进行登录;
- 如果用户选择记住密码,注意cookie或localStorage中要保存加密后的密码,以防止密码泄露;
- 当用户再次回到登录页时(用户退出或令牌过期时),从cookie或localStorage中拿到加密密码要先解密然后初始化到密码框中;
- 服务端收到登录请求,先进行密码解密,然后再去验证用户的有效性;
- 或者先根据用户名去获取用户信息,然后对该用户密码加密,再去跟前端传的密码比对,以验证密码的有效性。
后端加密算法
pom.xml 引入
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version>
</dependency><!-- fastjson2 -->
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.51</version>
</dependency>
AES 工具类
package com.angel.ocean.util;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.codec.binary.Base64;
import java.security.Security;
import java.util.Objects;@Slf4j
public class AESUtil {// AES 秘钥private static final String key = "5JKRGV0QO4WK1WCWVK55YEU0A1NPOXOP";private AESUtil() {}/*** AES 加密*/public static String encrypt(Object content) throws Exception {String data = "";if(null == content) {return null;}// 判断content是否为字符串if (content instanceof String) {data = content.toString();} else {data = JSON.toJSONString(content);}// 将加密过的byte[]数据转换成Base64编码字符串return base64ToString(aesECBEncrypt(data.getBytes(), key.getBytes()));}/*** AES解密*/public static Object decrypt(String content) {if(null == content) {return null;}try {byte[] base64 = stringToBase64(content);byte[] bytes = aesECBDecrypt(base64, key.getBytes());String result = new String(bytes);String data = result.replaceAll("\"", "");// 判断解密出来的数据是字符串还是jsonif (data.startsWith("{") && data.endsWith("}")) {return JSON.parse(data);} else {return data;}} catch (Exception e) {log.error("AESUtil.decrypt() error, {}", e.getMessage(), e);}return null;}private static byte[] aesECBEncrypt (byte[] content, byte[] keyBytes) {try {SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");cipher.init(Cipher.ENCRYPT_MODE, key);return cipher.doFinal(content);} catch (Exception e) {log.error("AESUtil.aesECBEncrypt() error, {}", e.getMessage(), e);}return null;}private static byte[] aesECBDecrypt(byte[] content, byte[] keyBytes) {try {SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");cipher.init(Cipher.DECRYPT_MODE, key);return cipher.doFinal(content);} catch (Exception e) {log.error("AESUtil.aesECBDecrypt() error, {}", e.getMessage(), e);}return null;}/*** 将字符串转换成Base64*/public static byte[] stringToBase64(String key) throws Exception {return Base64.decodeBase64(key.getBytes());}/*** 将Base64转换成字符串*/public static String base64ToString(byte[] key) throws Exception {return new Base64().encodeToString(key);}public static void main(String[] args) throws Exception {// 明文String data = "123456";// 加密String encryptData = encrypt(data);log.info("encryptData: {}", encryptData);// 解密String decryptData = Objects.requireNonNull(decrypt(encryptData)).toString();log.info("decryptData: {}", decryptData);}
}
main运行结果
Vue前端加密
安装crypto-js
npm install crypto-js
引入crypto-js
import CryptoJS from 'crypto-js'
AES 秘钥
const key = '5JKRGV0QO4WK1WCWVK55YEU0A1NPOXOP'
加密解密方法
methods: {encrypt (data) {var secretKey = CryptoJS.enc.Utf8.parse(key);var srcs = CryptoJS.enc.Utf8.parse(data);var encrypted = CryptoJS.AES.encrypt(srcs, secretKey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});return encrypted.toString();},decrypt(data) {var secretKey = CryptoJS.enc.Utf8.parse(key);var decrypt = CryptoJS.AES.decrypt(data, secretKey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});return CryptoJS.enc.Utf8.stringify(decrypt).toString();}
}
密码:123456,加密后的密码截图:
相关文章:

Vue前端服务加密后端服务解密--AES算法实现
在实际项目中考虑到用户数据的安全性,在用户登录时,前端需要对用户密码加密(防止用户密码泄露),服务端收到登录请求时先对密码进行解密,然后再进行用户验证登操作。本文使用 AES ECB 模式算法来实现前端机密…...

matlab实现文字识别
在MATLAB中实现文字识别通常涉及图像处理技术和机器学习算法,特别是使用MATLAB内置的Image Processing Toolbox和Machine Learning Toolbox。下面是一个基本的步骤指南,展示如何在MATLAB中设置和执行一个简单的OCR(Optical Character Recogni…...

Leetcode - 周赛409
目录 一,3242. 设计相邻元素求和服务 二,3243. 新增道路查询后的最短距离 I 三,3244. 新增道路查询后的最短距离 II 四,3245. 交替组 III 一,3242. 设计相邻元素求和服务 本题纯模拟,代码如下ÿ…...

突破百度网盘的下载限速,两种方法教会你【超详细】
一、前言 Hello,大家后,我是博主英杰,前几天,我在使用百度网盘过程中,下载速度极慢,自己作为一个白嫖党,开会员也是心疼那点钱,所以在网上找了几个有效解决百度网盘限速问题的教程&a…...

整理 酷炫 Flutter 优质 布局、交互 开源App
xtimer-flutter-app Flutter 计时器应用 项目地址:https://github.com/pedromassango/xtimer-flutter-app 项目Demo:https://download.csdn.net/download/qq_36040764/89631382...

【PyCharm怎么同时打开多个项目】
问题描述: 之前点击了“dont ask again”,再也不能同时打开两个或多个项目了。 解决: file->settings->appearance->system settings->project->选择ask...

使用 ProcDump 调试 Linux
Debug Linux using ProcDump By Gaurav Kamathe July 17, 2020 译者:wxy 校对:wxy 微软越来越心仪 Linux 和开源,这并不是什么秘密。在过去几年中,该公司稳步地增加了对开源的贡献,包括将其部分软件和工具移植到 L…...

2023年中国城市统计年鉴(PDF+excel)
2023年中国城市统计年鉴 1、时间:1985-2023年 2、格式:PDFexcel 3、说明:中国城市统计年鉴收录了全国各级城市社会经济发展等方面的主要统计数据,数据来源于各城市的相关部门。本年鉴内容共分四个部分:第一部分是全…...

自用 K8S 资源对象清单 YAML 配置模板手册-1
Linux 常用资源对象清单配置速查手册-1 文章目录 1、Pod 容器集合2、Pod 的存储卷3、Pod 的容器探针4、ResourceQuota 全局资源配额管理5、PriorityClass 优先级类 管理多个资源对象清单文件常用方法: 使用 sed 流式编辑器批量修改脚本键值进行资源清单的创建&am…...

【数据库】事务 | 视图 | 自定义函数创建
1、事物及其特征 事物机制的应用:淘宝订单交易,微信转账等。 视图--------筛子---------过滤-------筛选想要的信息 数据库只存放了视图对应的SQL语句。 视图是一个虚拟的表,本质是一个虚拟的SQL命令集合。 (1)创建…...

Linux---进程(5)---进程地址空间
目录 预备知识 进程地址空间 什么是进程地址空间 为什么要存在进程地址空间和页表 缺页中断 预备知识 我们在学习语言的时候,一般都会了解到内存区域划分,下面了解一下Linux的内存区域划分。 通过上图,我们了解到 1、堆区向上增长&…...

C语言实现数据结构之队列
目录 队列一. 队列的概念及结构二. 队列的实现1. 要实现的功能2 具体的实现2.1 结构体2.2 初始化2.3 入队列2.4 出队列2.5 返回队首元素2.6 返回队尾元素2.7 队列元素个数2.8 队列判空2.9 队列销毁 三. 队列相关OJ题设计循环队列用队列实现栈用栈实现队列 四. 概念选择题五. 参…...

写一个Vue2和vue3的自定义指令(以复制指定作为示例)
文章目录 一、自定义指令是什么?二、自定义指令有啥用?三、自定义指令怎么用?1.自定义指令的参数2.自定义指令的钩子函数(1)五个钩子函数的说明(2)钩子函数的参数(主要参数:el和valu…...

MySQL —— 聚合查询,分组查询 与 联合查询
聚合函数 常见的统计总数、计算平局值等操作,可以使用聚合函数来实现,常见的聚合函数有: 函数说明count()统计数据总数sum()求和avg()求平均值max()求最大值min()求最小值 注意凡是涉及运算的,数据库会自动掉 NULL 值 注意NULL …...

Spring声明式事务失效场景
Spring声明式事务失效场景 背景搭建测试环境测试事务失效场景Transactional 注解标注在 private 方法上异常被 catch 了,事务失效方法抛出的是受检异常,事务也会失效事务传播行为配置不合理导致事务失效 背景 Spring 针对 Java Transaction API (JTA)、…...

基于SpringBoot+UniAPP宠物食品外卖点单小程序的设计与实现》
✅博主简介:Java 全栈开发工程师,抖音优质技术创作者,日常分享实用的前端、后端、运维开发技术。 ✅技术栈:Java、SpringBoot、Vue、React、Node.js、Nest.js、Nuxt.js、uni-app ✅技术擅长:计算机毕设选题、开题报告、…...

ssrf 内网访问 伪协议 读取文件 端口扫描
SSRF(Server-Side Request Forgery,服务器侧请求伪造)是一种利用服务器发起网络请求的能力来攻击内网资源或执行其他恶意活动的技术。SSRF可以用于访问通常不可由外部直接访问的内网资源,读取文件,甚至进行端口扫描。以…...

发布包到npm
目录 注册npm账号 创建包 登录npm 上架包 更新包 删除包 注册npm账号 首先注册npm账号:npm | Sign Up (npmjs.com) 创建包 可以在桌面上新建一个文件夹:文件夹名随便起,但是别跟npm已经上架的包名重复了 可以通过下面的指令查看&…...

Python | Leetcode Python题解之第324题摆动排序II
题目: 题解: def quickSelect(a: List[int], k: int) -> int:seed(datetime.datetime.now())shuffle(a)l, r 0, len(a) - 1while l < r:pivot a[l]i, j l, r 1while True:i 1while i < r and a[i] < pivot:i 1j - 1while j > l an…...

IGModel——提高基于 GNN与Attention 机制的方法在药物发现中的实用性
导言 深度学习在药物发现(发现治疗药物)领域的应用以及传统方法面临的挑战。 药物(尤其是我们将在本文中讨论的被称为抑制剂的药物)通过与在人体中发挥不良功能的蛋白质结合并改变这些蛋白质的功能来发挥治疗效果。因此…...

AArch64中的寄存器
目录 通用寄存器 其他寄存器 系统寄存器 通用寄存器 大多数A64指令在寄存器上操作。该架构提供了31个通用寄存器。 每个寄存器可以作为64位的X寄存器(X0..X30)使用,或者作为32位的W寄存器(W0..W30)使用。这两种是查…...

树莓派Pico 2来了
这两天开源圈的大事之一,就是树莓派基金会发布了树莓派Pico 2。 帖子原文:Raspberry Pi Pico 2, our new $5 microcontroller board, on sale now 总结一些关键信息: 产品发布:Raspberry Pi Pico 2 是 Raspberry Pi 基金会推出的…...

LeetCode面试题Day7|LeetCode135 分发糖果、LeetCode42 接雨水
题目1: 指路: . - 力扣(LeetCode)135 分发糖果 思路与分析: 给n个孩子按照评分给糖果,要求有二,其一为每个孩子最少有一颗糖果;其二为相邻孩子评分更高的糖果越多。那么在这里第…...

[免费]适用于 Windows 10 的十大数据恢复软件
Windows 10 是 Microsoft 开发的跨平台和设备应用程序操作系统。它启动速度更快,具有熟悉且扩展的“开始”菜单,甚至可以在多台设备上以新的方式工作。因此,Windows 10 非常受欢迎,我们用它来保存照片、音乐、文档和更多文件。但有…...

Win11+docker+vscode配置anomalib并训练自己的数据(3)
在前两篇博文中,我使用Win11+docker配置了anomalib,并成功的调用了GPU运行了示例程序。这次我准备使用anomalib训练我自己的数据集。 数据集是我在工作中收集到的火腿肠缺陷数据,与MVTec等数据不同,我的火腿肠数据来源于多台设备和多个品种,因此,它们表面的纹理与颜色差异…...

Java | Leetcode Java题解之第332题重新安排行程
题目: 题解: class Solution {Map<String, PriorityQueue<String>> map new HashMap<String, PriorityQueue<String>>();List<String> itinerary new LinkedList<String>();public List<String> findItine…...

招聘公告|健安环保科技(广东)有限公司
招聘岗位:销售经理 岗位职责: 对PCB线路板和电镀行业的客户,推广针对镀锡漂洗水的低浓度锡回收技术(投资运营或设备销售),并销售无耗材材的电镀智能过滤设备,达成销售目标; 任职要求: 1、大专以上学历&…...

小程序的安全设计
小程序的安全设计 安全指引 | 微信开放文档 (qq.com) 开发原则与注意事项 本文档整理了部分小程序开发中常见的安全风险和漏洞,用于帮助开发者在开发环节中发现和修复相关漏洞,避免在上线后对业务和数据造成损失。 开发者在开发环节中必须基于以下原则: 互不信任原则,不要…...

【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
文章目录 webView使用步骤示例 HttpURLConnection使用步骤示例GET请求POST请求 okHttp使用步骤1. 添加依赖2. 创建OkHttpClient实例3. 创建Request对象构建请求4. 发送请求5. 获取响应 Pull解析方式1. 准备XML数据2. 创建数据类3. 使用Pull解析器解析XML webView WebView 是 An…...

Kubernetes—k8s集群存储卷(pvc存储卷)
目录 一、PVC 和 PV 1.PV 2.PVC 3.StorageClass 4.PV和PVC的生命周期 二、实操 1.创建静态pv 1.配置nfs 2.创建pv 3.创建pvc 4.结合pod,将pv、pvc一起运行 2.创建动态pv 1.上传 2.创建 Service Account,用来管理 NFS Provisioner 在 k8s …...