Spring Boot学习笔记(五)——Jasypt加解密篇

mac2025-03-24  14

章节索引

前提工程中的敏感信息解决问题的逻辑加密敏感信息配置依赖加密 修改配置文件@EnableEncryptableProperties注解启动工程后记


前提

这篇博文是这套Spring Boot学习笔记的第五篇——Jasypt加解密篇,主要内容包含通过Jasypt工具对工程中的敏感信息进行加密,同时通过运行时解密来确保工程正确执行。如果需要了解有关Spring Boot的综述信息或博文的索引信息,请移步: 《综述篇》


工程中的敏感信息

与数据库打交道的的工程坑定得配置数据源,比如:

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/demo?characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8 username: MY_DB_USERNAME password: MY_DB_PASSWORD

尤其是数据库的账号密码,我们不想把它们明文写在配置文件里,又想让工程能正确跑起来,该怎么做呢?

由于数据库的敏感性,所以不可能让每个人都知道su root的密码。且数据库中权限、视图这些机制也是为了保证安全性,所以要保证让尽可能少的人知道root的密码。


解决问题的逻辑

我们可以利用非对称加密算法的思想:

在工程的配置文件中写入加密好的密文。启动工程时让知道密钥的人,以启动参数的形式将密钥输入进去。工程根据密钥,将密文自动解密为明文,用来完成配置。无关的人是无法知道敏感信息的明文是什么的。

加密敏感信息

我们使用Jasypt工具来实现这个需要。

配置依赖

在pom.xml中添加以下依赖:

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

加密

首先我们需要设置一个密钥,如DemoOfImple我们还需要知道要加密的敏感信息的明文,如MY_DB_USERNAME写一个main方法如下: public static void main(String[] args) { BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); String password = "DemoOfImple"; String plainText = "MY_DB_PASSWORD"; textEncryptor.setPassword(password); String cipherText = textEncryptor.encrypt(plainText); System.out.println(cipherText); }

注释:password就是上面提到的非对称加密的密钥。

执行main方法得到输出:ifp+YHsuUjXs+s96gqKZNtkW3u0rVzDF,这就是加密后的密文。由于Jasypt使用了PBEWithMD5AndDES算法,所以相同的密钥和明文,每次加密的结果可能不同。

修改配置文件

上面得到的密文并不能直接写回到配置文件中,而是需要遵照一定的格式。即在首尾加上ENC(和),如: spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: ENC(EZdC2ZxNQtgcr5nPLV8SerW6L6SfiOAtp9cKYHNYJTdTdyD7ag77wLWR4tsW/lOZNmule/KhmgwFp1McqVHSsTmDBw2sMerI/fNHECB5eMhQpHM63R/W7J9D2auTnKp8VelQNAybFyA=) username: ENC(fQe64qufMkZe0BLqCRRO2SH/E9g3OZTv) password: ENC(eFSGzZNnyHN01fJcjaI5J37la/LDmH3Z) 还需要在配置文件中指定Jasypt使用的算法: jasypt: encryptor: algorithm: PBEWithMD5AndDES

@EnableEncryptableProperties注解

最后,给启动类DemoApplication加上@EnableEncryptableProperties注解,启用加密属性。

@SpringBootApplication @EnableEncryptableProperties public class DemoApplication extends SpringBootServletInitializer { ... }

启动工程

打包得到JAR包后,使用以下的指令启动工程:

java -jar -Djasypt.encryptor.password=DemoOfImple demo.jar

这个-Djasypt.encryptor.password=DemoOfImple就输入了启动时的密钥,用于解密敏感配置信息。


后记

通过使用Jasypt解决了敏感信息明文暴露在配置文件中的问题。尤其是作为公开仓库上传到Github上的时候。现在就可以避免不相关的人看到我们的服务器URL和数据库账号密码这些信息了。

最新回复(0)