Springboot之Jasypt配置文件加密/解密

article/2025/10/9 0:48:37

Jasypt配置文件加密/机密

  • 一、Jasypt介绍
  • 二、Springboot整合Jasypt
    • 2.1 环境配置
    • 2.2 添加依赖
    • 2.3 添加Jasypt配置
    • 2.4 编写加/解密工具类
    • 2.5 修改配置文件
    • 2.5 如何进一步防止密码泄露
      • 2.5.1 自定义加密器
      • 2.5.3 加密盐值通过环境变量指定

文章系列

【一、Springboot之Jasypt配置文件加密/解密】
【二、Springboot之Jasypt配置文件加密/解密【源码分析】】

一、Jasypt介绍

前言

在大多数项目中,配置文件中的 mysql 数据库密码、redis 密码等其他敏感性密码都是以明文形式存在,这种配置本身没有任何问题,但是,在某些情况下,可能会对公司造成不可挽救的损失,比如:某一天,小明因为加班过度,头脑发昏,不小心把公司项目上传到自己的 GitHub 仓库里面了,导致的后果就是,公司数据库用户名密码泄露,被某些大佬加以利用…

所以,基于上面这种情况,加入配置文件中数据库用户密码等其他敏感信息都是经过加密处理过的呢???是不是可以大概率避免这种情况。Jasypt 因此应运而生。

什么是Jasypt?

Jasypt 是一个 java 库,可以使开发者不需要太多操作来给 Java 项目添加基本加密功能,而且不需要知道加密原理。Jasypt 为开发人员提供了一种简单易用加密功能,包括:密码认证、字符串加密等。

Jasypt 有哪些特点?

  • 高安全性、基于标准的加密技术,适用于单向和双向加密。加密密码、文本、数字、二进制文件
  • 适合集成到基于 Spring 的应用程序中
  • 用于加密应用程序(即数据源)配置的集成功能

哪些信息要加密呢?
一般来说,项目配置文件里,所有涉及信息安全的配置项(或字段)都应该做处理,典型的比如:

  • 数据库密码,如mysql
  • 第三方缓存中间件的密码,如 redis、mongodb
  • 其他中间件,如消息中间件、zk、nacos等
  • 各种第三方服务的 Access_Key

二、Springboot整合Jasypt

2.1 环境配置

  • SpringBoot2.0以上
  • Jasypt 3.0.3
  • jdk8

2.2 添加依赖

创建一个 Springboot 项目,项目版本 2.0 以上,并添加 Jasypt 相关依赖。

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>

2.3 添加Jasypt配置

jasypt:encryptor:# 盐值password: 123# 指定加密方式algorithm: PBEWithMD5AndDESiv-generator-classname: org.jasypt.iv.NoIvGeneratorproperty:# 标识为加密属性的前缀prefix: ENC(# 标识为加密属性的后缀suffix: )

2.4 编写加/解密工具类

