【SpringBoot系列】vue+SpringBoot实现前后端数据加解密

这篇具有很好参考价值的文章主要介绍了【SpringBoot系列】vue+SpringBoot实现前后端数据加解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


为什么要加密

  1. 保护隐私:

    数据加密可以确保敏感信息在传输和存储过程中不被未经授权的人访问。对于个人用户来说,加密可以保护个人隐私,防止个人信息被窃取或滥用。对于企业来说,加密可以保护客户数据、商业机密和其他敏感信息,避免泄露和损害企业声誉。

  2. 防止数据篡改:

    加密可以防止数据在传输和存储过程中被篡改。通过使用加密算法和数字签名,可以确保数据的完整性,一旦数据被篡改,接收方可以立即发现并拒绝接受被篡改的数据。

  3. 合规要求:

    许多行业和法规要求对敏感数据进行加密保护。例如,医疗保健行业的HIPAA法规要求对患者的健康信息进行加密。金融行业的PCI DSS标准要求对信用卡数据进行加密。遵守这些合规要求可以避免法律和法规方面的风险和处罚。

  4. 数据安全传输:

    在数据传输过程中,特别是在公共网络上,加密可以确保数据的安全传输。通过使用加密协议(如SSL/TLS),可以防止数据被窃听、截获或篡改,确保数据的机密性和完整性。

  5. 数据备份和存储:

    加密可以确保在数据备份和存储过程中,即使数据被盗或丢失,也无法被未经授权的人访问。这对于保护企业的重要数据和知识产权非常重要。


代码示例

版本依赖

node 14.19.3

SpringBoot 3.1.4


前端

1.前期准备

​ 需要安装node环境

​ 安装好之后然后执行

​ npm install crypto-js

2.前端代码
Secret.js
import CryptoJS from 'crypto-js'

// 默认的 KEY 与 iv 如果没有给
const KEY = CryptoJS.enc.Utf8.parse("63eeac68cf074c8c");
const IV = CryptoJS.enc.Utf8.parse('63eeac68cf074c8c');
/**
 * AES加密 :字符串 key iv  返回base64
 */
export function Encrypt(word, keyStr, ivStr) {
  let key = KEY;
  let iv = IV;  
  if (keyStr) {
    key = CryptoJS.enc.Utf8.parse(keyStr);
    iv = CryptoJS.enc.Utf8.parse(ivStr);
  }
  let srcs = CryptoJS.enc.Utf8.parse(word);
  var encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv, 
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });
  return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);

}
/**
 * AES 解密 :字符串 key iv  返回base64
 *
 * @return {string}
 */
export function Decrypt(word, keyStr, ivStr) {
  let key  = KEY;
  let iv = IV;

  if (keyStr) {
    key = CryptoJS.enc.Utf8.parse(keyStr);
    iv = CryptoJS.enc.Utf8.parse(ivStr);
  }

  let base64 = CryptoJS.enc.Base64.parse(word);
  let src = CryptoJS.enc.Base64.stringify(base64);

  let decrypt = CryptoJS.AES.decrypt(src, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.ZeroPadding
  });

  let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  return decryptedStr.toString();
}
index.vue
<template>
  <div>
    <h1>Login Page</h1>
    <form>
      <label for="username">Username:</label>
      <input type="text" id="username" v-model="username">
      <br>
      <label for="password">Password:</label>
      <input type="password" id="password" v-model="password">
      <br>
      <button type="submit" @click.prevent="login">Login</button>
    </form>
  </div>
</template>

<script>
import { reactive } from 'vue';
import {Encrypt} from '../utils/Secret.js'

