文章目录
- 前言
- 一、概述
-
- 1.1 Jasypt库简介
- 1.2 Jasypt库的主要特点
- 二、开发环境
- 三、Jasypt集成到SpringBoot3
-
- 3.1 引入依赖
- 3.2 配置Jasypt
- 3.3 加密配置文件信息
-
- 3.3.1 方案一(不推荐)
-
- a.编写测试类生成加密后的配置文件信息
- b.运行
- c.修改原本的配置文件信息
- 3.3.2 方案二(推荐)
-
- a.添加Maven 插件
- b.修改配置文件
- c.运行如下maven命令:
- d.打包项目
- e.运行jar包
- f.测试
- 四、总结
前言
对于一些单体项目而言,在没有使用SpringCloud的情况下,配置文件中包含着大量的敏感信息,比如数据库的账号密码、API服务的秘钥等等,如果这些信息泄露出去将会对企业的资产产生重大威胁。因此,对配置文件中的敏感信息加密是一件极其必要的事。
一、概述
1.1 Jasypt库简介
Jasypt是一个易于使用的Java库,专门用于加密和解密配置文件中的敏感信息,如数据库凭据、API密钥等。它提供了一种安全的方式来存储和管理配置文件中的敏感数据,而不是以明文形式暴露。
Jasypt支持多种加密算法,如DES、AES、Blowfish等,以及基于口令的加密算法(PBE)。它还提供了灵活的配置选项,允许开发人员自定义加密算法、密码、初始化向量等。
1.2 Jasypt库的主要特点
Jasypt的主要特点包括:
- 简单易用:Jasypt提供了简单的API和注解,使得在应用程序中集成和使用Jasypt变得非常容易。
- 安全性高:Jasypt使用强加密算法来保护配置文件中的敏感信息,防止数据泄露和未授权访问。
- 兼容性好:Jasypt可以与各种Java应用程序和框架集成,包括Spring、Spring Boot、Hibernate等。
二、开发环境
- JDK版本:JDK 17
- Spring Boot版本:Spring Boot 3.2.2
- MySQL版本:8.0.37
- 构建工具:Maven
三、Jasypt集成到SpringBoot3
3.1 引入依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
3.2 配置Jasypt
jasypt:
encryptor:
algorithm: PBEWITHHMACSHA512ANDAES_256
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
password: secret_key # 这里的秘钥一般不会写在配置文件中,为了方便理解暂时放在这里
property:
prefix: ENC(
suffix: )
algorithm
: jasypt的加密算法,这里指定加密算法为一种结合了SHA-512 HMAC和AES-256加密算法的强加密算法。iv-generator-classname
: 指定用于生成初始化向量的类。RandomIvGenerator
是一个随机生成初始化向量的生成器,它适用于需要初始化向量的加密算法,如AES。每次加密时,它都会生成一个新的随机初始化向量,增加了解密的难度。password
: 指定用于加密和解密的密码。property.prefix
: 指定加密值的前缀。当Jasypt处理配置文件时,它会查找以这个前缀开始的属性值,并尝试使用配置的加密算法进行解密。默认值是ENC(
,也可以进行修改。property.suffix
: 指定加密值的后缀。与prefix
类似,Jasypt会查找以这个后缀结束的属性值进行解密。默认值是)
。
更多配置属性:
Key 描述 Required Default Value jasypt.encryptor.password 用于加密和解密的密码。这个密码非常重要,因为它用于生成加密密钥和解密密文。 True - jasypt.encryptor.algorithm 指定加密算法。默认值是 PBEWITHHMACSHA512ANDAES_256
,这是一种结合了SHA-512 HMAC和AES-256加密算法的强加密算法。False PBEWITHHMACSHA512ANDAES_256 jasypt.encryptor.key-obtention-iterations 指定获取加密密钥的迭代次数。这个值越大,获取密钥的过程越慢,但越安全。 False 1000 jasypt.encryptor.pool-size 指定加密器池的大小。如果设置为大于1的值,Jasypt将使用一个线程池来并行处理加密和解密请求。 False 1 jasypt.encryptor.provider-name 指定加密提供者的名称。默认值是 SunJCE
,这是Java加密扩展(JCE)的Sun Microsystems实现。False SunJCE jasypt.encryptor.provider-class-name 指定加密提供者的类名。如果指定了这个属性,Jasypt将使用这个类作为加密提供者,而不是默认的 SunJCE
。False null jasypt.encryptor.salt-generator-classname 指定用于生成盐值的类。默认值是 org.jasypt.salt.RandomSaltGenerator
,它生成一个随机的盐值。False org.jasypt.salt.RandomSaltGenerator jasypt.encryptor.iv-generator-classname 指定用于生成初始化向量的类。默认值是 org.jasypt.iv.RandomIvGenerator
,它生成一个随机的初始化向量。False org.jasypt.iv.RandomIvGenerator jasypt.encryptor.string-output-type 指定加密后的字符串输出类型。默认值是 base64
,这意味着加密后的值将转换为Base64编码的字符串。False base64 jasypt.encryptor.proxy-property-sources 指定是否代理属性源。如果设置为 true
,Jasypt将代理所有的属性源,以便在获取属性值时进行解密。False false jasypt.encryptor.skip-property-sources 指定要跳过的属性源列表。如果某些属性源不包含敏感信息,或者您不想对它们进行加密,可以将它们添加到这个列表中。 False empty list
3.3 加密配置文件信息
先看一下我们现有的配置文件信息,我们要加密的信息是数据库url
、username
和password
这三个属性:
spring:
application:
name: server
datasource:
url: jdbc:mysql://localhost:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
3.3.1 方案一(不推荐)
a.编写测试类生成加密后的配置文件信息
@Autowired
private StringEncryptor encryptor;
@Test
public void encrypt() {
String url = encryptor.encrypt("jdbc:mysql://localhost:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai");
String name = encryptor.encrypt("root");
String password = encryptor.encrypt("123456");
System.out.println("database url: " + url);
System.out.println("database username: " + name);
System.out.println("database password: " + password);
}
b.运行
c.修改原本的配置文件信息
spring:
application:
name: server
datasource:
url: ENC(z3xy2E55GmC126NvY1Mb3uprgXGjyaOWS4J3y72r1FFeTSno3m5ljGV22TqyYr85bptOY7drFHzrxaUfqbmetNWCsFY7i4vu5ig7ow0gk6ObLK/dVI4MRePxM5CGVzQ3XUWSJrUbLU1o+13g2erP2yV4uqeH6oVZH/FrBDQ6YfeeHmpl73emqMoGFFBnWdMvF1tzJxYMLcwthGBoaRopyA==)
driver-class-name: com.mysql.cj.jdbc.Driver
username: ENC(9oaZel6CzsIM/ws23QcX2ijvZvn8A5HBYJM4PDUvwFSqmCO26MJKKshhPE5Hi+BU)
password: ENC(b5FqkU7mOSb0esB1qLXveDBalnUz7OtBxp0By/Q1sd5yk0cgOuJqIV2zSmqHA5mz)
再次运行和测试:
测试的接口是我随便写的一个接口,实现的功能就是根据用户名查询数据库中的一个用户:
@Operation(summary = "你好") @GetMapping("/hello") public Result<UserInfo> test2(String username) { List<UserInfo> userList = userInfoService.lambdaQuery().like(UserInfo::getUserName, username).list(); return Result.success(userList.get(0)); }
可以看到成功查询到了用户信息,说明数据库连接成功。
但这种方案有个问题,秘钥写在配置文件当中,一旦代码泄露,那别人就可以使用秘钥解密我们的密文,因此可以采取方案二。
3.3.2 方案二(推荐)
官方文档:https://github.com/ulisesbocchio/jasypt-spring-boot#maven-plugin
a.添加Maven 插件
<build>
<plugins>
<plugin>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-maven-plugin</artifactId>
<version>3.0.5</version>
<configuration>
<path>file:src/main/resources/application.yaml</path>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
使用此插件时,提供加密密码的最简单方法是通过系统属性,即 -Djasypt.encryptor.password=“密码”。
默认情况下,插件会在
./src/main/resources
下的Spring Boot配置文件application. properties
中加密配置,但我们用的一般都是yaml文件,因此修改一下即可。记得一定要加
spring-boot-maven-plugin
依赖(ps:本人之前cv了依赖代码忘记cv构建代码导致一直报错🤡)。
b.修改配置文件
spring:
application:
name: server
datasource:
url: ENC(jdbc:mysql://localhost:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai)
driver-class-name: com.mysql.cj.jdbc.Driver
username: ENC(root)
password: ENC(123456)
jasypt:
encryptor:
algorithm: PBEWITHHMACSHA512ANDAES_256
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
property:
prefix: ENC(
suffix: )
c.运行如下maven命令:
如果采用的是多模块开发,记得选择模块
mvn jasypt:encrypt -Djasypt.encryptor.password=secret_key
d.打包项目
e.运行jar包
转到target目录用命令行运行下面的命令
java -jar xxx.jar --jasypt.encryptor.password=secret_key
f.测试
题外话
黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。