public class JasyptUtil {/*** PBE 算法*/public static final String PBE_ALGORITHMS_MD5_DES = "PBEWITHMD5ANDDES";public static final String PBE_ALGORITHMS_MD5_TRIPLEDES = "PBEWITHMD5ANDTRIPLEDES";public static final String PBE_ALGORITHMS_SHA1_DESEDE = "PBEWITHSHA1ANDDESEDE";public static final String PBE_ALGORITHMS_SHA1_RC2_40 = "PBEWITHSHA1ANDRC2_40";private JasyptUtil() {}/*** Jasypt 加密** @param encryptedStr 加密字符串* @param password     盐值* @return*/public static String encrypt(String encryptedStr, String password) {return encrypt(encryptedStr, PBE_ALGORITHMS_MD5_DES, password);}/*** Jasypt 加密** @param encryptedStr 加密字符串* @param algorithm    加密算法*                     PBE ALGORITHMS: [PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_40]* @param password     盐值* @return*/public static String encrypt(String encryptedStr, String algorithm, String password) {// StandardPBEStringEncryptor、StandardPBEBigDecimalEncryptor、StandardPBEBigIntegerEncryptor、StandardPBEByteEncryptorStandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();EnvironmentPBEConfig config = new EnvironmentPBEConfig();// 指定加密算法config.setAlgorithm(algorithm);// 加密盐值config.setPassword(password);//config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");encryptor.setConfig(config);// 加密return encryptor.encrypt(encryptedStr);}/*** Jasypt 解密** @param decryptStr 解密字符串* @param password   盐值* @return*/public static String decrypt(String decryptStr, String password) {return decrypt(decryptStr, PBE_ALGORITHMS_MD5_DES, password);}/*** Jasypt 解密** @param decryptStr 解密字符串* @param algorithm  指定解密算法:解密算法要与加密算法一一对应*                   PBE ALGORITHMS: [PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_40]* @param password   盐值* @return*/public static String decrypt(String decryptStr, String algorithm, String password) {// StandardPBEStringEncryptor、StandardPBEBigDecimalEncryptor、StandardPBEBigIntegerEncryptor、StandardPBEByteEncryptorStandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();EnvironmentPBEConfig config = new EnvironmentPBEConfig();// 指定解密算法:解密算法要与加密算法一一对应config.setAlgorithm(algorithm);// 加密秘钥config.setPassword(password);//config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");encryptor.setConfig(config);// 解密return encryptor.decrypt(decryptStr);}public static void main(String[] args) {String encryptedStr = "I am the string to be encrypted";String algorithm = PBE_ALGORITHMS_SHA1_RC2_40;String password = "salt";String str = JasyptUtil.encrypt(encryptedStr, algorithm, password);System.out.println("加密后的字符串:" + str);System.out.println("解密后的字符串:" + JasyptUtil.decrypt(str, algorithm, password));}
}

运行结果:
在这里插入图片描述

2.5 修改配置文件

在这里插入图片描述
如图,通过编写加/解密工具类得到对应的加密结果,然后将配置文件的原始明文密码替换成上一步对应的结果,并通过 ENC(加密结果) 包裹起来。

2.5 如何进一步防止密码泄露

在上面的内容中,使用的是默认的加密规则,这一点会让当自定义加密盐值(jasypt.encryptor.password) 泄漏时可能变得不安全。那么如何进一步防止密码泄露安全呢?

2.5.1 自定义加密器

为了进一步防止密码泄露,我们可以自定义加密规则。

自定义加密规则非常简单,只需要提供自定义的加密器配置类,然后通过jasypt.encryptor.bean配置指定加密配置类即可。

/*** 自定义加密器*/
public class MyStringEncryptor implements StringEncryptor {/*** 加解密PBE 算法*/public static final String PBE_ALGORITHMS_MD5_DES = "PBEWITHMD5ANDDES";public static final String PBE_ALGORITHMS_MD5_TRIPLEDES = "PBEWITHMD5ANDTRIPLEDES";public static final String PBE_ALGORITHMS_SHA1_DESEDE = "PBEWITHSHA1ANDDESEDE";public static final String PBE_ALGORITHMS_SHA1_RC2_40 = "PBEWITHSHA1ANDRC2_40";/*** 加解密盐值*/private String password;/*** 加解密算法*/private String algorithm = PBE_ALGORITHMS_MD5_DES;public MyStringEncryptor(String password) {this.password = password;}public MyStringEncryptor(String password, String algorithm) {this.password = password;this.algorithm = algorithm;}@Overridepublic String encrypt(String message) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();// 加解密盐值encryptor.setConfig(getConfig(this.password));return encryptor.encrypt(message);}@Overridepublic String decrypt(String encryptedMessage) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();encryptor.setConfig(getConfig(this.password));return encryptor.decrypt(encryptedMessage);}public SimpleStringPBEConfig getConfig(String password) {SimpleStringPBEConfig config = new SimpleStringPBEConfig();// 加密盐值config.setPassword(password);// 加解密算法config.setAlgorithm(PBE_ALGORITHMS_MD5_DES);// 设置密钥获取迭代次数config.setKeyObtentionIterations(1000);// 线程池大小:默认1config.setPoolSize(1);// 盐值生成器classNameconfig.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");//  iv(initialization vector,初始化向量) 生成器classNameconfig.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");// 设置字符串输出类型config.setStringOutputType("base64");return config;}
}

将自定义加密器添加到 Spring IoC 容器中。

@Configuration
public class JasyptConfig {/*** 加解密盐值*/@Value("${jasypt.encryptor.password}")private String password;// @Bean("jasyptStringEncryptor")@Bean("myStringEncryptor")public StringEncryptor myStringEncryptor() {return new MyStringEncryptor(password);}
}

修改配置文件

jasypt:encryptor:# 指定加解密在spring ioc容器中bean的名称,默认 jasyptStringEncryptorbean: myStringEncryptor# 盐值password: 123

注意:Jasypt默认加解密器beanName为jasyptStringEncryptor,如果不想在配置文件中指定自定义加密器名称,需将自定义加密器beanName设置为jasyptStringEncryptor,否则将不生效。

2.5.3 加密盐值通过环境变量指定

