您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring Boot 进阶-深入了解Spring Boot 如何对配置文件数据进行加密

时间:2022-11-14 12:07:10  来源:今日头条  作者:架构师面试宝典


 

这里首先需要说明的就是为什么要进行配置文件加密。在当今这个移动互联网横行的时代里,无论是企业的隐私还是个人的隐私都是需要得到保护的。所以我们在实际的操作中会采用各种各样的方式来确保个人隐私不被泄露。

而对于我们的Spring Boot开发的应用也是一样的,它是通过一个Jar包就可以运行的,但是在运行过程中不难保证这个Jar包泄露,然后破坏者利用jar包中的配置文件配置的数据库密码等内容登陆数据库,最终导致信息泄露等问题,那么我们应该如何做才能保证不会出现这些问题呢?下面我们就来看一下Spring Boot的配置文件是如何实现数据库连接信息脱敏处理的。

配置文件如何脱敏处理?

在我们的Spring Boot配置文件中会有大量的敏感信息存在,例如数据库的连接地址,数据库账号密码等等信息,这些信息一旦泄露,造成的损失也是巨大的,那么我们如何去实现这些信息的加密处理呢?

一般的思路都是,在编写的时候我们进行加密,然后在实际使用的时候进行解密使用,这样的话这个加解密的工作都是在动态的过程中完成的,所以就不会出现问题。但是这样的新的问题就出现了,我们每次都需要完成这个动态的操作,一次两次还可以,但是如果重复次数过多的话就会带来各种问题?而下面我们提供的这种方案就是通过场景启动器来解决,让使用者可以在毫无感知的情况下完成上面的动态操作。

实践操作

第一步、需要在POM文件中引入场景启动器的依赖项。

com.Github.ulisesbocchiojasypt-spring-boot-starter3.0.3

第二步、既然是需要完成加密操作,那么我们就需要在配置文件中添加对应的密钥,然后在进行解密的时候使用对应的密钥进行解密操作。

jasypt:encryptor:password: YYJDkj12kwq1r322r2rjk

第三步、实现数据加密操作,这里我们编写一个Controller的控制来进行操作,当然我们还可以通过编写测试的方式进行数据加密操作

