Spring Boot 配置中的敏感信息如何保护?
在之前的系列教程中,我们已经介绍了非常多关于Spring Boot配置文件中的各种细节用法,比如:参数间的引用、随机数的应用、命令行参数的使用、多环境的配置管理等等。
这些配置相关的知识都是Spring Boot原生就提供的,而今天我们将介绍的功能并非Spring Boot原生就支持,但却非常有用:配置内容的加密。
为什么要加密?
可能很多初学者,对于配置信息的加密并不敏感,因为开始主要接触本地的开发,对于很多安全问题并没有太多的考虑。而现实中,我们的配置文件中,其实包含着大量与安全相关的敏感信息,比如:数据库的账号密码、一些服务的密钥等。这些信息一旦泄露,对于企业的重要数据资产,那是相当危险的。 所以,对于这些配置文件中存在的敏感信息进行加密,是每个成熟开发团队都一定会去的事。
如果您是DD的老读者,也许马上会想到Spring Cloud Config就提供配置的加密功能,之前在我的Spring Cloud系列教程和《Spring Cloud微服务实战》一书中都有详细的介绍,感兴趣的话可以点击《Spring Cloud构建微服务架构:分布式配置中心(加密解密)》一探究竟。
既然以前写过类似内容,那为什么还要写呢?因为并不是所有的开发场景都会搭建Spring Cloud的那套基础设施,同时也不一定会使用Spring Cloud Config作为配置中心。所以,本文主要说说,当我们只使用Spring Boot的时候,如何实现对配置中敏感信息的加密。
动手试试
下面我们将使用https://github.com/ulisesbocchio/jasypt-spring-boot
这个开源项目提供的实现和插件,来帮助我们轻松的完成配置信息的加密。
赶紧跟着我下面的步骤动手试试吧!
第一步:创建一个基础的Spring Boot项目(如果您还不会,可以参考这篇文章:快速入门
第二步:设计一个参数和单元测试,用来输出这个配置信息
准备加密的配置:
datasource.password=didispace.com
用来输出配置信息的单元测试:
@Slf4j
@SpringBootTest
public class PropertiesTest {
@Value("${datasource.password:}")
private String password;
@Test
public void test() {
log.info("datasource.password : {}", password);
}
}
执行这个单元测试,会输出:
2021-08-13 22:28:45.506 INFO 70405 --- [ main] com.didispace.chapter15.PropertiesTest : datasource.password : didispace.com
这里还没开始加密,下面我们开始引入加密的操作!
第三步:在pom.xml
中引入jasypt提供的Spring Boot Starter
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
在插件配置中加入:
<plugin>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-maven-plugin</artifactId>
<version>3.0.3</version>
</plugin>
第四步:在配置文件中加入加密需要使用的密码
jasypt.encryptor.password=didispace
同时,修改要加密的内容,用DEC()
将待加密内容包裹起来,比如:
datasource.password=DEC(didispace.com)
第五步:使用jasypt-maven-plugin
插件来给DEC()
包裹的内容实现批量加密。
在终端中执行下面的命令:
mvn jasypt:encrypt -Djasypt.encryptor.password=didispace
注意:这里
-Djasypt.encryptor.password
参数必须与配置文件中的一致,不然后面会解密失败。
执行之后,重新查看配置文件,可以看到,自动变成了
datasource.password=ENC(/AL9nJENCYCh9Pfzdf2xLPsqOZ6HwNgQ3AnMybFAMeOM5GphZlOK6PxzozwtCm+Q)
jasypt.encryptor.password=didispace
其中,ENC()
跟DEC()
一样都是jasypt提供的标识,分别用来标识括号内的是加密后的内容和待加密的内容。
如果当前配置文件已经都是ENC()
内容了,那么我们可以通过下面的命令来解密配置文件,查看原始信息:
mvn jasypt:decrypt -Djasypt.encryptor.password=didispace
该操作不会修改配置文件,只会在控制台输出解密结果,比如:
datasource.password=DEC(didispace.com)
jasypt.encryptor.password=didispace
第六步:此时,我们的配置文件中的敏感信息已经被ENC()
修饰了,再执行一下单元测试,不出意外的话,依然可以得到之前一样的结果:
2021-08-13 22:50:00.463 INFO 76150 --- [ main] com.didispace.chapter15.PropertiesTest : datasource.password : didispace.com
而此时,配置文件中已经是加密内容了,敏感信息得到了保护。
本系列教程《Spring Boot 2.x基础教程》点击直达! ,欢迎收藏与转发!如果学习过程中如遇困难?可以加入我们Spring技术交流群 ,参与交流与讨论,更好的学习与进步!
进一步思考
根据上面的步骤,爱思考的你,也许会发现这样的问题:虽然敏感信息是加密了,但是我们通过配置文件也能看到jasypt.encryptor.password
信息,我们是不是通过利用这个再把原始信息解密出来,这样的话岂不是还是不安全?
上面的实现方式的确是会有这样的问题!所以,在实际应用的过程中,jasypt.encryptor.password
的配置,可以通过运维小伙伴在环境变量或启动参数中注入,而不是由开发人员在配置文件中指定。
同时,为了应对更高的安全要求,jasypt也提供自定义的加密解密方式,这里就不做具体展开了,有兴趣的小伙伴可以前往jasypt的仓库查看使用细节。
代码示例
本文的完整工程可以查看下面仓库中2.x
目录下的chapter1-5
工程:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您觉得本文不错,欢迎Star
支持,您的关注是我坚持的动力!
欢迎关注我的公众号:程序猿DD,分享外面看不到的干货与思考!
Spring Boot 配置中的敏感信息如何保护?的更多相关文章
- Spring Boot 2 中的默认日志管理与 Logback 配置详解
Spring Boot在所有内部日志中使用Commons Logging,但是对底层日志的实现是开放的.在Spring Boot生态中,为Java Util Logging .Log4J2 和Logb ...
- spring boot 配置访问其他模块包中的mapper和xml
maven项目结构如下,这里只是简单测试demo,使用的springboot版本为2.1.3.RELEASE 1.comm模块主要是一些mybatis的mapper接口和对应的xml文件,以及数据库表 ...
- Spring Boot 配置优先级顺序
一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...
- 你真的理解 Spring Boot 项目中的 parent 吗?
前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent> <groupId ...
- Spring Boot项目中使用Swagger2
Swagger2是一款restful接口文档在线生成和在线接口调试工具,Swagger2在Swagger1.x版本的基础上做了些改进,下面是在一个Spring Boot项目中引入Swagger2的简要 ...
- Spring Boot 2中对于CORS跨域访问的快速支持
原文:https://www.jianshu.com/p/840b4f83c3b5 目前的程序开发,大部分都采用前后台分离.这样一来,就都会碰到跨域资源共享CORS的问题.Spring Boot 2 ...
- RabbitMQ入门:在Spring Boot 应用中整合RabbitMQ
在上一篇随笔中我们认识并安装了RabbitMQ,接下来我们来看下怎么在Spring Boot 应用中整合RabbitMQ. 先给出最终目录结构: 搭建步骤如下: 新建maven工程amqp 修改pom ...
- spring boot配置mybatis和事务管理
spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...
- Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent
前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent> <groupId ...
随机推荐
- POJ 1696 Space Ant 点积计算夹角
题意: 一只特别的蚂蚁,只能直走或者左转.在一个平面上,有很多株植物,这只蚂蚁每天需要进食一株,这只蚂蚁从起点为(0,miny)的点开始出发.求最多能活多少天 分析: 肯定是可以吃到所有植物的,以当前 ...
- Mybatis学习(3)实现数据的增删改查
前面已经讲到用接口的方式编程.这种方式,要注意的一个地方就是.在User.xml 的配置文件中,mapper namespace="com.yihaomen.mybatis.inter.I ...
- php+redis实现全页缓存系统
php redis 实现全页缓存系统之前的一个项目说的一个功能,需要在后台预先存入某个页面信息放到数据库,比如app的注册协议,用户协议,这种.然后在写成一个php页面,app在调用接口的时候访问这个 ...
- 计算机基础 | 文档神器docsify安装及基本使用
为啥要用docsify? 神器Docsify让你的文档变得美观,配合typora,从此爱上看文档,各种优点:小巧.快速.美观.方便.快捷.上手快,可以浏览如下优秀案例 ve-charts pyecha ...
- 盘点linux操作系统中的10条性能调优命令,一文搞懂Linux系统调优
原文链接:猛戳这里 性能调优一直是运维工程师最重要的工作之一,如果您所在的生产环境中遇到了系统响应速度慢,硬盘IO吞吐量异常,数据处理速度低于预期值的情况,又或者如CPU.内存.硬盘.网络等系统资源长 ...
- Chirp Z-Transform
Chirp Z-Transform 其实不是什么特别难的东西. 用于解决等比数列/类等比数列多点求值. \(b_i=\sum_{j=0}^{n}a_jc^{ij}\) 注意到 \(ij=\binom{ ...
- celery task异步任务
业务端后台:通过python manage运行 运行用例时,用python manage运行时会卡,影响效率 celery task 本身自己也是个服务,异步处理case 异步:小明去给我买个东西,我 ...
- c++ 进制转换源代码
#include<stdio.h> int main() { char ku[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C ...
- Python基础之函数的闭包与装饰器的介绍
1.闭包的概念: 如果在一个函数中,定义了另外一个函数,并且那个函数使用了外面函数的变量,并且外面那个函数返回了里面这个函数的引用,那么称为里面的这个函数为闭包. 2.话不多说,以demo示例: de ...
- Appium -- adb monkey操作(一)
1.Monkey简介在Android的官方自动化测试领域有一只非常著名的"猴子"叫Monkey,这只"猴子"一旦启动,就会让被测的Android应用程序像猴子一 ...