Spring Boot 保护敏感配置的 4 种方法,让你的系统不再裸奔!!(1)

简介: Spring Boot 保护敏感配置的 4 种方法,让你的系统不再裸奔!!(1)

0、问题背景

用 Spring Boot 框架的小伙伴应该都知道,Spring Boot 有个主要的 applicaiton 配置文件,那就会涉及到敏感配置信息,比如各种中间件的连接用户名密码信息、以及各种第三方的 KEY、密钥等。


这种敏感信息如果直接放在配置文件中肯定是不安全的,甚至在很多行业及领域(比如:支付领域)都是不合规的,所以需要保护 Spring Boot 中的敏感配置信息。


所以,你还在让你的 Spring Boot 系统裸奔吗?如果是,那不妨看看本文中栈长分享的 4 种方法,让你的系统不再裸奔!


1、配置中心(支持自动解密)

我觉得还得看大家的架构情况,如果使用了外置的第三方配置中心(支持自动解密的那种),就可以把所有的配置信息存储在配置中心,比如  Spring Cloud 生态中的配置中心,那么可以使用自带的加、解密机制保护敏感信息:

spring:   
  datasource:     
    username: '{cipher}t1s293294187a31f35dea15e8bafaf7774532xxcc20d6d6dd0dfa5ae753d6836'

需要加密的内容以  {cipher} 开头标识,并注意要使用单引号包起来,具体的细节可以参考《Spring Cloud 配置中心内容加密》这篇文章,Spring Boot 配置文件就只存储一些无关紧要的配置。


大家用的哪款配置中心呢?支付配置加解密吗?欢迎分享!


如果没有用到配置中心呢


比如说传统的 Spring Boot 的 MVC 项目,所有的代码、配置都几乎在同一个项目中,Spring Boot 中的核心配置文件就是 application.yml(.properties)文件,那要怎么保护敏感配置信息呢?继续往下看!


2、数据库机制

可以把所有配置信息存储到数据库,系统启动的时候全部加载进内存。存储的时候,敏感信息以对称加密算法进行加密存储,然后加载的时候自动解密到内存。


这是最传统的配置管理方法,其实你也可以理解为一个原始的、简易的配置中心,只是功能不那么强大而已,因为现在很多配置中心就是把配置放在数据库中进行存储,然后提供一系列的配置管理功能。


这里的数据库可以是关系数据库(MySQL、Oracle)、内存数据库(Redis、Zookeeper)等,这是普遍用的比较多的中间件技术。


3、自定义加解密机制

这时候也要看使用的程度,如果只是简单的数据库连接池信息,那么可以考虑使用现有系统中的对称加密算法,再结合连接池数据源类实现自定义加解密机制,比如我们可以模仿 Spring Cloud 加密机制:


先用系统已有的对称加密算法对数据库连接信息加密:

spring:   
  datasource:     
    username: '{cipher}t1s293294187a31f35dea15e8bafaf7774532xxcc20d6d6dd0dfa5ae753d6836'

排除 Spring Boot 系统自带的数据源自动配置,然后自行组装数据源 Spring Bean。


判断获取的配置值是否以  {cipher} 这个标识开头,如果是,则用系统约定的对称加密算法进行解密,然后再设置数据源,比如:

// 示例代码
@Bean
public DataSource dataSource(){
 DataSource dataSource = new DruidDataSource();
 // 解密
 String username = this.getUsername();
 if (username.startWith('{cipher}')){
  username = Encrypt.decrypt(username, this.getKey()))
 } 
 dataSource.setUsername(username);
 ...
 return dataSource;
}

Spring Boot 基础就不介绍了,推荐下这个实战教程,教程和示例源码都已经传了:https://github.com/javastacks/spring-boot-best-practice


这种使用简单,不用额外引入任何第三方包,如果大家也是使用的自定义数据源,或者这种手动加解密机制可以满足保护其他敏感配置的需求,那么这种方案供大家参考。


