密码加密解密之路

1.背景

做数据采集,客户需要把他们那边的数据库连接信息存到我们系统里,那我们系统就要尽可能的保证这部分数据安全,不被盗。

2.我的思路

1.需要加密的地方有两处,一个是新增的时候前端传给后端的时候,一个是存到数据库

2.与前端交互时的加密方式肯定和存到数据库的加密方式不同(为了安全)

3.接收前端传值,这块好说,跟前端约定一个加密方式,约定一个盐

4.存到数据库怎么加密解密

麻烦得点就在于存到数据库这里,

我是针对每一条数据都会生成一个uuid,然后nacos配置文件中还有一个盐salt

然后我把uuid和salt用特殊符号拼接之后,再进行一次加密形成最终盐 finalSalt

用finalSalt对密码进行加密,把密文密码存到数据库

如果用户对密码进行修改,那就重新生成一个uuid,再重新加密,存储密文

之所以设计这么麻烦,就是增加解密得困难度,想要明文,只有同时拿到数据库数据,nacos配置,以及我的java代码,才能解密,尽可能保障密码得安全性

5.密码可为空

这一点我是纠结了一会,因为在产品设计上密码是可为空得,如果我不把密码返回给前端,那前端保存得时候,如果用户没修改密码,前端上传给我得也会是空,那这个时候我就不知道到底是用户把密码改为空了,还是说他根本没有动密码这个文本框

所以我就把密文密码返回了,让他保存到时候再按照前后端约定加密传输给我,

我接收到之后先按照前后端约定得解密,再去和数据里边密文对比,

如果一致,说明没改,

如果不一致,说明修改了,并且解密出来的是明文密码,我会对明文密码按照4中说的再进行加密

但是把密文密码传给前端始终是个不太安全得事情

我后来想到一点,前端是可以识别到,用户是否动过密码这个文本框得

那我就不把密码返回给前端了

可以让前端给我一个标识,true,就代表动过文本框,

如果现在上传得密码为空,且动过文本框,那我就直接把密码字段保存为空即可。

如果现在上传得密码为空,但是false,没动过文本框,那我就不更新密码这个字段

如果现在上传密码不为空,那就不管true还是false了,密码肯定修改了,就先按照前后端解密再按照数据库加密即可

3.加解密工具类

这是针对数据库那一部分

博客上是前后端约定的那一部分

【精选】java前后端加密解密crypto-js_java crypto-CSDN博客


import org.apache.commons.codec.binary.Base64;
import org.springframework.util.StringUtils;import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.*;/*** @Description: 加密解密* @Version 1.0*/
public class SecretUtil {/*** 用uuid加密** @param UUID* @param salt     盐 从nacos配置中取值* @param password 明文密码* @return*/public static String encryptUUID(String UUID, String salt, String password) {if (!StringUtils.hasText(UUID) || !StringUtils.hasText(salt) || !StringUtils.hasText(password)) {return null;}//先把uuid和salt再进行一次加密String concat = UUID.concat(salt);byte[] bytes = base64Encrypt(concat);//再对明文密码进行加密return encrypt(password, bytes);}/*** UUID解密** @param UUID* @param salt     盐 从nacos配置中取值* @param password 密文密码* @return*/public static String decryptUUID(String UUID, String salt, String password) {if (!StringUtils.hasText(UUID) || !StringUtils.hasText(salt) || !StringUtils.hasText(password)) {return null;}//先把uuid和salt再进行一次加密String concat = UUID.concat(salt);byte[] bytes = base64Encrypt(concat);//再对明文密码进行加密return decrypt(password, bytes);}/*** base64加密** @param content 待加密内容* @return byte[]*/public static byte[] base64Encrypt(final String content) {return java.util.Base64.getEncoder().encode(content.getBytes());}/*** base64解密** @param encoderContent 已加密内容* @return byte[]*/public static byte[] base64Decrypt(final byte[] encoderContent) {return java.util.Base64.getDecoder().decode(encoderContent);}/*** 加密** @param data  待加密内容* @param bytes 盐的base64* @return*/public static String encrypt(String data, byte[] bytes) {byte[] dataByte = data.getBytes(StandardCharsets.UTF_8);try {KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(bytes);//这个128要特别注意  对长度有要求的keyGenerator.init(128, secureRandom);SecretKey secretKey = keyGenerator.generateKey();Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encrypted = cipher.doFinal(dataByte);// 加密return java.util.Base64.getEncoder().encodeToString(encrypted);} catch (Exception e) {throw new RuntimeException(e);}}/*** 解密** @param data  待解密内容* @param bytes 盐的base64* @return*/public static String decrypt(String data, byte[] bytes) {try {KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(bytes);//这个128要特别注意  对长度有要求的keyGenerator.init(128, secureRandom);SecretKey secretKey = keyGenerator.generateKey();Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey.getEncoded(), "AES"));//采用base64算法进行转码,避免出现中文乱码byte[] encryptBytes = Base64.decodeBase64(data);byte[] decryptBytes = cipher.doFinal(encryptBytes);return new String(decryptBytes);} catch (Exception e) {throw new RuntimeException(e);}}}

4.代码混淆

这块可以不看,是中间调研,走过的一个弯路

因为java的class文件可以反编译,所以我想让编译之后的代码变成01001那种无法识别的语言

但是发现java代码混淆并不能达成这个效果

但是毕竟走了一天弯路,还是记录下吧

4.1先看效果

4.2再上代码

从这下载吧

https://download.csdn.net/download/qq_35653822/88554123

里边有个字典,可以实现把包名,类名,变量名混淆为0o00o这种方式

5.不可逆算法

目前接触到的,存登录密码是不可逆算法,用的是security自带的加密

security提供了match方法,可以对比输入的密码和数据库中是否一致,返回true或者false,但是不提供解密方法

除非管理员可以一键重置用户的密码,把用户密码重置成初始化默认密码

存数据库里边的长这样,谁也看不出来存的是啥