  • 方式一:直接作为程序启动时的命令行参数
java -jar app.jar --jasypt.encryptor.password=salt
  • 方式二:直接作为程序启动时的应用环境变量
java -Djasypt.encryptor.password=salt -jar app.jar
  • 方式三:直接作为系统环境变量
# 1. 设置系统环境变量 JASYPT_ENCRYPTOR_PASSWORD = salt# 2. Spring Boot的项目配置文件指定系统环境变量:
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}

http://chatgpt.dhexx.cn/article/IIybjJBk.shtml

相关文章

java中byte与int的转换原理

前些天遇到一个问题&#xff0c;byte[0] "A3"&#xff08;十六进制表示&#xff09; 但是在debug时显示的是 -93 &#xff0c;而如果直接赋值给int的变量也是-93.当然大部分人都知道这是不能直接赋值的&#xff0c;需要以下面的这种方式将byte转换成int&#xff1a;…

Java byte 转化为 String

1、Java 中 byte 转化为 String&#xff0c;代码如下 package nice.com.mian;import java.io.UnsupportedEncodingException;public class StringMain {public static void main(String[] args) throws Exception {byte[] bb {97,99,105,51,55};String str new String(bb, &…

Java byte[] 转 String的简单转换

简单的将byte[] 还原成了 String 值 [TOC] 代码&#xff1a; public class Test0719 {public static void main(String[] args) {String text "test";byte[] textBytes text.getBytes();String content byteToString(textBytes);System.out.println(textBytes &q…

java:int强制类型转换成byte

注&#xff1a;非常感谢评论的最佳戏子大佬指出了我的不足&#xff0c;已经进行修改 int强制类型转换成byte 一、基础知识二、int->byte方法一方法二 一、基础知识 int 在java中是32位&#xff0c; byte是8位 原码&#xff1a;就是二进制码&#xff0c;最高位为符号位&…

C#初级编程

Unity学习笔记——C#初级编程 一、Awake 和 Start二、Update 和 FixedUpdate三、启用和禁用组件四、SetActive、Active Self、Active in Hierarchy五、位置和旋转六、transform.lookAt(Transform target)七、线性插值八、Destroy九、GetButton 和 GetKey十、GetAxis十一、GetCo…

零基础怎样自学编程?新手如何学习编程?编程学习入门指南

对于编程&#xff0c;很多新手的第一感觉可能就是&#xff1a; 高深&#xff0c;难学。 学好编程&#xff0c;有的时候&#xff0c;可以把一些需要我们重复劳动的工作&#xff0c;自动化批量处理&#xff0c;为我们节省很多时间和精力。 对于一些学得比较深入的朋友来说&…

新手学计算机编程怎么入门 从哪学起

近些年有一种职业发展很快、人才需求量大、工资高&#xff0c;那就是程序员。他们的基本工作就是电脑编程&#xff0c;开发者各种各样的软件、APP&#xff0c;被很多人膜拜。如果你想成为一名程序员&#xff0c;有必要了解一下这些基本的电脑编程入门教程。 1计算机编程怎么入门…

代码编程教学入门

前言 代码编程是我们在现代能获得的最宝贵的技能之一&#xff0c;学会写代码不仅让我们在职业前景上更得心应手&#xff0c;而且还能让我们的大脑保持活跃和创造性&#xff0c;甚至我们还有机会创造出一些 awesome 的东西出来。 如果我们才刚刚开始&#xff08;或准备开始&am…

20道经典C语言编程题(初级)

