Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)

Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)

一、前言

Spring Boot 项目中,application.ymlapplication.properties 配置文件会存储大量敏感信息,包括数据库账号密码、Redis 密码、接口密钥、短信/OSS 秘钥等。

如果以明文存储,一旦代码仓库泄露、服务器文件被窃取,会造成核心数据安全事故。因此生产环境必须对配置文件敏感信息加密存储

本文采用行业通用方案:Jasypt,无侵入、开箱即用,支持 Spring Boot 自动解密,适配所有配置项,是中小型项目首选安全方案。

二、Jasypt 方案优势

  • 零业务代码侵入,仅修改配置文件

  • 项目启动自动解密,业务层无需手动处理

  • 支持 AES 高强度加密算法,安全性高

  • 支持环境变量、启动参数传递密钥,避免密钥硬编码

  • 兼容 yml、properties 所有配置文件

三、版本依赖引入

适配 Spring Boot2.x / 3.x,引入 Jasypt 官方启动器。

3.1 Maven 依赖(pom.xml)

xml 复制代码
<!-- Spring Boot 配置文件加密 Jasypt -->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

版本说明:3.0.5 兼容 Spring Boot 2.7+、3.x 全版本,稳定无兼容问题。

四、生成密文(核心步骤)

需要先将明文密码、密钥通过 Jasypt 算法加密为密文,提供三种常用生成方式,推荐代码工具类生成(最稳定)。

4.1 自定义工具类生成密文(推荐)

编写测试工具类,指定加密密钥和明文,生成可直接使用的密文。

java 复制代码
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;

/**
 * Jasypt 加解密工具类
 * 用于生成配置文件密文、测试解密
 */
public class JasyptUtil {

    // 自定义加密密钥(生产环境务必更换复杂密钥)
    private static final String SECRET_KEY = "SpringBoot@2026";

    public static void main(String[] args) {
        // 需要加密的明文(数据库密码、Redis密码等)
        String plainText = "123456";

        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();
        config.setPassword(SECRET_KEY);
        // 使用高强度AES加密算法
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        encryptor.setConfig(config);

        // 加密
        String cipherText = encryptor.encrypt(plainText);
        // 解密(验证用)
        String decryptText = encryptor.decrypt(cipherText);

        System.out.println("明文:" + plainText);
        System.out.println("密文:ENC(" + cipherText + ")");
        System.out.println("解密验证:" + decryptText);
    }
}

运行 main 方法,即可生成 ENC(密文) 格式字符串,直接放入配置文件即可。

4.2 IDEA 插件 / 在线工具(临时使用)

开发测试可使用 Jasypt 在线加解密工具,输入明文和自定义密钥,快速生成密文,生产环境禁止使用在线工具,避免密钥泄露。

五、配置文件改造(YML / Properties)

Jasypt 默认规则:所有被 ENC() 包裹的内容,项目启动时自动解密

5.1 application.yml 配置

yaml 复制代码
# Jasypt 加密配置
jasypt:
  encryptor:
    # 加密密钥(生产环境通过环境变量/启动参数注入,不硬编码)
    password: ${JASYPT_ENCRYPTOR_PASSWORD:}
    # 加密算法
    algorithm: PBEWITHHMACSHA512ANDAES_256
    iv-generator-class-name: org.jasypt.iv.RandomIvGenerator

# 数据库配置(敏感信息加密)
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf-8
    username: ENC(xxxx密文xxxx)
    password: ENC(xxxx密文xxxx)

# Redis 配置
redis:
  password: ENC(xxxx密文xxxx)

5.2 application.properties 配置

properties 复制代码
# Jasypt 配置
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}
jasypt.encryptor.algorithm=PBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.iv-generator-class-name=org.jasypt.iv.RandomIvGenerator

# 数据库配置
spring.datasource.username=ENC(xxxx密文xxxx)
spring.datasource.password=ENC(xxxx密文xxxx)

六、密钥安全注入(生产核心)

绝对禁止将加密密钥硬编码在配置文件中,否则加密无意义。生产环境提供两种安全注入方式。

6.1 启动参数传递(推荐)

项目启动时通过命令行传入密钥,密钥不落地、不提交代码库。

bash 复制代码
java -jar your-project.jar --jasypt.encryptor.password=自定义复杂密钥

6.2 系统环境变量传递

服务器提前配置环境变量 JASYPT_ENCRYPTOR_PASSWORD,项目自动读取。

bash 复制代码
# Linux 临时配置
export JASYPT_ENCRYPTOR_PASSWORD=自定义复杂密钥

# 启动项目
java -jar your-project.jar

七、解密验证测试

编写测试接口,验证配置是否正常解密,确保项目可正常读取明文配置。

java 复制代码
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigTestController {

    @Value("${spring.datasource.password}")
    private String dbPassword;

    @GetMapping("/config/test")
    public String test() {
        return "数据库密码解密后明文:" + dbPassword;
    }
}

启动项目访问接口,能正常输出明文密码,说明加解密配置生效。

八、常见问题与避坑指南

8.1 启动报错:Invalid key size

原因:JDK 默认密钥长度受限,不支持 256 位 AES 加密

解决方案:使用 Jasypt 3.0+ 版本,自动兼容无限制密钥,无需手动替换 JCE 包。

8.2 密钥配置后解密失败

  • 加密、解密必须使用同一个密钥、同一个算法

  • 密文禁止手动修改、空格、换行

  • 确认启动时成功注入密钥,无参数覆盖

8.3 代码提交安全问题

配置文件只提交密文,密钥通过启动参数/环境变量注入,彻底杜绝密钥泄露。

九、高级扩展(企业级优化)

9.1 自定义加密标识

默认使用 ENC(),可自定义前后缀,避免冲突。

yaml 复制代码
jasypt:
  encryptor:
    prefix: CIPHER(
    suffix: )

9.2 配合 Nacos / Apollo 配置中心

Jasypt 完全兼容分布式配置中心,配置中心存储密文,本地启动注入密钥,兼顾配置统一和数据安全。

十、总结

  1. Jasypt 是 Spring Boot 配置加密最优轻量方案,零侵入、高安全、易落地;

  2. 核心规范:配置文件存密文,密钥动态注入,绝不硬编码

  3. 所有数据库、中间件、接口秘钥必须加密存储,杜绝明文泄露风险;

  4. 生产环境必须使用启动参数/环境变量传递密钥,禁止写死在项目配置中。

相关推荐
_codemonster1 小时前
Codex 核心进阶玩法(技能/MCP/派生/分叉/Git/钩子/子智能体)
git
逻极1 小时前
Git 从入门到精通:版本控制协作实战指南
git·github·分支管理·版本控制
恋喵大鲤鱼1 小时前
git clean
git·git clean
凡人叶枫1 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
杨运交2 小时前
[030][Web模块]Spring Boot 验证与 OpenAPI 集成实战:从校验规则到文档生成
前端·spring boot·python
极客先躯2 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
NE_STOP2 小时前
Raft算法处理细节
java
努力攻坚操作系统2 小时前
编程语言编译运行机制对比:C / Java / Python
java·c语言·python
Patrick_Wilson2 小时前
为省一次回归测试,该不该把多个改动堆进一条分支?
git·ci/cd·架构