系统数据加密传输的实现

文章目录

  • 1、背景
  • 2、需求
  • 3、实现思路
    • 3.1 密码加密
    • 3.2 密码解密
    • 3.3 nacos密码加密
  • 4、相关工具类
    • 4.1 非对称加密RSA
    • 4.2 对称加密AES
    • 4.3 Nacos加解密的实现:Jasypt
  • 5、历史数据兼容处理

1、背景

用户在浏览器发送请求数据到后台系统,期间数据在网络传输,如果这些数据是敏感数据,被恶意拦截时,就有安全问题,造成用户密码泄漏等等。

在这里插入图片描述
如此,可考虑使用非对称加密或者对称加密,给前端一个公钥,让前端把数据用公钥加密后传到后端,后端负责解密得到原始数据后再处理请求,如此,即使被恶意拦截,也无法得到真实密码。

对称加密即:文件的加密和解密都是使用相同的密钥。加密方和解密方使用同一把钥匙。

在这里插入图片描述

对称加密的优点是加密速度快,缺点是相对不安全(如果别人知道你用的哪种加密算法且密钥泄漏,则一切形同虚设)。

非对称加密即:两个密钥,公钥用来加密,私钥用来解密

在这里插入图片描述

和对称加密相比,安全性更高,但加解密更慢,数据量小时可采用。对称加密和非对称加密这两种思想,市面上有多种不同的具体落地的算法。对称加密如AES,非对称加密如RSA。 具体选择:

  • 文件很大建议使用对称加密
  • 文件较小,要求安全性高,建议采用非对称加密

2、需求

对系统中敏感数据进行加密,保证数据安全。敏感数据包括:用户密码、用户手机号、用户邮箱、Nacos配置中各个中间件的密码。加密方向包括:

  • 数据加密传输:前端调用后端接口时,先用公钥对密码进行加密,再使用base64编码,然后传输
  • 数据加密存储:后端落库时,base64解码,再用私钥解密,对明文密码要经过Bcrypt等不可逆加密算法加密后保存,防止被拖库

在这里插入图片描述

3、实现思路

3.1 密码加密

这里使用非对称加密实现更合理。针对以上要加密的数据,用户密码处理的流程图如下:修改注册后端接口,用户注册时,提交密码,前端用公钥对密码进行加密后,传到后端服务器。后端接口中用私钥对密码进行解密,实现加密传输。解密后,再对解密后的明文密码进行加密,存入数据库,实现加密存储。项目中用到了Spring Security框架,所以这里用Bcrypt算法进行加密存储,Bcrypt也可防止彩虹表破解。

在这里插入图片描述

对邮箱名、手机号等信息,可非对称加密,也可使用AES对称加密,实现加密传输,加密落库则可有可无,如果选择了加密落库,可能会影响到之前的userList接口等等,总之明文、密文别转换叉了。

3.2 密码解密

修改后端登录接口,登录时,前端传来的密码,解密后传到SpringSecurity框架,如果账户是加密传输的,也需解密,因为框架里要loadUserByUsername,用户名得转换过来。

在这里插入图片描述

流程图:

在这里插入图片描述

3.3 nacos密码加密

项目中,用Nacos做配置管理,很多中间件,如MySQL、Redis的密码都明文存储在配置文件中,考虑改为密文存储。SpringBoot服务启动时,去Nacos拉取配置、注册服务信息。改为密文后,需要先解密,才能连接中间件成功,实现这个可以考虑加一个Filter过滤器或者AOP,在读配置文件时,判断如果是密文,则解密后重新赋值。这里直接用已有的开源实现:Jasypt

//官方文档:
https://github.com/ulisesbocchio/jasypt-spring-boot
//源码解析:
https://blog.csdn.net/u013905744/article/details/86508236

大致看了下,实现思路是借助SpringBoot Bean加载的扩展点,做一个过滤器,如果读到的内容是以Jasypt指定的前后缀ENC(),则解密后重新赋值:

在这里插入图片描述

4、相关工具类

4.1 非对称加密RSA

加密和解密的方法:

