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故障预测中,振动信号特征提取的关键技术主要包括以下几个方面: 时域特征提取:时域特征是直接从振动信号的时间序列中提取的特征。常见的时域特征包括振动信号的均值、方差、峰值、峰-峰值、均方根、脉冲指数等。这些特征能够反映振动…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...

高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...

性能优化中,多面体模型基本原理
1)多面体编译技术是一种基于多面体模型的程序分析和优化技术,它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象,通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中࿰…...

[KCTF]CORE CrackMe v2.0
这个Reverse比较古老,已经有20多年了,但难度确实不小。 先查壳 upx压缩壳,0.72,废弃版本,工具无法解压。 反正不用IDA进行调试,直接x32dbg中,dump内存,保存后拖入IDA。 这里说一下…...