前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot 配置中的敏感信息如何保护?

Spring Boot 配置中的敏感信息如何保护?

作者头像
程序猿DD
发布2021-09-03 14:55:51
8510
发布2021-09-03 14:55:51
举报
文章被收录于专栏:程序猿DD程序猿DD

在之前的系列教程中,我们已经介绍了非常多关于Spring Boot配置文件中的各种细节用法,比如:参数间的引用、随机数的应用、命令行参数的使用、多环境的配置管理等等。

这些配置相关的知识都是Spring Boot原生就提供的,而今天我们将介绍的功能并非Spring Boot原生就支持,但却非常有用:配置内容的加密

为什么要加密?

可能很多初学者,对于配置信息的加密并不敏感,因为开始主要接触本地的开发,对于很多安全问题并没有太多的考虑。而现实中,我们的配置文件中,其实包含着大量与安全相关的敏感信息,比如:数据库的账号密码、一些服务的密钥等。这些信息一旦泄露,对于企业的重要数据资产,那是相当危险的。所以,对于这些配置文件中存在的敏感信息进行加密,是每个成熟开发团队都一定会去的事。

如果您是DD的老读者,也许马上会想到Spring Cloud Config就提供配置的加密功能,之前在我的Spring Cloud系列教程和《Spring Cloud微服务实战》一书中都有详细的介绍,感兴趣的话可以点击《Spring Cloud构建微服务架构:分布式配置中心(加密解密)》(https://blog.didispace.com/spring-cloud-starter-dalston-3-2/)一探究竟。

既然以前写过类似内容,那为什么还要写呢?因为并不是所有的开发场景都会搭建Spring Cloud的那套基础设施,同时也不一定会使用Spring Cloud Config作为配置中心。所以,本文主要说说,当我们只使用Spring Boot的时候,如何实现对配置中敏感信息的加密。

动手试试

下面我们将使用https://github.com/ulisesbocchio/jasypt-spring-boot这个开源项目提供的实现和插件,来帮助我们轻松的完成配置信息的加密。

赶紧跟着我下面的步骤动手试试吧!

第一步:创建一个基础的Spring Boot项目(如果您还不会,可以参考这篇文章:快速入门(https://blog.didispace.com/spring-boot-learning-21-1-1/)

第二步:设计一个参数和单元测试,用来输出这个配置信息

准备加密的配置:

用来输出配置信息的单元测试:

执行这个单元测试,会输出:

这里还没开始加密,下面我们开始引入加密的操作!

第三步:在pom.xml中引入jasypt提供的Spring Boot Starter

在插件配置中加入:

第四步:在配置文件中加入加密需要使用的密码

同时,修改要加密的内容,用DEC()将待加密内容包裹起来,比如:

第五步:使用jasypt-maven-plugin插件来给DEC()包裹的内容实现批量加密。

在终端中执行下面的命令:

注意:这里-Djasypt.encryptor.password参数必须与配置文件中的一致,不然后面会解密失败。

执行之后,重新查看配置文件,可以看到,自动变成了

其中,ENC()DEC()一样都是jasypt提供的标识,分别用来标识括号内的是加密后的内容和待加密的内容。

如果当前配置文件已经都是ENC()内容了,那么我们可以通过下面的命令来解密配置文件,查看原始信息:

该操作不会修改配置文件,只会在控制台输出解密结果,比如:

第六步:此时,我们的配置文件中的敏感信息已经被ENC()修饰了,再执行一下单元测试,不出意外的话,依然可以得到之前一样的结果:

而此时,配置文件中已经是加密内容了,敏感信息得到了保护。

进一步思考

根据上面的步骤,爱思考的你,也许会发现这样的问题:虽然敏感信息是加密了,但是我们通过配置文件也能看到jasypt.encryptor.password信息,我们是不是通过利用这个再把原始信息解密出来,这样的话岂不是还是不安全?

上面的实现方式的确是会有这样的问题!所以,在实际应用的过程中,jasypt.encryptor.password的配置,可以通过运维小伙伴在环境变量或启动参数中注入,而不是由开发人员在配置文件中指定。

同时,为了应对更高的安全要求,jasypt也提供自定义的加密解密方式,这里就不做具体展开了,有兴趣的小伙伴可以前往jasypt的仓库(https://github.com/ulisesbocchio/jasypt-spring-boot)查看使用细节。

本系列教程《Spring Boot 2.x基础教程》http://blog.didispace.com/spring-boot-learning-2x/ ,欢迎收藏与转发!

如果学习过程中如遇困难?可以加入我们Spring技术交流群,参与交流与讨论,更好的学习与进步!

点击卡片关注,回复:加群

代码示例

本文的完整工程可以查看下面仓库中2.x目录下的chapter1-5工程:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/(https://github.com/dyc87112/SpringBoot-Learning/tree/master/2.x)
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/(https://gitee.com/didispace/SpringBoot-Learning/tree/master/2.x)

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要加密?
  • 动手试试
  • 进一步思考
  • 代码示例
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档