@RestControllerpublic class JasyptController {@Autowiredprivate StringEncryptor stringEncryptor;@GetMApping("/hello")public String hello(){String url =stringEncryptor.encrypt("jdbc:MySQL://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8");String name = stringEncryptor.encrypt("root");String password = stringEncryptor.encrypt("root");System.out.println("数据库连接 " + url);System.out.println("用户名 " + name);System.out.println("密码 "+ password);return "OK";

运行结果如下。


 

我们会看到数据库的连接地址、用户名、密码都进行了加密,这个时候我们就可以将加密后的内容添加到配置文件中。

注意,这里我们需要进行一个简单的分析,每个场景启动器都有自己对应的自动配置文件,这个加密的场景启动器也不例外。我们先来找到他对应的自动配置类JasyptSpringBootAutoConfiguration

JasyptSpringBootAutoConfiguration@Configuration@Import(EnableEncryptablePropertiesConfiguration.class)public class JasyptSpringBootAutoConfiguration {

会看到其源码非常简单,一般来说,在我们的自动配置类中都会有配置项有关的内容,但是在这个配置类中却没有。但是却引入了EnableEncryptablePropertiesConfiguration一个外部的配置类。那么这个类到底是什么?

@Configuration@Import({EncryptablePropertyResolverConfiguration.class, CachingConfiguration.class})public class EnableEncryptablePropertiesConfiguration {private static final Logger log = LoggerFactory.getLogger(EnableEncryptablePropertiesConfiguration.class);public EnableEncryptablePropertiesConfiguration() {@Beanpublic static EnableEncryptablePropertiesBeanFactoryPostProcessor enableEncryptablePropertySourcesPostProcessor(ConfigurableEnvironment environment, EncryptablePropertySourceConverter converter) {return new EnableEncryptablePropertiesBeanFactoryPostProcessor(environment, converter);

在这个配置文件中我们需要注意的有两个地方,一个是EncryptablePropertyResolverConfiguration 配置类,另一个则是EnableEncryptablePropertiesBeanFactoryPostProcessor的前置处理器。对于前置处理器,有兴趣的读者可以查询一下。这里我们不做过多说明直接分析源码即可。

在EncryptablePropertyResolverConfiguration源码中为我们定义了很多的加解密的Bean对象。我们可以根据具体的需求来使用具体的加解密的对象,当然我们也可以自定义自己的加解密方法对象,这个需要参考GitHub上的相关文档。这里先不做过多说明。

EnableEncryptablePropertiesBeanFactoryPostProcessor 前置处理器则是加载一些与配置环境相关的内容。也就是说需要使用Jasypt就必须要加载一些与它相关的配置。例如我们下面要讲到的这个配置类就是在Spring Boot中我们经常会遇到的一个配置类的形式。在这个配置类中定义了很多的关于我们引入配置如何进行全局配置的方式。

JasyptEncryptorConfigurationProperties 配置项文件

这个配置类不同于我们以往遇到的配置类,在自动配置文件中进行了使用,这个配置类中有一个构造方法是值得我们关注的。

public static JasyptEncryptorConfigurationProperties bindConfigProps(ConfigurableEnvironment environment) {final BindHandler handler = new IgnoreErrorsBindHandler(BindHandler.DEFAULT);final MutablePropertySources propertySources = environment.getPropertySources();final Binder binder = new Binder(ConfigurationPropertySources.from(propertySources),new PropertySourcesPlaceholdersResolver(propertySources),ApplicationConversionService.getSharedInstance());final JasyptEncryptorConfigurationProperties config = new JasyptEncryptorConfigurationProperties();final ResolvableType type = ResolvableType.forClass(JasyptEncryptorConfigurationProperties.class);final Annotation annotation = AnnotationUtils.findAnnotation(JasyptEncryptorConfigurationProperties.class,ConfigurationProperties.class);final Annotation[] annotations = new Annotation[]{annotation};final Bindable target = Bindable.of(type).withExistingValue(config).withAnnotations(annotations);binder.bind("jasypt.encryptor", target, handler);return config;

我们都知道,在之前的配置类使用过程中,我们都是通过@ConfigurationProperties(prefix = "jasypt.encryptor", ignoreUnknownFields = true) 这样的注解来进行属性值绑定的,但是这里这个配置类用到了BindHandler 进行数据属性绑定。由于这个文件中的内容较多。这里就不复制源码了,挑几个比较重要的属性进行说明

在这个文件中有一个属性比较重要,有很多人在使用过程中直接将加密串放到了配置文件中,就会引起各种各样的问题。

* Specify a custom {@link String} to identify* as prefix of encrypted properties. Default value is* {@code "ENC("}private String prefix = "ENC(";* Specify a custom {@link String} to identify* as suffix of encrypted properties. Default value is {@code ")"}private String suffix = ")";

从意思中可以看出,它是为每个配置项加上了一个配置前缀,也就是说,每个配置项有了这个前缀之后才会生效。

spring:datasource:url: ENC(uHOWjxcz6yEyEUnc0J99Pkmbyg5rkZcsgzH+nOnPnPF7iTu09FRlWSptxRMDF9+OEPfTZmARRm2F6hYtn6U/YeXQVO//OKEjFSNAuKaa1BvmWBqlxiHM1RERlTRqEYZ9zssgT9VNpSeSllW0J/RjNqN3xLHkfrePJTHW0a9flFTORYexuVviGWxmDrCM3qi4PTbAO5IV6bOjCB2+fFzaKI4zbJP4pLVX5uq8977roOg=)password: ENC(hMiBCsfEn0sKkLq8YXGNGWTGkLFCupAxWK0zJlr/uaGYR4U39F1fO+FmEQemmNCU)driver-class-name: com.mysql.jdbc.Driverusername: ENC(kB1Td66wuyfPW9qqQhPn/z/RjXhp3IL2H79fW6pS8T0QhNUrsP9lWaEpeIK6Qws1)

当然我们也可以修改这个配置前缀,改成我们自定义的配置前缀。

另外需要注意的一点,在进行加密的时候我们是将密钥直接配置到了配置文件中。

jasypt:encryptor:password: 123123123123123

这样做是不安全的,如果有人拿到了源码,还可以通过分析的方式获取到相关的信息。所以,最正确的做法是将我们的密钥添加到我们每次的jar命令启动的过程中如下

JAVA -jar xxxx.jar -Djasypt.encryptor.password=12312312322321

另外扩展说命名一下jasypt项目在GitHub上可以直接查询。相关更高级的使用可以在GitHub上查看。



Tags:Spring Boot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring Boot2.0深度实践 核心原理拆解+源码分析
Spring Boot2.0深度实践:核心原理拆解与源码分析一、引言Spring Boot是一个基于Java的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用...【详细内容】
2024-01-15  Search: Spring Boot  点击:(96)  评论:(0)  加入收藏
Spring Boot 3.0是什么?
Spring Boot 3.0是一款基于Java的开源框架,用于简化Spring应用程序的构建和开发过程。与之前的版本相比,Spring Boot 3.0在多个方面进行了改进和增强,使其更加易用、高效和灵活...【详细内容】
2024-01-11  Search: Spring Boot  点击:(133)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11  Search: Spring Boot  点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  Search: Spring Boot  点击:(119)  评论:(0)  加入收藏
Spring Boot Starter的原理
Spring Boot Starter 是 Spring Boot 框架的特性之一,用于简化应用程序的依赖管理和配置。1. 概述: - Spring Boot Starter 是一种包含了一组特定功能和依赖关系的依赖项,旨在...【详细内容】
2024-01-05  Search: Spring Boot  点击:(94)  评论:(0)  加入收藏
Spring Boot 统一响应体处理器详解
在Spring Boot应用中,统一处理响应体是一项非常重要的任务,它可以让我们更方便地统一规范API的返回格式。今天,我们将深入探讨一个优雅的解决方案——使用ResultHand...【详细内容】
2023-11-30  Search: Spring Boot  点击:(150)  评论:(0)  加入收藏
Spring Boot 调优内嵌 Tomcat 的三种方法
在 Spring Boot 中优化 Apache Tomcat 有三种方式,以便实现更好的性能和资源利用率。 线程池(连接器和执行器)设置 使用 NIO 或 APR 连接器 JVM优化线程池设置在 Spring Boot...【详细内容】
2023-11-23  Search: Spring Boot  点击:(228)  评论:(0)  加入收藏
一文搞懂Spring Boot控制器的关键要点
Spring Boot 应用程序中的控制器扮演着重要角色,负责处理传入的 HTTP 请求并确定应发送的适当响应。本文深入介绍 Spring Boot 中的控制器,包括如何创建控制器、处理各种类型...【详细内容】
2023-11-20  Search: Spring Boot  点击:(151)  评论:(0)  加入收藏
Spring Boot中实现订单30分钟自动取消的策略思路及源代码
方式一:使用定时任务 首先,创建一个定时任务,比如每30分钟执行一次检查订单是否需要取消的逻辑。 在订单生成的时候,保存一条记录到数据库,标记订单的状态为"待处理"。 在定时任...【详细内容】
2023-11-20  Search: Spring Boot  点击:(221)  评论:(0)  加入收藏
Spring Boot + Vue3 前后端分离 实战wiki知识库系统
下栽の地止:https://www.itwangzi.cn/2508.html Spring Boot + Vue3 前后端分离 实战wiki知识库系统在当今的Web应用开发中,前后端分离已经成为了一种主流的开发模式。Spring...【详细内容】
2023-11-18  Search: Spring Boot  点击:(144)  评论:(0)  加入收藏
▌简易百科推荐
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  刘长伟    Tags:UI框架   点击:(1)  评论:(0)  加入收藏
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(19)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(55)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(47)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(51)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(68)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(88)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
站内最新
站内热门
站内头条