当前位置:

首页 > 编程开发 > SpringBoot整合Jasypt实现配置文件加密的实战指南

SpringBoot整合Jasypt实现配置文件加密的实战指南

引言 说实话,直接把数据库密码、Redis密码、API密钥这些敏感信息明文写在application.yml里,再甩手提交到Git仓库——这操作跟把家里钥匙挂在门口有啥区别?Jasypt(Java Simplified Encryption)这套工具就是专门来治这个毛病的:对敏感信息加密存储,应用启

引言

说实话,直接把数据库密码、Redis密码、API密钥这些敏感信息明文写在application.yml里,再甩手提交到Git仓库——这操作跟把家里钥匙挂在门口有啥区别?Jasypt(Java Simplified Encryption)这套工具就是专门来治这个毛病的:对敏感信息加密存储,应用启动时自动解密,谁也偷不走。

SpringBoot整合Jasypt实现配置文件加密的实战指南

一、为什么需要配置加密

# ❌ 明文配置(危险!)
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/seckill_db
    username: root
    password: 123456     # ← 密码暴露在配置文件里
# ✅ 加密配置(安全!)
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/seckill_db
    username: root
    password: ENC(加密后的密文)  # ← 别人看不懂

安全风险:

  • 代码提交到 Git 仓库 → 密码泄露
  • 开发人员都能看到生产密码
  • 项目外包时源码外流

二、集成 Jasypt

1. 引入依赖


    com.github.ulisesbocchio
    jasypt-spring-boot-starter
    3.0.5

2. 配置加密密钥

jasypt:
  encryptor:
    password: mySecretKey      # 加密密钥(不要写在配置里!)
    algorithm: PBEWithMD5AndDES

重要: 这个 password 建议通过环境变量或启动参数传入,不要写在 yml 里:

java -jar app.jar --jasypt.encryptor.password=mySecretKey

或者设置在环境变量中:

# Windows 系统环境变量
set JASYPT_ENCRYPTOR_PASSWORD=mySecretKey
# Linux
export JASYPT_ENCRYPTOR_PASSWORD=mySecretKey

配置中使用环境变量的引用:

jasypt:
  encryptor:
    password: ${JASYPT_ENCRYPTOR_PASSWORD}

三、加密与解密

1. 命令行加密(推荐)

# 下载 Jasypt 的 jar 包后,命令行加密
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI 
  input="123456" 
  password=mySecretKey 
  algorithm=PBEWithMD5AndDES
# 输出:
# ----OUTPUT----------------------
# O7v7T4H6zXkZp8V3YwA9Bw==

2. Java 代码加密(测试用)

@SpringBootTest
class JasyptTest {

    @Test
    void testEncrypt() {
        // 加密
        StringEncryptor encryptor = new DefaultEncryptor();
        String encrypted = encryptor.encrypt("123456");
        System.out.println("加密后: " + encrypted);
        // 输出: ENC(O7v7T4H6zXkZp8V3YwA9Bw==)

        // 解密
        String decrypted = encryptor.decrypt(encrypted);
        System.out.println("解密后: " + decrypted);
        // 输出: 123456
    }
}

3. 配置密文

把生成的密文用 ENC() 包裹,替换 yml 中的明文:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/seckill_db
    username: root
    password: ENC(O7v7T4H6zXkZp8V3YwA9Bw==)
  redis:
    host: localhost
    password: ENC(XyZ8pQ3mN5vB2kL7)
# 自定义配置也可以加密
app:
  api-key: ENC(H9jK2mN4pQ6rS8tU)

启动时 Jasypt 会自动解密 ENC(...) 包裹的内容。

四、加密密钥的安全管理

加密密钥(jasypt.encryptor.password)是所有加密数据的钥匙——它本身不能加密,需要单独管理:

环境推荐方案
本地开发环境变量
测试服务器环境变量
生产环境配置中心 或 启动参数

生产环境推荐使用启动参数(安全最高):

# 从专门的密钥管理服务获取
# 或者在启动脚本中手动输入(不写入任何文件)
java -jar app.jar 
  --jasypt.encryptor.password=$(cat /etc/secrets/jasypt.key) 
  --spring.profiles.active=prod

五、处理配置中的特殊字符

# 如果密码包含特殊字符(如 $、%、&),需要 URL 编码
password: ENC(abc%3Ddef)  # %3D 是 = 的 URL 编码
# 或者在生成密文时指定
# 命令行生成时,用单引号包裹
java -cp jasypt.jar ... input='P@ssw0rd!' ...

六、自定义加密算法

jasypt:
  encryptor:
    password: ${JASYPT_ENCRYPTOR_PASSWORD}
    algorithm: PBEWITHHMACSHA512ANDAES_256  # 更强的算法
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator

需要 Java 密码扩展包(JCE):



七、多密钥支持

不同配置项使用不同密钥加密:

jasypt:
  encryptor:
    # 默认密钥
    password: ${JASYPT_ENCRYPTOR_PASSWORD}
    # 不同 Bean 使用不同密钥
    bean:
      - encryptorName: dbEncryptor
        password: ${DB_ENCRYPTOR_PASSWORD}
      - encryptorName: apiEncryptor
        password: ${API_ENCRYPTOR_PASSWORD}
@Configuration
public class JasyptConfig {

    @Bean("dbEncryptor")
    public StringEncryptor dbEncryptor(
            @Value("${jasypt.encryptor.bean[0].password}") String password) {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setPassword(password);
        encryptor.setAlgorithm("PBEWithMD5AndDES");
        return encryptor;
    }
}
spring:
  datasource:
    password: ENC(xxx)  # 使用默认密钥
app:
  third-party-key: ENC(yyy)  # 也使用默认密钥

八、常见问题

1. 启动时报错 DecryptionException

# 原因:密钥不正确或密文被修改
# 解决:确认启动时传入的密钥和加密时使用的密钥一致
# 检查环境变量
echo $JASYPT_ENCRYPTOR_PASSWORD

2. 加密后启动正常,但连接数据库报错

# 原因:连接字符串中也包含密码信息
# 解决:整个 URL 加密不方便,只加密密码部分即可

3. 多环境配置

# application-dev.yml(开发环境可以明文,方便调试)
spring:
  datasource:
    password: 123456
# application-prod.yml(生产环境加密)
spring:
  datasource:
    password: ENC(O7v7T4H6zXkZp8V3YwA9Bw==)
# 开发环境启动直接跑
java -jar app.jar --spring.profiles.active=dev
# 生产环境需要传入密钥
java -jar app.jar 
  --spring.profiles.active=prod 
  --jasypt.encryptor.password=${JASYPT_PASSWORD}

九、最佳实践

  1. 永远不要在代码里硬编码加密密钥
  2. 生产环境和开发环境使用不同的密钥
  3. 密钥定期更换(更换时重新加密所有配置)
  4. 密钥存储在专门的密钥管理服务(如 HashiCorp Vault、阿里云 KMS)
  5. 配置文件和密钥分开管理——配置文件可以提交 Git,密钥通过环境变量注入
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
JavaEE之SpringBoot配置文件详解
JavaEE之SpringBoot配置文件详解

一、为什么需要配置文件? 写代码的时候,最怕什么?最怕改个端口号就得翻遍整个项目,重新打包部署。如果你把端口、数据库账号、第三方密钥这些变量直接写死在代码里——也就是所谓的硬编码——那维护起来可就真成了噩梦。具体来说,会面临三个绕不开的问题: 环境切换(本地/测试/生产)时,每次都得改代码、重新打包

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

Android Studio Windows版
Android Studio Windows版
Windows

Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,