上面介绍的自定义的加解密机制可以满足一般的需求,如果是 Spring Boot 自动配置的场景,比如数据源自动配置,Redis 自动配置,等等,这种在系统启动的时候就会默认自动配置,我们人工解密干预不到。


像这种情况,我们就需要考虑介入框架层了,在 Spring Boot 框架读取配置的时候进行拦截解密,或者使用第三方的框架,用的比较多是:Jasypt Spring Boot。


4、Jasypt Spring Boot

Jasypt Spring Boot 是一个专门为 Spring Boot 项目中的属性提供加密支持的框架,支持的版本为 Spring Boot 1.x ~ 2.x,栈长写文之时,现在已经有 1.8K+ 的 Star 数了,还是挺受欢迎的。


开源地址:


https://github.com/ulisesbocchio/jasypt-spring-boot


image.png

这个开源项目更新也挺及时的,最新更新的,已支持 Spring Boot 2.5.4!


这里栈长再免费分享你一份 Spring Boot 学习笔记,理论和实战都非常齐全,助你快速搞定 Spring Boot。


4.1 Jasypt Spring Boot 实战

Jasypt Spring Boot 有 3 种集成方法:

1、如果开启了 Spring Boot 的自动配置(使用了 @SpringBootApplication 或者 @EnableAutoConfiguration 注解):只需要添加 jasypt-spring-boot-starter 依赖即可,这种会在整个 Spring Environment 中启用可加密属性;


2、添加 jasypt-spring-boot 依赖,同时在 Spring 主要配置类上添加 @EnableEncryptableProperties 注解,这种会在整个 Spring Environment 中启用可加密属性;


3、添加 jasypt-spring-boot 依赖,使用 @EncrytablePropertySource 注解声明各个可加密的参数上,这种只适用于独立配置参数加解密;


一般的 Spring Boot 都会开启自动配置,然后再排除个别的自动配置,所以很少会有全部禁用自动配置的情况,不然使用 Spring Boot 的意义不大,这里我们使用第 1 种集成方式进行演示。


4.1.1 引入依赖

核心依赖:

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

Maven 插件(可选)

<build>
    <plugins>
        <plugin>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-maven-plugin</artifactId>
            <version>${jasypt-spring-boot.version}</version>
        </plugin>
    </plugins>
</build>

4.1.2 添加密钥

jasypt:
  encryptor:
    password: G9w0BAQEFAASCBKYwggSiAgEAAoIBAQC
    property:
      prefix: "ENC@["
      suffix: "]"

这个 jasypt.encryptor.password 参数是必须的,相当于 Salt(盐),以保证密码安全性,prefixprefix 是自定义的密码串标识,不配置默认为:ENC(...)


4.1.3 敏感信息加密

/**
 * 来源微信公众号:Java技术栈
 * 作者:栈长
 */
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class JasyptTest {
    @Autowired
    private StringEncryptor stringEncryptor;
    /**
     * 来源微信公众号:Java技术栈
     * 作者:栈长
     */
    @Test
    public void encrypt() {
        String usernameEnc = stringEncryptor.encrypt("javastack");
        String passwordEnc = stringEncryptor.encrypt("javastack.cn");
        log.info("test username encrypt is {}", usernameEnc);
        log.info("test password encrypt is {}", passwordEnc);
        log.info("test username is {}", stringEncryptor.decrypt(usernameEnc));
        log.info("test password is {}", stringEncryptor.decrypt(passwordEnc));
    }
}

这里我注入了一个 StringEncryptor,其类结构图如下:

image.png

如果当前没有自定义 StringEncryptor,Jasypt Spring Boot 的自动配置会默认创建一个 StringEncryptor 实例,直接用就行了,其构造器默认值如下:

image.png

然后运行测试用例来看下测试结果:

image.png加解密成功!!

相关文章
|
8月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
8月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
8月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2768 0
|
10月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
1312 0
|
7月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
8月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1551 5
|
8月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
449 0
探索Spring Boot的@Conditional注解的上下文配置
|
9月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1490 10
|
10月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1601 1
|
10月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
752 0

热门文章

最新文章