import org.apache.tomcat.util.codec.binary.Base64;import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** 使用Cipher类实现RSA加密解密**/
public class RSAUtil {/*** 私钥*/private static final String privateKey = "";/*** 公钥*/private static final String publicKey = "";/*** 编码字符集*/public static final String CHARSET = "UTF-8";/*** 算法定义*/public static final String RSA_ALGORITHM = "RSA";/*** RSA公钥加密** @param str 加密字符串* @return 返回加密字符串的base64值*/public static String encrypt(String str) throws Exception {//base64编码的公钥byte[] decoded = Base64.decodeBase64(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance(RSA_ALGORITHM).generatePublic(new X509EncodedKeySpec(decoded));//RSA加密并base64编码Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, pubKey);return Base64.encodeBase64String(cipher.doFinal(str.getBytes(CHARSET)));}/*** RSA私钥解密** @param str 加密字符串* @return 返回解密后的明文* @throws Exception 解密过程中的异常信息*/public static String decrypt(String str) throws Exception {//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes(CHARSET));//base64编码的私钥byte[] decoded = Base64.decodeBase64(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance(RSA_ALGORITHM).generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, priKey);return new String(cipher.doFinal(inputByte));}}

前端RSA加密:

// 安装jsencrypt
// npm i jsencrypt -Simport JSEncrypt from 'jsencrypt/bin/jsencrypt.min'//公钥
const publicKey = ''
//私钥
const privateKey = ''// 加密
export function encrypt(txt) {const encryptor = new JSEncrypt()encryptor.setPublicKey(publicKey) // 设置公钥return encryptor.encrypt(txt) // 对数据
}// 解密(暂无使用)
export function decrypt(txt) {const encryptor = new JSEncrypt()encryptor.setPrivateKey(privateKey) // 设置私钥return encryptor.decrypt(txt) // 对数据进行解密
}

4.2 对称加密AES

加密和解密的方法:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Base64Utils;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;/*** AES加密工具类*/
@Slf4j
public class AESUtil {/*** 编码*/private static final String ENCODING = "UTF-8";/*** 算法定义*/private static final String AES_ALGORITHM = "AES";/*** 指定填充方式*/private static final String CIPHER_PADDING = "AES/ECB/PKCS5Padding";/*** 密码*/private static final String AES_KEY = "your-private-key-xx";/*** AES加密** @param content 待加密内容* @return 加密后内容的base64值*/public static String encrypt(String content) {if (StringUtils.isBlank(content)) {return content;}try {//对密码进行编码byte[] bytes = AES_KEY.getBytes(ENCODING);//设置加密算法,生成秘钥SecretKeySpec secretKeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);// 算法/模式/补码方式Cipher cipher = Cipher.getInstance(CIPHER_PADDING);//选择加密cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);//处理待加密内容生成字节数组byte[] encrypted = cipher.doFinal(content.getBytes(ENCODING));//返回base64字符串return Base64Utils.encodeToString(encrypted);} catch (Exception e) {log.error("AESUtil.encrypt content:{}, 加密异常", content, e);return content;}}/*** 解密** @param content 待解密内容* @return 解密后的明文*/public static String decrypt(String content) {if (StringUtils.isBlank(content)) {return content;}try {//对密码进行编码byte[] bytes = AES_KEY.getBytes(ENCODING);//设置解密算法,生成秘钥SecretKeySpec secretKeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);// 算法/模式/补码方式Cipher cipher = Cipher.getInstance(CIPHER_PADDING);//选择解密cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);//先进行Base64解码byte[] decodeBase64 = Base64Utils.decodeFromString(content);//根据待解密内容进行解密byte[] decrypted = cipher.doFinal(decodeBase64);//将字节数组转成字符串return new String(decrypted, ENCODING);} catch (Exception e) {log.error("AESUtil.decrypt content:{}, 解密异常", content, e);return content;}}}

注意,不管是RSA的公钥私钥,还是AES的密钥,都重新生成了一次,以防止用户选择相对简单的密码,而被攻击者破解或推断密钥

在这里插入图片描述

4.3 Nacos加解密的实现:Jasypt

Jasypt 其实是一个专门用于加解密的库,用的是对称加密AES。jasypt-spring-boot-starter用在SpringBoot项目中的步骤:

  • 引入依赖
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>
  • 增加密钥配置
jasypt:encryptor:password: hello!!!# 默认的加密算法是 PBEWITHHMACSHA512ANDAES_256,JDK9才支持,JDK1.8用不了,改为下面这个algorithm: PBEWithMD5AndDES

这个password就别放nacos了,否则password泄漏,其余密文照样不安全,可放在项目jar包里的配置文件,或者直接不写在配置文件,只是让运维在java -jar是指定一下这个password值

