文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何轻松给Spring Boot配置文件加个密?

2024-12-02 20:04

关注

本文转载自微信公众号「程序新视界」,作者二师兄。转载本文请联系程序新视界公众号。

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

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

一个简单的SpringBoot项目

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

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

  1.  
  2.  org.springframework.boot 
  3.  spring-boot-starter-web 
  4.  
  5. --    为了方便,通常会引入Lombok依赖    --> 
  6.  
  7.  org.projectlombok 
  8.  lombok 
  9.  

 

创建一个配置文件类ConfigProperties:

  1. @Data 
  2. @Component 
  3. public class ConfigProperties { 
  4.  
  5.  @Value("${conf.url}"
  6.  private String url; 
  7.  
  8.  @Value("${conf.password}"
  9.  private String password
  10.  

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

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

  1. @RestController 
  2. @RequestMapping("/"
  3. public class ConfigController { 
  4.  
  5.  @Resource 
  6.  private ConfigProperties configProperties; 
  7.  
  8.  @RequestMapping 
  9.  public void print(){ 
  10.   System.out.println(configProperties.getUrl()); 
  11.   System.out.println(configProperties.getPassword()); 
  12.  } 

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

  1. conf.url=127.0.0.1 
  2. 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官网进行下载,下载地址:https://www.oracle.com/java/technologies/javase-jce8-downloads.html。

下载文件为:jce_policy-8.zip

文件内包含三个文件:

  1. README.txt 
  2. local_policy.jar 
  3. US_export_policy.jar 

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

引入依赖

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

  1.  
  2.     com.github.ulisesbocchio 
  3.     jasypt-spring-boot-starter 
  4.     3.0.4 
  5.  

 

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

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

  1.  
  2.  com.github.ulisesbocchio 
  3.  jasypt-maven-plugin 
  4.  3.0.4 
  5.  

 

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

内容加密

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

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

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

  1. @SpringBootTest 
  2. class SpringBootJasyptApplicationTests { 
  3.  
  4.  @Autowired 
  5.  private StringEncryptor stringEncryptor; 
  6.  
  7.  @Test 
  8.  void contextLoads() { 
  9.   String qwerty1234 = stringEncryptor.encrypt("admin123"); 
  10.   System.out.println(qwerty1234); 
  11.  } 

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

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

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

在配置文件中添加加密的密码:

  1. jasypt.encryptor.password=afx11 

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

  1. conf.password=DEC(admin123) 

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

执行Maven命令,对上述数据进行加密处理

在命令执行以下命令:

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

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

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

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

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

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

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

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

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

密码的传递方式

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

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

比如:

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

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

小结

关于Jasypt的使用及与Spring Boot的集成就讲这么多,更多内容也可参考官方文档说明。如果你的项目中还存在很多明文存储的密码,真的有必要考虑使用类似的框架进行加密处理了。

示例源码地址:https://github.com/secbr/springboot-all/tree/master/springboot-jasypt

官方源码地址:https://github.com/ulisesbocchio/jasypt-spring-boot

 

来源: 程序新视界内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