export default {
  data: function() {
	return {
	  username: '',
	  password: ''
	}
  },
  methods: {
	login: function() {
	  let userName = this.username;
	  let pword = this.password;
	  console.log("userName:"+userName+"password1:"+pword);
	  pword = Encrypt(pword);
	  console.log("password2:"+pword);
	  
	  fetch('http://localhost:8100/api/demo/login', {
	    method: 'POST',
	    headers: {
	      'Content-Type': 'application/json'
	    },
	    body: JSON.stringify({
	      userName: userName,
	      passward: pword
	    })
	  })
	  .then(response => response.json())
	  .then(data => console.log(data))
	  .catch(error => console.error(error));
	}
  }
};
</script>


后端

1.引入依赖
pom.xml引入
    <dependencies>
        <!--密码解密-->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.60</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.23</version>
        </dependency>
    </dependencies>
2.常用工具
SecretUtils
package org.example.utils;

import org.apache.tomcat.util.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * @author coderJim
 * @date 2023-04-25 00:07
 */
public class SecretUtils {
    /***
     * key和iv值可以随机生成
     */
    private static String KEY = "63eeac68cf074c8c";

    private static String IV = "63eeac68cf074c8c";

    /***
     * 加密
     * @param  data 要加密的数据
     * @return encrypt
     */
    public static String encrypt(String data){
        return encrypt(data, KEY, IV);
    }

    /***
     * param data 需要解密的数据
     * 调用desEncrypt()方法
     */
    public static String desEncrypt(String data){
        return desEncrypt(data, KEY, IV);
    }