编者按&#xff1a;以下20道题目为自己练习所写的代码&#xff0c;均已提交检测通过&#xff0c;其中有些题也许有更优的解法&#xff0c;所以写的不好望读者包涵&#xff0c;由于个人练习&#xff0c;所以没有写注释&#xff0c;有什么问题的地方&#xff0c;可以留言一起交流…

沈师 PTA 数据库题目及部分解析 第四章

判断题 1.在数据库安全性控制中&#xff0c;所有授予出去的权力在必要时都可以用REVOKE语句收回。 T 2.用户可以“自主”地决定将数据的存取权限授予何人、决定是否也将“授权”的权限授予别人&#xff0c;因此称这样的存取控制是自主存取控制。 T 3.数据库的安全性是指保护数据…

编程题目+数据库题目总结(3)

目录 编程题1.字典中保存了一些股票代码&#xff08;键&#xff09;及价格&#xff08;值&#xff09;&#xff0c;用一行代码找出价格最高的股票&#xff0c;输出股票代码。(5分&#xff09;2.字典中保存了一些股票代码&#xff08;键&#xff09;及价格&#xff08;值&#x…

沈师 PTA 数据库题目及部分解析 第一章

判断题&#xff1a; 1.一个数据库只有一个模式和一个内模式。 T 2.数据模型是由数据结构、数据操作和完整性约束三部分组成的 T 3.由于数据库中的数据是不断更新的&#xff0c;因此关系模式是相对变化的。 F 解析&#xff1a;关系模式不会相对变化&#xff0c;变化的是实例 4.数…

【数据库题目复习】期末试卷 一、二

文章目录 试题一一、选择题二、填空题三、简答题四、设计题五、综合题 试题二一、选择题二、填空题三、简答题四、设计题五、综合题 试题一 一、选择题 1. 数据库系统的核心是&#xff08; B &#xff09; A&#xff0e;数据库 B&#xff0e;数据库管理系统 C&#xf…

【数据库题目复习】第7章 数据库设计

文章目录 一、选择题&#xff1a;二、填空三、应用 参考文章&#xff1a;https://blog.csdn.net/qq_46139801/article/details/117453449 知识点&#xff1a; &#xff08;1&#xff09;各子系统的E-R图之间的冲突主要有三类&#xff1a; 属性冲突、命名冲突和结构冲突。 &…

【力扣刷题总结】数据库题目按知识点分类总结

观前提示&#xff1a; 这个图先自行背诵至滚瓜烂熟。 文档中论述题目解题思路时没有特殊情况都按照上面的程序执行顺序为准&#xff0c;个别题也会以其他更自然的顺序讲解。 本文的知识点整理仅起提示作用&#xff0c;一些不常用功能、参数可能会遗漏&#xff0c;如需了解详细…

数据库题目之数据库设计

一、选择题 1、在数据库设计中&#xff0c;用E-R图来描述信息结构但不涉及信息在计算机中的表示&#xff0c;它是数据库设计的 阶段。 A&#xff0e;需求分析 B&#xff0e;概念设计 C&#xff0e;逻辑设计 D&#xff0e;物理设计 【答案&#xff1a;】B 2、在关系…

数据库常考大题

宝子们心心念念的数据库大题来啦~ 我已经整理好啦~你们根据目录找对应题目就好啦&#xff0c;嘿嘿~姐姐是不是还有点小贴心呢&#xff1f; &#x1f6f8; &#x1f30f; &#x1f318; • . ✯✯ ★ * &#x1f6f0; . • ★ • ▁▂▃▄▅▆▇▇▆▅▄▃▁▂▃. 目录…

33道数据库题目

33道数据库题目 准备三张表题目 准备三张表 emp–员工表 dept–部门表 salgrade–工资等级表 题目 取得每个部门最高薪水的人员名称 (方法1) select ename, sal, deptno from emp where sal in (select max(sal) from emp group by deptno);(方法2&#xff09; select e.…

50道数据库SQL练习题(深入理解各关键字的作用)

目录 表结构创建表练习题1、查询“001”课程比“002”课程成绩高的所有学生的学号2、查询所有同学的学号、姓名、选课数、总成绩3、查询平均成绩大于60分的同学的 学号和平均成绩4、查询姓“葛”的老师的个数5、查询没学过“五木”老师课的同学的学号、姓名6、查询学过“101”并…