Spring Boot配置文件数据也可以轻松加密?

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在实践中项目的某些配置信息是需要进行加密处理的以减少敏感信息泄露的风险。比如在使用Druid时就可以基于它提供的公私钥加密方式对数据库的密码进行加密。

但更多时候比如Redis密码、MQ密码等敏感信息也需要进行加密此时就没那么方便了。本篇文章给大家介绍一款Java类库Jasypt同时基于Spring Boot项目来演示一下如何对配置文件信息进行加密。

一个简单的SpringBoot项目

我们先来创建一个简单的Spring Boot项目构建一个加密数据运用的场景。

无论通过Idea或官网等方式先创建一个Spring Boot项目核心依赖为

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--  为了方便通常会引入Lombok依赖  -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency> 

创建一个配置文件类ConfigProperties

@Data
@Component
public class ConfigProperties {
​@Value("${conf.url}")private String url;
​@Value("${conf.password}")private String password;
​
} 

配置文件中的配置属性注入到该类以供后续使用。

创建一个Controller类用来测试验证是否能够正常运行

@RestController
@RequestMapping("/")
public class ConfigController {
​@Resourceprivate ConfigProperties configProperties;
​@RequestMappingpublic void print(){System.out.println(configProperties.getUrl());System.out.println(configProperties.getPassword());}
} 

对应ConfigProperties类application.properties中配置如下

conf.url=127.0.0.1
conf.password=admin123 

此时启动项目访问Controller能够正常打印出配置信息说明程序可以正常运行。

但配置文件中直接明文展示了password项如果别人看到该配置文件就可能导致密码的泄露。

基于Jasypt的加密

针对上述情况通常我们会对敏感信息进行加密避免明文密码信息暴露提升安全等级。

加密的基本思路是配置文件中存储加密内容在解析配置文件注入时进行解密。

但如果拿到项目源码知道加密算法和秘钥肯定是可以解密的。这里的加密只是多一层安全防护但并不是万能的。

下面看看如何基于Jasypt来进行加密处理。

集成步骤

下面基于上述Spring Boot项目进行改造升级。

环境准备

不同版本的Jasypt使用方法有所不同这里基于3.0.4版本、JDK8、Spring Boot 2.5.5来进行演示。

在使用之前首先检查一下JDK8的JRE中是否安装了不限长度的JCE版本否则在执行加密操作时会抛出解密失败的异常。

进入$JAVA_HOME/jre/lib/security目录查看是否包含local_policy.jar和US_export_policy.jar两个jar包。如果不包含则通过Oracle官网进行下载下载地址www.oracle.com/java/techno…

下载文件为jce_policy-8.zip

文件内包含三个文件

README.txt
local_policy.jar
US_export_policy.jar 

查看$JAVA_HOME/jre/lib/security目录下是否有这两个jar包文件如果没有则复制进去如果有可考虑覆盖。

引入依赖

在Spring Boot中集成Jasypt比较简单直接引入如下依赖即可

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

此时Jasypt组件自动配置便已经生效只需要对需要加密的数据进行处理了。

为了方便对密码进行加密还可以在pom.xml中的build元素中引入对应的plugin这个后面会用到

<plugin><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-maven-plugin</artifactId><version>3.0.4</version>
</plugin> 

至此所有的准备工作已经完成。

内容加密

内容加密有多种方式这里挑选两种方式进行介绍。

方式一单元测试类生成密文;

构建如下单元测试类使用默认实例化的StringEncryptor对密码进行加密

@SpringBootTest
class SpringBootJasyptApplicationTests {
​@Autowiredprivate StringEncryptor stringEncryptor;
​@Testvoid contextLoads() {String qwerty1234 = stringEncryptor.encrypt("admin123");System.out.println(qwerty1234);}
} 

其中”admin123“便是要加密的内容。执行上述程序便可打印加密后的内容。这种形式加密的内容全部采用默认值。

方式二通过Maven插件生成密文

在上面已经引入了Jasypt的Maven插件可通过对应的命令进行生成密码。

第一步在配置文件中添加加密的密码

jasypt.encryptor.password=afx11 

然后对配置文件中需要加密的数据进行改造在数据前添加”DEC(“在数据尾部加上")"修改完如下

conf.password=DEC(admin123) 

这里添加的DEC()是告诉插件此部分内容需要进行加密处理。注意这里关键字是DEC。

第二步执行Maven命令对上述数据进行加密处理

在命令执行以下命令

mvn jasypt:encrypt -Djasypt.encryptor.password=afx11 

此时再看配置文件中的conf.password数据已经变为

jasypt.encryptor.password=afx11
conf.url=127.0.0.1
conf.password=ENC(209eBdF3+jsV2f8kDjs4NOCzgBxnVgETlR5q2KfhYo5DW2jqvLknv0TndEkXOXm0) 

注意原来的DEC变成了ENC原来的明文密码变成了加密的密文。

此时如果想查看明文执行以下命令即可

mvn jasypt:decrypt -Djasypt.encryptor.password=afx11 

该命令不会修改配置文件中的密文为明文只会在控制台进行明文结果的输出。

jasypt.encryptor.password=afx11
conf.url=127.0.0.1
conf.password=DEC(admin123) 

经过上述操作所有改造步骤已经完成只需启动系统进行验证即可。

密码的传递方式

完成上述步骤直接启动系统访问对应的请求会发现已经能够成功打印出密码原文了。

上述实例中我们将加密的密码放在了application.properties文件中这样并不安全如果查看代码就知道如何解密了。通常还可以采用另外一种形式来传递参数在启动命令中传输密码。

比如

 java -jar jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password 

这样密码便不用存储在代码当中了一定程度上增加了安全性。当然也可以通过环境变量来进行传递这样即便开发人员也无法获得生产的密码。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring