SpringBoot使用jasypt实现数据库信息的脱敏,以此来保护数据库的用户名username和密码password(容易上手,详细)
1.为什么要有这个需求?
一般当我们自己练习的时候,username和password直接是爆露出来的
假如别人路过你旁边时看到了你的数据库账号密码,他跑到他的电脑打开navicat直接就是一顿连接,直接疯狂删除你的数据库,那可就废了,所以像这种重要的敏感信息,一般是加密过后显示出来的,也就是数据的脱敏,一般公司你看到的数据库连接信息是这样的。
这显然就是加密过后的,但是数据库连接时如果获取到的是你加密过后的密码,那肯定是错误的,所以我们需要在数据库获取到信息之前,把它给解密,切记解密是在获取到数据之前进行的。
2.jasypt是如何保证数据安全的?
可能你会好奇,它既然能解密,那我拿着你的密文去调用jasypt提供的解密方法(api)去解密不就行了吗?但是jasypt可不是这么干的!它提供了一个盐salt,它加密和解密是如下过程进行的。
可以看出没有盐你就算知道密文也没用。也可以说盐就是打开你金库的钥匙。此时你可能会好奇,那密文肯定是代码里面生成的啊,那你生成的时候盐salt和原密码肯定也是写在代码里了,那不也不安全吗?其实这个密文是我们提前通过测试工具类生成好的再放到配置文件中,生成好以后测试工具类就可以直接删除了,所以盐和原密码不会暴漏在代码中,最终只有你知道。
3.SpringBoot项目中如何使用jasypt
3.1引入依赖
<!--jasypt-->
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>
3.2创建jasypt工具类
主要用于提前进行加密和解密的
package com.fzy.utils;import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;public class JasyptPasswordUtil {private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256";/*** 加密* @param salt 你设置加密用的盐* @return 加密类PooledPBEStringEncryptor所需要的配置类*/public static SimpleStringPBEConfig getJasyptConfig(String salt){//加解密配置SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(salt);//配置盐!!!极其重要config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);//加密算法//下面的配置不用关心config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");config.setStringOutputType("base64");return config;}/*** 加密方法* @param salt 输入盐* @param text 输入需要加密的文本* @return 密文*/public static String encryptText(String salt, String text){PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();//加密类SimpleStringPBEConfig config = getJasyptConfig(salt);//获取并设置加密配置类encryptor.setConfig(config);String encryptText = encryptor.encrypt(text);//进行加密return encryptText;}/*** 解密方法,此处没什么用,就是用来自己看看能不能解密* @param salt 输入盐* @param text 输入需要加密的文本* @return 明文*/public static String decryptText(String salt, String text){PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = getJasyptConfig(salt);encryptor.setConfig(config);String decryptText = encryptor.decrypt(text);return decryptText;}public static void main(String[] args) {//生成的密文将来放到你yml文件中,例如数据库的用户名密码等敏感信息String encryptText = encryptText("biecaile", "root");System.out.println("加密后:" + encryptText);String decrypt = decryptText("biecaile", encryptText);System.out.println("解密后:" + decrypt);}}
运行后的结果:
稍微了解两个加密算法,PBEWithMD5AndDES和PBEWITHHMACSHA512ANDAES_256
这两个算法跟jasypt的版本有关,如果我们不配置加密算法,无论是3.0还是2.0好像加密都是PBEWithMD5AndDES,但是解密,如果2.0.xxx是使用的PBEWithMD5AndDES,3.0使用的是PBEWITHHMACSHA512ANDAES_256,此处不是指我们自己测试去解密,而是指再配置完yml文件或者程序参数后自己去解密(下面),所以如果解密算法与加密不一致就会报错(一般启动项目就会报错),最好指定加密算法,像我是3.0版指定加密算法为PBEWITHHMACSHA512ANDAES_256
那在yml文件中就不用再配置解密算法了。配一下当然最好。
3.3配置yml文件
jasypt:encryptor:password: biecaile #解密盐值algorithm: PBEWITHHMACSHA512ANDAES_256 #解密算法
test:password: ENC(MsGb7KJD6ZxdEH5O42MM+lDVH6mvtP46IlwVqbXq/CHQR75x2+WG7YyOf3Ootndd)
其中的test:password是我们自定义的,主要用于测试,ENC()这个是jasypt自动识别yml属性值的一个标识,只要加上,当前值就会被解析成明文,里面存放的是我们生成的密文。
3.4编写读取yml文件属性值的配置类TestConfig
这里主要是为了测试能不能在获取到属性之前,密文已经被解密了,也就是说此处如果正确的话,获取到的就是我们的明文“root”,实际工作根本不需要
package com.fzy.config;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;@Configuration
@Data
public class TestConfig {@Value("${test.password}")private String password;
}
3.5随便编写一个TestController去测试获取该数据
@Controller
@RequestMapping("/test")
public class TestController {@Autowiredprivate TestConfig testConfig;@RequestMapping("/getText")@ResponseBodypublic String getText(){return testConfig.getPassword();}
}
结果发现获取到的是明文,已经成功了
4.能在配置文件中配盐值salt吗?
肯定是不行的,这样salt直接就爆露出来了,很危险,尤其是放在代码中,也很容易就发现,一般不会写在配置文件中的,我们可以把它放到启动类的程序实参中
填写:--jasypt.encryptor.password=你的盐值salt,然后apply+ok确定就行。
配置完以后把你在配置文件中的password(所谓的salt去掉就行),结果一样的。一般只要salt配的不对,程序启动就会直接报错。
总结:这样的话,就算我把代码给你,你都跑不起来项目,因为你没有salt就配不了,然后你只能去问我要,我就不给你,那么你就破解不了数据库的密文,你就别想连上我的数据库。
相关文章:
SpringBoot使用jasypt实现数据库信息的脱敏,以此来保护数据库的用户名username和密码password(容易上手,详细)
1.为什么要有这个需求? 一般当我们自己练习的时候,username和password直接是爆露出来的 假如别人路过你旁边时看到了你的数据库账号密码,他跑到他的电脑打开navicat直接就是一顿连接,直接疯狂删除你的数据库,那可就废…...
Python日志配置策略
1 三种情况下都能实现日志打印: 被库 A 调用,使用库 A 的日志配置。被库 B 调用,使用库 B 的日志配置。独立运行,使用自己的日志配置。 需要实现一个灵活的日志配置策略,使得日志记录器可以根据调用者或运行环境自动…...
想学编程,什么语言最好上手?
Python是许多初学者的首选,因为它的语法简洁易懂,而且有丰富的资源和社区支持。我这里有一套编程入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,…...
binlog和redolog有什么区别
在数据库管理系统中,binlog(binary log)和 redolog(redo log)是两种重要的日志机制,它们在数据持久性和故障恢复方面扮演着关键角色。虽然它们都用于记录数据库的变化,但它们的目的和使用方式有…...
Linux笔记--ubuntu文件目录+命令行介绍
文件目录 命令行介绍 当我们在ubuntu中命令行处理位置输入ls后会显示出其所有目录,那么处理这些命令的程序就是shell,它负责接收用户的输入,并根据输入找到其他程序并运行 命令行格式 linux的命令一般由三部分组成:command命令、…...
71、最长上升子序列II
最长上升子序列II 题目描述 给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数N。 第二行包含N个整数,表示完整序列。 输出格式 输出一个整数,表示最大长度。 数据范围 1 ≤ N ≤ 100000…...
解决必剪电脑版导出视频缺斤少两的办法
背景 前几天将电脑重置了,今天想要剪辑一下视频,于是下载了必剪,将视频、音频都调整好,导出,结果15分钟的视频只能导出很短的时长,调整参数最多也只能导出10分钟,My God! 解决 首…...
新人学习笔记之(常量)
一、什么是常量 1.常量:在程序的执行过程中,其值不能发生改变的数据 二、常量的分类 常量类型说明举例整型常量整数、负数、0123 456实型常量所有带小数点的数字1.93 18.2字符常量单引号引起来的字母、数字、英文符号S B字符串常量双引号引起来的&…...
Lua解释器裁剪
本文目录 1、引言2、文件功能3、选择需要初始化的库4、结论 文章对应视频教程: 已更新。见下方 点击图片或链接访问我的B站主页~~~ Lua解释器裁剪,很简单~ 1、引言 在嵌入式中使用lua解释器,很多时候会面临资源紧张的情况。 同时,…...
web前端设计nav:深入探索导航栏设计的艺术与技术
web前端设计nav:深入探索导航栏设计的艺术与技术 在web前端设计中,导航栏(nav)扮演着至关重要的角色,它不仅是用户浏览网站的指引,更是网站整体设计的点睛之笔。本文将从四个方面、五个方面、六个方面和七…...
分析解读NCCL_SHM_Disable与NCCL_P2P_Disable
在NVIDIA的NCCL(NVIDIA Collective Communications Library)库中,NCCL_SHM_Disable 和 NCCL_P2P_Disable 是两个重要的环境变量,它们控制着NCCL在多GPU通信中的行为和使用的通信机制。下面是对这两个环境变量的详细解读࿱…...
使用 Python 进行测试(6)Fake it...
总结 如果我有: # my_life_work.py def transform(param):return param * 2def check(param):return "bad" not in paramdef calculate(param):return len(param)def main(param, option):if option:param transform(param)if not check(param):raise ValueError(…...
Flink Watermark详解
Flink Watermark详解 一、概述 Flink Watermark是Apache Flink框架中为了处理乱序和延迟事件时间数据而引入的一种机制。在流处理中,由于数据可能不是按照事件产生的时间顺序到达的,Watermark被用来告知系统在该时间戳之前的数据已经全部到达ÿ…...
LeetCode538.把二叉搜索树转换为累加树
class Solution { public:int sum 0; TreeNode* convertBST(TreeNode* root) { if (root){convertBST(root->right);sum root->val;root->val sum;convertBST(root->left);}return root;}};...
关于编程思想
面向过程思想 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了 JS就是典型的面向过程的编程语言 优点: 性能比面向对象编程高,适合跟硬件联系很紧密的东西…...
521. 最长特殊序列 Ⅰ(Rust单百解法-脑筋急转弯)
题目 给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在,则返回 -1 。 「最长特殊序列」 定义如下:该序列为 某字符串独有的最长 子序列 (即不能是其他字符串的子序列) 。 字符串 s …...
【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常
【问题分类】驱动使用 【关键字】OCI、驱动使用、PHP 【问题描述】 PHP使用OCI8连接yashan数据库,使用绑定参数获取数据时,出现报错 如果使用PDO_OCI接口连接数据库,未弹出异常,但是无法正确获取数据 【问题原因分析】 开启O…...
深入分析 Android BroadcastReceiver (三)
文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例:监听网络状态变化 2.2. 自定义广播示例:发送自定义广播 2.3. 有序广播示例:有序广播 2.4. …...
在java中使用Reactor 项目中的一个类Mono,用于表示异步单值操作
Mono 是 Reactor 项目中的一个类,用于表示异步单值操作。Reactor 是一个响应式编程库,广泛应用于 Java 中的异步编程和非阻塞 I/O 操作。Mono 可以类比为一个可能(或将来)包含零个或一个值的异步计算结果。与 Flux(另一…...
LabVIEW故障预测
在LabVIEW故障预测中,振动信号特征提取的关键技术主要包括以下几个方面: 时域特征提取:时域特征是直接从振动信号的时间序列中提取的特征。常见的时域特征包括振动信号的均值、方差、峰值、峰-峰值、均方根、脉冲指数等。这些特征能够反映振动…...
掌握JavaScript中的`async`和`await`:循环中的使用指南
引言 在JavaScript的异步编程中,async和await提供了一种更接近同步代码的写法,使得异步逻辑更加清晰易懂。然而,当它们与循环结合时,一些常见的陷阱和误区可能会出现。本文将通过代码示例,指导你如何在循环中正确使用…...
java第二十三课 —— 继承
面向对象的三大特征 继承 继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子…...
不可不知的Java SE技巧:如何使用for each循环遍历数组
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…...
机器人建模、运动学与动力学仿真分析(importrobot,loadrobot,smimport)
机器人建模、运动学与动力学仿真分析是机器人设计和开发过程中的关键步骤。 一、机器人建模 机器人建模是描述机器人物理结构和运动特性的过程。其中,URDF(Unified Robot Description Format)是一种常用的机器人模型描述方法。通过URDF&…...
02-QWebEngineView的使用
Qt WebEngine_hitzsf的博客-CSDN博客 一、QWebEngineView QWebEngineView 类是一个实现Web浏览器的便捷类,提供了back() 、forward()、reload()、stop() 等方法,可轻松实现页面的前进、后退、重载等导航功能,要实现一个简单的只有网页加载网…...
【2024亲测无坑】在Centos.7虚拟机上安装Oracle 19C
目录 一、安装环境准备 1、linux虚拟机安装 2、虚拟机快照 3、空间检查&软件上传 二、Oracle软件安装 1.preinstall安装及其他配置准备 2.oracle安装 三、数据库实例的安装 1.netca——网络配置助手 2.dbca——数据库配置助手 四、ORACLE 19C 在linux centos 7上…...
JS中判断一个字符串中出现次数最多的字符,统计这个次数?
在JavaScript中,要判断一个字符串中出现次数最多的字符并统计这个次数,你可以通过创建一个对象来记录每个字符出现的次数,然后遍历这个对象以找到出现次数最多的字符。下面是一个简单的示例代码: function findMostFrequentChar(…...
rust-强化练习
钓鱼不打窝,钓的也不多 语言只靠看不行,还得练,下面是AI生成的一些题目,后续直接肝LeeCode,一举2得 1、猜数字 描述:创建一个简单的猜数字游戏,程序会随机生成一个数字,玩家需要猜出这个数字是…...
TF-IDF算法
TF-IDF算法详解 一、TF-IDF算法概述 TF-IDF(Term Frequency-Inverse Document Frequency)算法是一种常用于信息检索和文本挖掘的加权技术。其基本思想是通过评估一个词在文档中的重要性,来确定这个词在文档集合或语料库中的权重。TF-IDF算法…...
R语言数据分析案例29-基于ARIMA模型的武汉市房价趋势与预测研究
一、选题背景 房地产行业对于国民经济和社会及居民的发展和生活具有很大的影响,而房价能够体现经济运转的好坏,因而房价的波动牵动着开发商和购房者的关注,城市房价预测是一个研究的热点问题,研究房价对民生问题具有重要意义。 …...
万网备案初审过了后网站能访问吗/互联网营销师报名
题目描述: 把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串。 Input 只有一行,由一个字符串和两个字符组成,中间用单个空格隔开。 字符串是待替换的字符串,字符串长度小于等于30个字符,且不含空格…...
做兼职网站的主要参考文献/超级外链工具有用吗
JavaScript之原型链 参考:http://zhangjiahao8961.iteye.com/blog/2070650原型链 概念 原型链是一种机制,指的是JavaScript每个对象包括原型对象都有一个内置的[[proto]]属性指向创建它的函数对象的原型对象,即prototype属性。 作用 原型链的…...
泰兴市网站建设/google优化排名
su [user] 和 su - [user]的区别: su [user]切换到其他用户,但是不切换环境变量,su - [user]则是完整的切换到新的用户环境。 如: [rootrac1 ~]# pwd --当前目录 /root [rootrac1 ~]# su oracle --使用su [user] [oraclerac1 root…...
有做网站代理运营的吗/品牌咨询
我们的疑问是:iPad充电器可以给iPhone充电吗,iPad充电器不能为iPhone充电吗?使用iPad给iPhone充电的危害?用iPhone充电器会损害iPad吗?iPad充电器可以给iPhone快充吗?iPhone用iPad充电器是不是可以的呢&…...
做网站要不要营业执照/最近军事新闻热点大事件
郑重声明:本文纯属Fans同学的个人见解,仅供参考,欢迎拍砖。 软林至尊,Fans同盟。号令天下,莫敢不从。 Fans 1.老师教--这里的老师指大学教师。 优点:现场讲课,不懂可以问。 缺点:理…...
重庆网站页面优化/女生seo专员很难吗为什么
《Kotlin核心编程》阅读笔记第八章 元编程程序和数据什么是元编程常见的元编程技术Kotlin的反射kotlin和Java 反射koltin的KClasskotlin的KCallable获取参数信息Kotlin 注解无处不在的注解精准控制注解位置获取注解信息第八章 元编程 Java的反射只是元编程的一种方式。 示例&a…...