【SpringBoot3】使用Jasypt加密数据库用户名、密码等敏感信息
一、使用步骤介绍
使用Jasypt(Java Simplified Encryption)进行数据加密和解密主要涉及几个步骤,包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中,以及应用程序启动时自动解密。以下是详细的使用说明:
1. 引入依赖
首先,你需要在你的项目中引入Jasypt的依赖。如果你是使用Maven构建项目,可以在pom.xml
文件中添加如下依赖(注意版本号可能随时间更新,请参考最新版本):
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>
可根据需要替换成最新的版本号。
2. 配置加密密码
Jasypt需要一个密码来进行加密和解密操作。你可以通过以下几种方式配置这个密码:
-
在配置文件中指定:在你的
application.properties
或application.yml
配置文件中,添加jasypt.encryptor.password
配置项,并设置你的密码。例如:# application.properties jasypt.encryptor.password=your_encryption_password
或者,在
application.yml
中:jasypt:encryptor:password: your_encryption_password
然而,将密码直接写在配置文件中可能存在安全风险。因此,更推荐的做法是通过启动参数或环境变量来传递这个密码。
-
通过启动参数指定:在启动应用程序时,可以通过
-Djasypt.encryptor.password=your_encryption_password
参数来指定加密密码。 -
使用环境变量:在某些情况下,使用环境变量来存储敏感信息(如加密密码)可能更为安全。具体方法取决于你的应用程序部署环境。
3. 加密敏感信息
在配置加密密码后,你可以使用Jasypt提供的工具或API来加密你的敏感信息。加密后的信息将以密文形式存储。
-
使用Jasypt CLI工具:Jasypt提供了一个命令行界面(CLI)工具,允许你在命令行中加密和解密字符串。你需要下载Jasypt的jar包,并在命令行中运行相应的命令。
-
使用Jasypt API:在你的Java应用程序中,你可以通过注入
StringEncryptor
接口的实现类来编程方式加密和解密字符串。这通常在你的Spring Boot应用程序中通过自动装配完成。
4. 将加密信息存储到配置文件中
加密敏感信息后,你需要将这些加密后的信息存储到配置文件中。在Jasypt中,加密后的信息通常以ENC(...)
的形式出现,括号内是加密后的密文。例如:
# application.properties
datasource.password=ENC(加密后的密码)
5. 应用程序启动时自动解密
当你的Spring Boot应用程序启动时,Jasypt会自动检测配置文件中的ENC(...)
字符串,并使用你配置的加密密码来解密这些字符串。解密后的明文将用于应用程序的配置中。
注意事项
- 安全性:确保你的加密密码足够复杂且安全存储,避免将密码直接写在配置文件中。
- 版本兼容性:注意你使用的Jasypt版本与其他库或框架的兼容性。
- 算法选择:Jasypt支持多种加密算法,你可以根据需要在配置文件中指定加密算法。
通过以上步骤,你可以在你的Spring Boot应用程序中使用Jasypt来加密和解密配置文件中的敏感信息。
二、使用示例代码
1、通过工具类生成密文
在application.properties 中增加配置,或者通过-Djasypt.encryptor.password=123456
参数来指定加密密码
# 用于加密的密码
jasypt.encryptor.password=123456
使用 stringEncryptor.encrypt()
生成密文
public class JasyptSecretTest {@Autowiredprivate StringEncryptor stringEncryptor;@Value("${datasource.password}")private String password;@Testpublic void encrypt(){// 加密String encrypt = stringEncryptor.encrypt("root");System.out.println("encrypt = " + encrypt);}
}
2、在application.properties 中增加配置密文
# 加密后的密文,包裹在ENC() 中
datasource.password=ENC(grdksstYZMsPmwvA0ALHXpzBQN2YTyA3t4ow1PDfJzbl+UV0LdO8UlajWKeqUF7y)
# 用于加密的密码
jasypt.encryptor.password=123456
3、使用 @Value()
获取明文,也可以通过stringEncryptor.decrypt(encrypt)
手动解密
@SpringBootTest
public class JasyptSecretTest {@Autowiredprivate StringEncryptor stringEncryptor;@Value("${datasource.password}")private String password;@Testpublic void encrypt(){// 加密String encrypt = stringEncryptor.encrypt("root");System.out.println("encrypt = " + encrypt);// 解密,输入获取的加密字符串进行解密String decrypt = stringEncryptor.decrypt(encrypt);System.out.println("decrypt = " + decrypt);}@Testpublic void show(){System.out.println("password = " + password);}
}
原理说明
SpringBoot项目在启动过程中,会自动注入beanStringEncryptor
,用于根据不同的加密算法初始化不同的加解密实现类,通过StringEncryptorBuilder.build()
初始化不同的加密算法
BeanNamePlaceholderRegistryPostProcessor
@Bean(name = ENCRYPTOR_BEAN_NAME)
public StringEncryptor stringEncryptor(final EnvCopy envCopy,final BeanFactory bf) {final String customEncryptorBeanName = envCopy.get().resolveRequiredPlaceholders(ENCRYPTOR_BEAN_PLACEHOLDER);final boolean isCustom = envCopy.get().containsProperty(ENCRYPTOR_BEAN_PROPERTY);return new DefaultLazyEncryptor(envCopy.get(), customEncryptorBeanName, isCustom, bf);
}
通过EncryptableMapPropertySourceWrapper重写了getProperty()方法,在获取配置值的时候,再做解密返回明文
DefaultPropertyResolver
@Override
public String resolvePropertyValue(String value) {return Optional.ofNullable(value).map(environment::resolvePlaceholders).filter(detector::isEncrypted).map(resolvedValue -> {try {// 获取密文String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());String resolvedProperty = environment.resolvePlaceholders(unwrappedProperty);// 执行解密操作return encryptor.decrypt(resolvedProperty);} catch (EncryptionOperationNotPossibleException e) {throw new DecryptionException("Unable to decrypt property: " + value + " resolved to: " + resolvedValue + ". Decryption of Properties failed, make sure encryption/decryption " +"passwords match", e);}}).orElse(value);
}
三、Jasypt配置项
Jasypt支持多种配置参数以进行密码、Digest认证、文本和对象的加密。以下是Jasypt支持的一些常见配置参数:
配置参数 | 描述 | 示例 |
---|---|---|
jasypt.encryptor.password | 加密器的密码,用于解密属性 | jasypt.encryptor.password=mySecretPassword |
jasypt.encryptor.algorithm | 加密算法的名称 | jasypt.encryptor.algorithm=PBEWithMD5AndDES |
jasypt.encryptor.keyObtentionIterations | 获取密钥时使用的迭代次数 | jasypt.encryptor.keyObtentionIterations=1000 |
jasypt.encryptor.poolSize | 加密池的大小(如果使用了池化加密器) | jasypt.encryptor.poolSize=1 |
jasypt.encryptor.providerName | 加密提供者的名称(如JCE提供者) | jasypt.encryptor.providerName=SunJCE |
jasypt.encryptor.saltGeneratorClassName | 盐生成器的类名 | jasypt.encryptor.saltGeneratorClassName=org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.ivGeneratorClassName | 初始化向量生成器的类名 | jasypt.encryptor.ivGeneratorClassName=org.jasypt.iv.NoIvGenerator |
jasypt.encryptor.stringOutputType | 加密字符串的输出类型(如base64) | jasypt.encryptor.stringOutputType=base64 |
jasypt.encryptor.property.prefix | 加密属性前缀,用于识别加密属性 | jasypt.encryptor.property.prefix=ENC( |
jasypt.encryptor.property.suffix | 加密属性后缀,用于识别加密属性 | jasypt.encryptor.property.suffix=) |
jasypt.encryptor.proxyPropertySources | 是否通过代理截取属性值以进行解密 | jasypt.encryptor.proxyPropertySources=true |
注意:
- 这些参数主要用于配置Jasypt加密器(
StringEncryptor
)的行为。 - 在实际使用中,特别是生产环境中,
jasypt.encryptor.password
等敏感信息不应该硬编码在配置文件中,而是通过环境变量、命令行参数或外部配置文件等方式安全地传递。 - Jasypt支持多种加密算法,如PBEWithMD5AndDES、PBEWithHMACSHA512ANDAES_256等,具体选择哪种算法取决于安全需求和环境配置。
- 上述表格中的示例配置参数值仅为演示用途,实际使用时需要根据项目需求和安全策略进行配置。
四、支持的加密算法
Jasypt支持多种加密算法以保护敏感数据。以下是Jasypt支持的一些常见加密算法:
加密算法名称 | 描述 |
---|---|
PBEWithMD5AndDES | 基于密码的加密(PBE),使用MD5作为散列函数和DES作为加密算法。这是一种较旧的加密算法,但在某些旧系统中可能仍在使用 |
PBEWithMD5AndTripleDES | 与PBEWithMD5AndDES类似,但使用TripleDES作为加密算法,提供了更强的安全性。 |
PBEWithHMACSHA512ANDAES_256 | 使用HMAC-SHA-512散列函数和AES-256加密算法的组合,提供了非常高的安全性。这是Jasypt较新版本中推荐的加密算法之一(默认值) |
AES | 高级加密标准(AES),是一种广泛使用的对称加密算法。Jasypt支持不同长度的AES密钥,如AES-128、AES-192和AES-256 |
RSA | Rivest-Shamir-Adleman(RSA)算法,是一种非对称加密算法。它使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据 |
参考资料
- https://github.com/ulisesbocchio/jasypt-spring-boot
相关文章:

【SpringBoot3】使用Jasypt加密数据库用户名、密码等敏感信息
一、使用步骤介绍 使用Jasypt(Java Simplified Encryption)进行数据加密和解密主要涉及几个步骤,包括引入依赖、配置加密密码、加密敏感信息、将加密信息存储到配置文件中,以及应用程序启动时自动解密。以下是详细的使用说明&…...

如何确定MySQL中哪些列适合做索引
1、查询频率 频繁出现在WHERE子句、JOIN条件、ORDER BY子句或GROUP BY子句中的列是创建索引的候选列。 2、数据唯一性 具有唯一性约束的列(如主键、唯一索引)是创建索引的理想选择,因为它们可以确保查询的快速返回。 如果列中的值大部分都…...

C# winform中权限页面的设计和开发
在C# WinForm应用中设计和开发权限页面,主要涉及到用户界面的创建、数据模型的构建以及业务逻辑的实现。以下是一个基本的步骤,可用来参考构建一个权限管理页面: 第一步:设计用户界面 创建一个新的WinForm:在Visual S…...

本地Windows电脑 连接 Windows 服务器
Windows电脑 连接 Windows 服务器 方式1:直接搜索 在电脑的搜索栏,输入“远程桌面连接” 可以选择点击 “打开” 或者直接按 回车键 “Enter”,打开 远程桌面连接 方式2:运行框打开服务器连接 同时按:Windows徽标键…...

【分布式计算框架 MapReduce】MapReduce 初级编程
目录 一、MapReduce 示例程序的导入并运行测试 二、准备 4 个小文件(文件大小分别为 1.7M,5.1M,3.4M,6.8M) 1. 第一种情况,默认分片:不修改程序代码,直接使用 WordCount 源程序 2…...

VideoPrism——探索视频分析领域模型的算法与应用
概述 论文地址:https://arxiv.org/pdf/2402.13217.pdf 视频是我们观察世界的生动窗口,记录了从日常瞬间到科学探索的各种体验。在这个数字时代,视频基础模型(ViFM)有可能分析如此海量的信息并提取新的见解。迄今为止,…...

Spring Boot项目的两种发布方式
一、通过jar包发布 1、在pom中添加一个SpringBoot的构建的插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><!--自动检测项目中的 main 函数--><artifactId>spring-boot-maven-plugin</artifactId>…...

Java中的服务注册与发现原理与实现
Java中的服务注册与发现原理与实现 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的服务注册与发现的原理及其实现方式。在现代分布式…...

【Python】成功解决TypeError: ‘float‘ object cannot be interpreted as an integer
【Python】成功解决TypeError: ‘float’ object cannot be interpreted as an integer 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主…...

Java面试八股文
一、Redis 1. 使用场景 (1)Redis的数据持久化策略有哪些 RDB:全称Redis Database Backup file(Redis数据备份文件),也被叫作Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故…...

周周星分享7.3—基于气象大数据的自动站实况联合预测
赛题 2024中国高校计算机大赛 — 大数据挑战赛 经验分享 大家好,我是扫地僧团队的队长,以前参加这样打榜的比赛比较少,了解的打榜技巧不是太多,所以想从科研的角度给大家一点分享。 这次比赛主要从以下五个步骤进行:…...

【密码学】面向小白的古典密码基础入门笔记
目录 Mindmap 前言 破译方法 三类古典密码 替换密码 分类 单表替换密码 凯撒密码 简单替换密码 仿射密码 普莱费尔密码 培根密码 猪圈密码 摩斯密码 多表替换密码 维吉尼亚密码 移位密码 滚筒密码 栅栏密码 Mindmap 前言 1.所有古典密码都已不安全 2.密…...

【Qt】之【Bug】大量出现“未定义的标识符”问题
背景 构建时出现大量错误 原因 中文注释问题 解决 方法1. 报错代码附近的中文注释全部删掉。。。 方法2. 报错的文件添加 // Chinese word comment solution #pragma execution_character_set("utf-8")...

C++中的常成员函数
2024年6月29日,周日下午 例如,以下是一个常成员函数的示例: class MyClass { public:int getValue() const {return value;} private:int value; };常成员函数是C中一种特殊的成员函数,它具有以下特点: 不可修改对象…...

小试牛刀-区块链代币锁仓(Web页面)
Welcome to Code Blocks blog 本篇文章主要介绍了 [区跨链代币锁仓(Web页面)] ❤博主广交技术好友,喜欢我的文章的可以关注一下❤ 目录 1.编写目的 2.开发环境 3.实现功能 4.代码实现 4.1 必要文件 4.1.1 ABI Json文件(LockerContractABI.json) 4.2 代码详解…...

Geoserver源码解读五 Catalog
系列文章目录 Geoserver源码解读一 环境搭建 Geoserver源码解读二 主入口 Geoserver源码解读三 GeoServerBasePage Geoserver源码解读四 REST服务 Geoserver源码解读五 Catalog 目录 系列文章目录 前言 一、定义 二、前置知识点 1.Spring 的 Bean 生命周期 ApplicationCon…...

安全与加密常识(5)自签名证书
文章目录 什么是自签名证书?自签名证书有什么优势?自签名证书有什么缺陷?企业可以使用自签名证书吗?如何创建自签名证书?前面我们介绍了什么是证书签名请求:证书签名请求(Certificate Signing Request,CSR)是一种数据文件,通常由申请者生成,并用于向证书颁发机构(C…...

Java官网网址及其重要资源
Java是一种广泛应用于开发各种应用程序的编程语言,它具有跨平台、面向对象和高性能等优势。若你想学习Java或深入了解它的最新动态,Java官网是你的首要目的地。在本文中,我们将向你介绍Java官网的网址以及一些重要资源。 Java官网网址&#x…...

Linux--start-stop-daemon
参考:start-stop-daemon(8) - Linux manual page 1、名称 start-stop-daemon:启动和停止系统守护程序。 2、简介 start-stop-daemon [option...] command 3、描述 start-stop-daemon用于控制系统级进程的创建和终止。使用其中一个匹配选项࿰…...

优化Java中XML和JSON序列化
优化Java中XML和JSON序列化 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java应用程序中,对于XML和JSON的序列化操作是非常常见的需求。本文将…...

像学Excel 一样学 Pandas系列-创建数据分析维度
嗨,小伙伴们。又到喜闻乐见的Python 数据分析王牌库 Pandas 的学习时间。按照数据分析处理过程,这次轮到了新增维度的部分了。 老样子,我们先来回忆一下,一个完整数据分析的过程,包含哪些部分内容。 其中,…...

Rust 基础教程
Rust 编程语言教程 Rust是一门注重安全、并发和性能的系统编程语言。本文将从Rust的基本语法、常用功能到高级特性,详细介绍Rust的使用方法。 目录 简介环境配置基础语法 变量和常量数据类型函数控制流 所有权和借用 所有权借用 结构体和枚举 结构体枚举 模块和包…...

Study--Oracle-06-Oracler网络管理
一、ORACLE的监听管理 1、ORACLE网络监听配置文件 cd /u01/app/oracle/product/12.2.0/db_1/network/admin 2、在Oracle数据库中,监听器(Listener)是一个独立的进程,它监听数据库服务器上的特定端口上的网络连接请求,…...

uniapp零基础入门Vue3组合式API语法版本开发咸虾米壁纸项目实战
嗨,大家好,我是爱搞知识的咸虾米。 今天给大家带来的是零基础入门uniapp,课程采用的是最新的Vue3组合式API版本,22年发布的uniappVue2版本获得了官方推荐,有很多同学等着我这个vue3版本的那,如果没有学过vu…...

数字信号处理教程(2)——时域离散信号与时域离散系统
上回书说到数字信号处理中基本的一个通用模型框架图。今天咱们继续,可以说今天要讲的东西必须是学习数字信号处理必备的观念——模拟与数字,连续和离散。 时域离散序列 由于数字信号基本都来自模拟信号,所以先来谈谈模拟信号。模拟信号就是…...

imx6ull/linux应用编程学习(8)PWM应用编程(基于正点)
1.应用层如何操控PWM: 与 LED 设备一样, PWM 同样也是通过 sysfs 方式进行操控,进入到/sys/class/pwm 目录下 这里列举出了 8 个以 pwmchipX(X 表示数字 0~7)命名的文件夹,这八个文件夹其实就对应了…...

等保2.0 实施方案
一、引言 随着信息技术的广泛应用,网络安全问题日益突出,为确保信息系统安全、稳定、可靠运行,保障国家安全、公共利益和个人信息安全,根据《网络安全法》及《信息安全技术 网络安全等级保护基本要求》(等保2.0&#x…...

7/3 第六周 数据库的高级查询
...

ubuntu20.04安装kazam桌面屏幕录制工具
在Ubuntu 20.04上安装Kazam可以通过以下步骤进行: 1.打开终端:可以通过按下Ctrl Alt T组合键来打开终端。 2.添加PPA源:Kazam不再在官方Ubuntu仓库中,但可以通过PPA源进行安装。在终端中输入以下命令来添加PPA: su…...

Python应对反爬虫的策略
Python应对反爬虫的策略 概述User-Agent 伪造应对302重定向IP限制与代理使用Cookies和Session管理动态内容加载数据加密与混淆请求频率限制爬虫检测算法法律与道德考量结语 概述 在数字化时代,网络数据采集已成为获取信息的重要手段之一。然而,随着技术…...