Vue前端服务加密后端服务解密--AES算法实现

news2024/11/16 4:31:38

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

基本流程

  1. 用户在登录页输入用户信息,点击登录按钮时,前端需要对用户密码进行加密,再去请求登录接口,进行登录;
  2. 如果用户选择记住密码,注意cookie或localStorage中要保存加密后的密码,以防止密码泄露;
  3. 当用户再次回到登录页时(用户退出或令牌过期时),从cookie或localStorage中拿到加密密码要先解密然后初始化到密码框中;
  4. 服务端收到登录请求,先进行密码解密,然后再去验证用户的有效性;
  5. 或者先根据用户名去获取用户信息,然后对该用户密码加密,再去跟前端传的密码比对,以验证密码的有效性。

后端加密算法

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("\"", "");

            // 判断解密出来的数据是字符串还是json
            if (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,加密后的密码截图:
在这里插入图片描述

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

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

相关文章

PLSQL导入导出ORACLE数据提示失败问题修改PLSQL配置

oracle中plsql导入提示无法导入问题 1.首先看下是否环境变量已经配置(具体配置看下面环境变量配置) 2.plsql数据导入中tools-->Preferences中配置如下框中的内容 3.设置 tnsnames.ora文件中看下是否设置有问题 4.PLSQL乱码问题 NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16…

C语言作业难题

计算 1 1/(2 * 3) 1/(3 * 4) ... 1/(n * (n 1)) ?直到最后一相值小于0.00001为至。 参考代码&#xff1a; #include <stdio.h> int main() { // 定义一个变量用来存储累加结果 double sum 1;// 将第一个运算数直接赋值给sum,后期程序无需在处理 double n 2; //…

如何快速对接Android平台GB28181接入模块(SmartGBD)

好多开发者希望我们不是从代码级&#xff0c;而是从流程方面&#xff0c;大概介绍下Android端GB28181设备接入段模块。本文以SmartGBD的Camera2Demo为例&#xff0c;大概聊下相关的集成流程。 大牛直播SDK推出的Android平台GB28181接入SDK&#xff08;SmartGBD&#xff09;&am…

git commit提示node不是内部或外部命令,也不是可运行的程序 或批处理文件。

使用git commit 提交项目时提示"node" 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 但是node早已安装了&#xff0c;node -v也能正常显示版本号&#xff0c;我检查了环境变量等配置&#xff0c;都是正常的 E:\work\2024\project12\DEMO>gi…

慧灵——引领智能机器人行业新潮流

随着人工智能和机器人技术的迅猛发展&#xff0c;智能机器人行业正迎来前所未有的增长潜力和创新机遇。慧灵科技作为行业内的佼佼者&#xff0c;以其创新技术和卓越性能&#xff0c;正在引领智能机器人行业的新潮流。 智能机器人行业是一个充满活力和潜力的领域。随着全球人口老…

花指令基础

花指令基础 偶尔更新。。。 默认会一点cpp和汇编。 文章目录 花指令基础1. 简介2. 常见类型1. jxjnx2. calladd [esp]ret 3. 等价解析1. push pop2. jmp call retn3. enter leave4. and MoeCTF 2022 chicken_soup参考 1. 简介 花指令可以误导反汇编&#xff0c;但不影响程序…

基于SpringBoot+Vue的物流管理系统(带1w+文档)

基于SpringBootVue的物流管理系统(带1w文档) 基于SpringBootVue的物流管理系统(带1w文档) 本课题研究和开发物流管理系统管理系统&#xff0c;让安装在计算机上的该系统变成管理人员的小帮手&#xff0c;提高物流管理系统信息处理速度&#xff0c;规范物流管理系统信息处理流程…

Vue - 关于v-wave 波浪动画组件

Vue - 关于v-wave 波浪动画组件 这个动画库可以在标签中添加新的v-wave属性&#xff0c;来让点击标签元素后添加漂亮的波纹效果&#xff0c;并且可以根据父元素自动形成波纹的颜色&#xff0c;也可以自定义波纹颜色&#xff0c;持续时间&#xff0c;透明度&#xff0c;触发的对…

JavaScript骚操作媒体查询攻略

背景 一讲到媒体查询&#xff0c;大家首先想到的可能都是都是CSS中media,这也没错&#xff0c;这确实是最常见的媒体查询方式&#xff0c;但是我们今天要讲的不是它&#xff0c;而是大家很少接触到的window.matchMedia()和window.resize 最近在做项目的时候拿到一个需求&…

MySQL笔记-基础篇(一):查询

博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 MySQL是一种广泛使用的关系型数据库管理系统&#xff0c;它基于结构化查询语言&#xff08;SQL&#xff09;来管理和操作数据。下面将依次探讨MySQL查询的各个方面&#xff0c;确保理解扎实&#xff0c;能够在实…

“阳光高考爬虫项目揭秘:增量爬虫与断点续抓的Python实战“

阳光高考项目 项目要求 爬取各大高校基本信息和招生简章&#xff08;招生简章要求存储为pdf格式并且入库&#xff09; 数据库表设计 idtask_urlstatus&#xff1a;0(未抓取)&#xff0c;1(抓取中)&#xff0c;2(抓取完毕)&#xff0c;3(错误)&#xff0c;4(更新中)&#xff…

C语言小练习(叁)

个人练习&#xff1a; 编程题&#xff1a; 1.编写一个函数&#xff0c;通过输入球的半径&#xff0c;返回球的体积&#xff1b; #include <stdio.h> #define pi 3.14 //计算球体积的函数 double v_ball(double r) {return 4.0 / 3.0 * pi * r * r * r; }int main() {d…

InfluxDB Studio 下载,时序数据库Windows图形界面操作

下载地址&#xff1a; https://github.com/CymaticLabs/InfluxDBStudio/releases解压缩后&#xff0c;双击 InfluxDBStudio.exe 运行。 参考 windows下 influxDB 操作工具 InfluxDBStudio 吐槽 现在 CSDN 太恶心了&#xff0c;动不动就让订阅或者积分下载资源。诚然&#…

【Python学习-UI界面】pyqt5页面布局

1、布局分类 序号类别描述1QBoxLayout可将小部件垂直或水平排列。它的派生类有QVBoxLayout&#xff08;用于垂直排列小部件&#xff09;和QHBoxLayout&#xff08;用于水平排列小部件&#xff09;。2QGridLayout对象呈现为行和列排列的单元格网格。该类包含addWidget()方法&am…

艾迈斯欧司朗推出突破性8通道915nm SMT脉冲激光器,开创激光雷达应用新时代

8通道915nm SMT脉冲激光器可增强自动驾驶汽车的远距离激光雷达系统&#xff1b;经过AEC-Q102认证的8通道QFN封装&#xff0c;具有高性能和高效率&#xff0c;采用艾迈斯欧司朗专有的波长稳定技术&#xff1b;基于20多年的脉冲激光器技术经验。 中国 上海&#xff0c;2024年8月8…

JAVA开发学习-day21

JAVA开发学习-day21 1. 删除表单数据 根据ElementUI的官方组件指南&#xff0c;为表单每列的数据添加删除按钮 <el-table :data"tableData" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…

那些你应该掌握的linux命令

一、路径授权 要给 a 用户 b 路径的所有操作权限,可以使用以下命令&#xff1a; sudo chown -R a:a /b sudo chmod -R 770 /b1.sudo chown -R a:a /b chown 命令用于更改文件或目录的所有者和所属组。-R 选项表示递归地应用于目录及其内部的所有文件和子目录。a:a 表示将所有…

24/8/8算法笔记 条件筛选决策树根节点

筛选决策树的根节点是建立决策树过程中的一个重要步骤&#xff0c;主要原因包括&#xff1a; 减少计算量&#xff1a;选择合适的根节点可以减少树的深度&#xff0c;从而减少模型训练和预测时的计算量。 提高模型性能&#xff1a;选择最佳分裂点可以最大化模型的性能&#xff…

更换低版本jdk8后的idea页面怎么换回来

一、问题阐述 一开始我的idea是下面的界面&#xff1a; 这个页面美观&#xff0c;简洁。后来因为工作需要&#xff0c;从jdk17切换到jdk8的时候&#xff0c;页面变了 这个没有前面的好看&#xff0c;怎么回事&#xff1f; 二、解决方案 1、file——setting 2、搜索ui——New UI…

全新博客X主题/简约WordPress主题模板/主题巴巴/免授权版源码+自适应设计

源码简介&#xff1a; 博客X这款超酷的Wordpress主题&#xff0c;是主题巴巴团队打造的设计杰作。想象一下&#xff0c;你的博客首页能展示那些炫酷的幻灯片置顶文章、还有各种精心策划的专题列表&#xff0c;这些内容模块的设计简直吸睛了&#xff0c;能让来访的用户眼前一亮…