  • 引入Jasypt的加密类,改造Nacos中的明文
@Autowired
private StringEncryptor encryptor;//明文变带有jasypt能识别前缀的密文
public String encrypt(String str) {return "ENC(" + encryptor.encrypt(str) + ")";
}// 生成结果如:ENC(GT2vTn1+SdeFu90xH/vgw3uYTNyV5PGp),替换Nacos中对应的明文
  • 前面提到,Jasypt自己会识别是否为自己的密文,然后解密后重新赋值,所以改造后取值,依旧像之前一样直接取即可
@Value("${spring.redis.password}")
private String password;

5、历史数据兼容处理

对旧的明文存储的数据,需要处理为密文,系统有定时任务管理页面的话,可考虑加个定时任务,给运维人员去执行一次。如果没有,可考虑提供一个内部接口,调用一次,处理旧数据。

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

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

相关文章

Git常见命令和用法

Git 文件状态 Git 文件 2 种状态: 未跟踪:新文件&#xff0c;从未被 Git 管理过已跟踪:Git 已经知道和管理的文件 常用命令 命令作用注意git -v查看 git 版本git init初始化 git 仓库初始化之后有工作区、暂存区(本地库)、版本库git add 文件标识暂存某个文件文件标识以终…

springboot集成tika解析word,pdf,xls文件文本内容

介绍 Apache Tika 是一个开源的内容分析工具包&#xff0c;用于从各种文档格式中提取文本和元数据。它支持多种文档类型&#xff0c;包括但不限于文本文件、HTML、PDF、Microsoft Office 文档、图像文件等。Tika 的主要功能包括内容检测、文本提取和元数据提取。 官网 https…

GRPC使用之ProtoBuf

1. 入门指导 1. 基本定义 Protocol Buffers提供一种跨语言的结构化数据的序列化能力&#xff0c;类似于JSON&#xff0c;不过更小、更快&#xff0c;除此以外它还能用用接口定义(IDL interface define language)&#xff0c;通protoc编译Protocol Buffer定义文件&#xff0c;…

Android14系统应用统一裁剪方案

Android14系统应用统一裁剪方案 背景 当前移除集成到系统里的应用,一般都是根据应用名,到各个mk文件里逐个在PRODUCT_PACKAGES中删除;这种方法,耗时而且不易管理集成到系统里的应用;需要有一个统一管理删除不需要应用的方案。 方案 参考PRODUCT_PACKAGES变量,添加PRO…

淘宝商品历史价格查询(免费)

当前资料来源于网络&#xff0c;禁止用于商用&#xff0c;仅限于学习。 淘宝联盟里面就可以看到历史价格 并且没有加密 淘宝商品历史价格查询可以通过以下步骤进行&#xff1a; 先下载后&#xff0c;登录app注册账户 打开淘宝网站或淘宝手机App。在搜索框中输入你想要查询的商…

短视频矩阵系统多账号搭建技术源码(saas开发者技术独立搭建)

在构建云服务环境以部署虚拟机方面&#xff0c;以Amazon Web Services&#xff08;AWS&#xff09;为示例&#xff0c;需采购并配置适当数量的EC2实例以及相关网络设施。 接下来&#xff0c;根据业务需求&#xff0c;应创建多个社交媒体平台如抖音和快手的官方账户&#xff0c;…

【计算机毕业设计】基于Springboot的B2B平台医疗病历交互系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

【记录】LaTex|LaTex 代码片段 Listings 添加带圆圈数字标号的箭头(又名 LaTex Tikz 库画箭头的简要介绍)

文章目录 前言注意事项1 Tikz 的调用方法&#xff1a;newcommand2 标号圆圈数字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭头写法&#xff1a;插入点相对位移标号node3.1 第一张图&#xff1a;插入点相对位移3.2 第二张图&#xff1…

如何玩转澳大利亚Facebook直播?

近年来&#xff0c;直播带货已经成为国内最赚钱的行业之一&#xff0c;各种玩法也越来越成熟。然而&#xff0c;在海外市场&#xff0c;尤其是澳大利亚&#xff0c;直播带货仍然是一片蓝海。作为社交媒体营销的主阵地&#xff0c;Facebook的直播功能却常常被卖家忽视。那么&…

贴脸细看Mixtral 8x7B- 稀疏混合专家模型(MoE)的创新与推动

贴脸细看Mixtral 8x7B- 稀疏混合专家模型&#xff08;MoE&#xff09;的创新与推动 原创 一路到底孟子敬 上堵吟 2024年01月15日 20:05 美国 I. 引言 A. Mixtral 8x7B的背景和目的 • 背景&#xff1a;随着大型语言模型在自然语言处理&#xff08;NLP&#xff09;领域的广泛…

【java计算机毕设】基于java的奶茶店管理系统的设计与实现MySQL ssm JSP maven项目代码源码+文档

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】奶茶店管理系统java MySQL ssm JSP maven项目源码代码万字文档 小组设计 2项目介绍 系统功能&#xff1a; 奶茶店管理系统包括管理员、用户俩种角色。 管理员功能包括个人中心模块用于修改个人信息和密码、…

游戏AI的创造思路-技术基础-情感计算(1)

游戏中的AI也是可以和你打情感牌的哦&#xff0c;不要以为NPC是没有感情的&#xff0c;不过&#xff0c;不要和NPC打过多的情感牌&#xff0c;你会深陷其中无法自拔的~~~~~~ 目录 1. 情感计算算法定义 2. 发展历史 3. 公式和函数 3.1. 特征提取阶段 TF-IDF&#xff08;词频…

AJAX-个人版2.0

AJAX&#xff08;Asynchronous Javascript And Xml&#xff09; 传统请求及缺点 传统的请求都有哪些&#xff1f; 直接在浏览器地址栏上输入URL。点击超链接提交form表单使用JS代码发送请求 window.open(url)document.location.href urlwindow.location.href url… 传统请…

一键换衣,这个AI可以让你实现穿衣自由

基于图像的虚拟穿衣是一种流行且前景广阔的图像合成技术&#xff0c;能够显著改善消费者的购物体验&#xff0c;并降低服装商家的广告成本。顾名思义&#xff0c;虚拟穿衣任务旨在生成目标人穿着给定服装的图像。 OOTDiffusion简述 图1 虚拟换衣 基于图像的虚拟穿衣目前面临两…

系统分析师-基础知识

基础知识 一、计算机组成与结构1、计算机系统基础知识1.1 计算机硬件组成1.2 中央处理单元&#xff08;CPU&#xff09;1.3 数据表示1.3.1 R进制转十进制&#xff1a;1.3.2 十进制转R进制&#xff1a; 1.4 校验码&#xff08;3种校验码&#xff09;1.4.1 基本知识1.4.2 奇偶校验…

2024-07抖音/快手/小红书/视频号/美团无人直播技术:最新不封号无人直播的操作方法详细介绍

2024年最新研究出来的无人直播技术&#xff0c;目前不封号&#xff0c;用途大大的&#xff0c;可带货&#xff0c;可引流&#xff0c;可获客。 手机自动直播源码通常涉及到实时流媒体技术和应用开发&#xff0c;它涉及以下几个关键部分&#xff1a; 摄像头接入&#xff1a;使用…

vue3 学习笔记01 -- 搭建项目及基础配置

vue3 学习笔记01 – 搭建项目及基础配置 确保你已经安装了Node.js&#xff08;建议使用最新的LTS版本&#xff09; 搭建项目 初始化项目 如果选择npm创建项目再执行 npm create vitelatest my-vue3-app --template vue-ts使用yarn&#xff0c;如果电脑没有安装yarn cnpm i ya…

(一)、python程序--模拟电脑鼠走迷宫

一、绪论 1、简介 电脑鼠走迷宫是一种比赛&#xff0c;制作实物电脑鼠小车在迷宫找目标点&#xff0c;用时最短者获胜。考验参赛选手软硬件结合的能力。 2、走迷宫模拟软件中已实现功能 1、点击迷宫墙壁可编辑迷宫&#xff0c;并且可保存和加载迷宫形状文件&#xff1b; 2、…

无线麦克风哪个牌子的好,麦克风哪个品牌音质最好,热门款式推荐

​在当今这个数字化迅速发展的时代&#xff0c;无线领夹麦克风已经成为自媒体创作者、直播主播以及专业录音师不可或缺的工具。它们以其小巧便携、易于操作和出色的录音质量&#xff0c;极大地提升了音频录制的效率和质量。无论是户外探险的Vlog拍摄&#xff0c;还是室内直播的…

基于Android平台开发,天气预报APP

1.项目功能思维导图 2. 项目涉及到的技术点 数据来源&#xff1a;和风天气API使用okhttp网络请求框架获取api数据使用gson库解析json数据使用RecyclerViewadapter实现未来7天列表展示和天气指数使用PopupMenu 实现弹出选项框使用动画定时器实现欢迎页倒计时和logo动画使用Text…