 这种方法固然安全,但是对于我们1中说的需求,不适合这种算法,因为我们使用对方数据库的时候肯定要获取这个密码进行连接

    public static String irreversibleEncrypt(String password) {BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();//加密  每次调用加密方法 返回的结果都不同return passwordEncoder.encode(password);}/*** 对比* 不可逆算法 不能解密 只能对比** @param oldPassword     未加密密码 如123456* @param requestPassword 加密后的密码* @return*/public static boolean irreversibleMatch(String oldPassword, String requestPassword) {BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();//对比return passwordEncoder.matches(oldPassword, requestPassword);}

6.不对称算法

这个什么时候使用就看具体场景吧

7.keystore

Java密码术 - 存储密钥( Storing keys)_学习Java密码学|WIKI教程

这个同事调研过,结论是不适合我们,我没仔细研究

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

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

相关文章

异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (三)

内容提要: 如果说,爬取网页数据的时候,我们使用了异步,那么将数据放入redis里面,其实也需要进行异步;当然,如果使用多线程或者redis线程池技术也是可以的,但那会造成冗余; 因此,在测试完多线程redis搭配异步爬虫的时候,我发现效率直接在redis这里被无限拉低下来! 因此: 最终的r…

从0开始学习JavaScript--JavaScript中的集合类

JavaScript中的集合类是处理数据的关键,涵盖了数组、Set、Map等多种数据结构。本文将深入研究这些集合类的创建、操作,以及实际应用场景,并通过丰富的示例代码,帮助大家更全面地了解和应用这些概念。 数组(Array&…

SystemVerilog学习 (11)——覆盖率

目录 一、概述 二、覆盖率的种类 1、概述 2、分类 三、代码覆盖率 四、功能覆盖率 五、从功能描述到覆盖率 一、概述 “验证如果没有量化,那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加,无论是定向测试还是随机测试&#xff…

安全框架springSecurity+Jwt+Vue-1(vue环境搭建、动态路由、动态标签页)

一、安装vue环境,并新建Vue项目 ①:安装node.js 官网(https://nodejs.org/zh-cn/) 2.安装完成之后检查下版本信息: ②:创建vue项目 1.接下来,我们安装vue的环境 # 安装淘宝npm npm install -g cnpm --registryhttps:/…

软件测试/测试开发/人工智能丨基于Spark的分布式造数工具:加速大规模测试数据构建

随着软件开发规模的扩大,测试数据的构建变得越来越复杂,传统的造数方法难以应对大规模数据需求。本文将介绍如何使用Apache Spark构建分布式造数工具,以提升测试数据构建的效率和规模。 为什么选择Spark? 分布式计算:…

easyExcel注解详情

前言11个注解字段注解 类注解基础综合示例补充颜色总结 11个注解 ExcelProperty ColumnWith 列宽 ContentFontStyle 文本字体样式 ContentLoopMerge 文本合并 ContentRowHeight 文本行高度 ContentStyle 文本样式 HeadFontStyle 标题字体样式 HeadRowHeight 标题高度 HeadStyle…

Python将原始数据集和标注文件进行数据增强(随机仿射变换),并生成随机仿射变换的数据集和标注文件

Python将原始数据集和标注文件进行数据增强(随机仿射变换),并生成随机仿射变换的数据集和标注文件 前言前提条件相关介绍实验环境生成随机仿射变换的数据集和标注文件代码实现输出结果 前言 由于本人水平有限,难免出现错漏&#x…

OpenCV快速入门:图像滤波与边缘检测

文章目录 前言一、噪声种类与生成1.1 椒盐噪声1.2 高斯噪声1.3 彩色噪声 二、卷积操作2.1 卷积基本原理2.2 卷积操作代码实现 三、线性滤波3.1 均值滤波均值滤波原理均值滤波公式均值滤波代码实现 3.2 方框滤波方框滤波原理方框滤波公式方框滤波代码实现 3.3 高斯滤波高斯滤波原…

redis非关系型数据库(缓存型数据库)——中间件

【重点】redis为什么这么快?(应届) ①redis是纯内存结构,避免磁盘I/O的耗时 ②redis核心模块是一个单进程,减少线程切换和回收线程资源时间 ③redis采用的是I/O的多路复用机制(每一个执行线路可以同时完…

npm install 下载不下来依赖解决方案

背景 最近在构建 前端自动化部署 的方案中发现了一个问题,就是我在npm install的时候,有时候成功,有时候不成功,而且什么代码也没发生更改,报错也就是那么几个错,所以在此也整理了一下遇到这种情况&#xf…

如何使用 WPF 应用程序连接 FastReport报表

随着期待已久的FastReport WPF的发布,您不再需要使用 FastReport .NET 来处理基于 WPF 的项目。 不久前,在 FastReport .NET 中使用 WPF 还相当不方便。并非一切都进展顺利;连接 FastReport.dll 和许多其他问题存在问题。我们重新思考了该方…

2023年中职“网络安全“—Web 渗透测试①

2023年中职"网络安全"—Web 渗透测试① Web 渗透测试任务环境说明:1.访问地址http://靶机IP/task1,分析页面内容,获取flag值,Flag格式为flag{xxx};2.访问地址http://靶机IP/task2,访问登录页面。…

面试题c/c++--语言基础

一 、语言基础 1.1 指针 野指针:指针指向的位置是不可知的 悬空指针:指针最初指向的内存已经被释放了的一种指针 两种指针都指向无效内存空间, 即不安全不可控 。需要在定义指针后且在使用之前完成初始化或者使用 智能指针来避免 智能指针 智…

获取阿里云Docker镜像加速器

1、阿里云官网(www.aliyun.com)注册账号 2、打开“控制台首页” 控制台首页地址:https://home.console.aliyun.com/home/dashboard/ProductAndService 3、点击“概览->容器镜像服务 ACR” 4、打开“镜像工具->镜像加速器”页面&#x…

【grafana | clickhouse】实现展示多折线图

说明: 采用的是 Visualizations 的 Time series,使用的 clickhouse 数据源 在工作中遇到了一个需求,写好了代码,需要在grafana上展示在一个项目中所有人的,随时间的代码提交量变化图 目前遇到的问题:展示…

FFmpeg常用命令行讲解及实战一

文章目录 前言一、学习资料参考二、FFmpeg 选项1、主要选项①、主要命令选项②、举例 2、视频选项①、主要命令选项②、举例1)提取固定帧2)禁止输出视频3)指定视频的纵横比 3、音频选项①、主要命令选项②、举例 4、字幕选项①、主要命令选项…

负载均衡简介

负载均衡 负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。 负载均衡的分类和OSI模型息息相关&#xff0c…

【CHI】Ordering保序

本节介绍CHI协议所包含的支持系统保序需求的机制,包括: • Multi-copy atomicity • Completion response and ordering • Completion acknowledgment • Transaction ordering 一、 Multi-copy atomicity CHI协议中所使用的memory model要求为mu…

【面试经典150 | 数学】Pow(x, n)

文章目录 写在前面Tag题目来源题目解读解题思路方法一:快速幂-递归方法二:快速幂-迭代 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主…

王者荣耀游戏

游戏运行如下: sxt Background package sxt;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\24465\\D…