    /**
     * 加密方法
     * @param data  要加密的数据
     * @param key 加密key
     * @param iv 加密iv
     * @return 加密的结果

     */
    private static String encrypt(String data, String key, String iv){
        try {
            //"算法/模式/补码方式"NoPadding PkcsPadding
            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());

            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);

//            return new Base64().encodeToString(encrypted);
            return Base64.encodeBase64String(encrypted);

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 解密方法
     * @param data 要解密的数据
     * @param key  解密key
     * @param iv 解密iv
     * @return 解密的结果
     */
    private static String desEncrypt(String data, String key, String iv){
        try {
            byte[] encrypted1 = new Base64().decode(data);

            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);
            return new String(original).trim();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

DemoContoller
package org.example;

import com.alibaba.fastjson2.JSONObject;
import org.example.utils.SecretUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author coderJim
 * @date 2023-04-25 00:24
 */
@RestController
@RequestMapping("/api/demo")
public class DemoContoller {

    @PostMapping("login")
    public Boolean login(@RequestBody(required = true) JSONObject json){

        String passward =  json.getString("passward");

        passward = SecretUtils.desEncrypt(passward);
        System.out.println("passward:"+passward);
        return true;
    }
}

总结

上面的是一个简单的例子,前端采用了vue,后端用了java,来展示了如何对数据进行加密,从而保障了敏感数据的泄露

源码下载:https://download.csdn.net/download/jinxinxin1314/87726994


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!文章来源地址https://www.toymoban.com/news/detail-504597.html

到了这里,关于【SpringBoot系列】vue+SpringBoot实现前后端数据加解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 后端SpringBoot+前端Vue前后端分离的项目(二)

    前言:完成一个列表,实现表头的切换,字段的筛选,排序,分页功能。 目录 一、数据库表的设计 二、后端实现 环境配置 model层  mapper层 service层  service层单元测试 controller层 三、前端实现 interface接口 接口api层 主要代码 效果展示 引入mybatis-plus依赖 MerchandiseDetailsService文

    2024年02月09日
    浏览(58)
  • 后端SpringBoot+前端Vue前后端分离的项目(一)

    前言:后端使用SpringBoot框架,前端使用Vue框架,做一个前后端分离的小项目,需求:实现一个表格,具备新增、删除、修改的功能。 目录 一、数据库表的设计 二、后端实现 环境配置 数据处理-增删改查 model层 mapper层 XML配置 Service层 controller层 单元测试 三、前后端交互 配置

    2024年02月10日
    浏览(69)
  • springboot + vue 前后端加密传输 RSA互相加解密、加签验签、密钥对生成

    参考 由于Java非对称加解密、加验签都是采用PKCS#8格式的密钥,PKCS#1格式的密钥跑不通,这里先简单介绍一下两者的区别。 PKCS#1和PKCS#8是两个不同的数字证书标准。 PKCS#1是一个公钥加密标准,它定义了使用RSA算法进行加密和签名的格式。主要用于对数字签名、加密以及数字签

    2024年04月27日
    浏览(42)
  • SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接

    系列文章: SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计 SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接 SpringBoot + Vue前后端分离项目实战 || 三:Spring Boot后端与Vue前端连接 SpringBoot + Vue前后端分离项目实战 || 四:用户管理功能实现 SpringBoot + Vue前后

    2024年02月12日
    浏览(66)
  • 实现vue项目和springboot项目前后端数据交互

    太高版本的win7不支持 这里安装node-v12.16.2-x64.msi,指定安装位置后直接按下一步就可以。 npm是node内置的工具 这里配置npm的镜像cnpm(提高下载速度,以后用到npm的命令都可以用cnpm命令替换)不指定cnpm版本使用如下命令会报错: 错误信息: 检查错误,参照网上的对应版本图,

    2024年04月25日
    浏览(36)
  • 全面解析若依框架(springboot-vue前后分离--后端部分)

    前端启动 后端启动 创建数据库ry-vue,导入ry_2021xxxx.sql,quartz.sql,加载好依赖直接启动。 后端技术 SpringBoot Spring Security JWT MyBatis Druid Fastjson 分页实现 导入导出 上传下载(框架使用的简单,不做讲解) 权限控制 事务管理(这里使用@Transactional,不做讲解,具体和Spring的8种事务

    2024年01月16日
    浏览(55)
  • 【SpringBoot+Vue】全网最简单但实用的前后端分离项目实战笔记 - 后端

    配套视频地址:https://www.bilibili.com/video/BV1dG4y1T7yp/ 如果您需要原版笔记,请up喝口水,可以上我的淘宝小店 青菜开发资料 购买,或点击下方链接直接购买: 源码+PDF版本笔记 源码+原始MD版本笔记 感谢支持! 创建springboot项目:2.7.8 pom依赖 yml 测试 编写代码生成器 启动类加注

    2024年02月04日
    浏览(53)
  • 基于Ant DesignPro Vue + SpringBoot 前后端分离 - 后端微服化 + 接口网关 + Nacos

    通过Ant DesignPro Vue + SpringBoot 搭建的后台管理系统后,实现了前后端分离,并实现了登录认证,认证成功后返回该用户相应权限范围内可见的菜单。 后端采用SpringCloud构建微服,采用SpringCloud Gateway做为服务网关,采用Nacos做为统一配置中心,并在服务网关部分解决了前端跨域调

    2024年02月12日
    浏览(60)
  • 基于Ant DesignPro Vue + SpringBoot 前后端分离 - 后端微服化 + 接口网关 + Nacos + Sentinel

    通过Ant DesignPro Vue + SpringBoot 搭建的后台管理系统后,实现了前后端分离,并实现了登录认证,认证成功后返回该用户相应权限范围内可见的菜单。 后端采用SpringCloud构建微服,采用SpringCloud Gateway做为服务网关,采用Nacos做为统一配置中心,并在服务网关部分解决了前端跨域调

    2024年02月11日
    浏览(47)
  • SpringBoot+Vue入门并实现前后端分离和数据库查询(入门笔记超详细)

    初学SpringBoot,很多地方都不懂,所以完成这个走了不少弯路,连夜写blog记录,生怕天一亮全忘干净了…… 前端:Vue(2 or 3),IDE是 VS code 后端:Spring Boot,IDE是 IDEA 数据库: MySQL 目前实现功能 : 前后端代码分离,显示数据库表的数据 1.【创建vue项目】 终端输入 打开图形化

    2024年04月28日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包