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

 更新时间:2026年07月06日 09:34:23   作者:张老师技术栈  
SpringBoot 的 application.yml 里经常要写数据库密码、Redis 密码、API 密钥等敏感信息,Jasypt可以对这些敏感信息加密,启动时自动解密,本文给大家介绍了SpringBoot整合Jasypt实现配置文件加密的实战指南,需要的朋友可以参考下

引言

SpringBoot 的 application.yml 里经常要写数据库密码、Redis 密码、API 密钥等敏感信息。直接把明文写在配置文件里提交到 Git,等于把密码公开了。Jasypt(Java Simplified Encryption)可以对这些敏感信息加密,启动时自动解密。

一、为什么需要配置加密

# ❌ 明文配置(危险!)
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. 引入依赖

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

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):

<!-- SpringBoot 3.x 默认支持 AES-256 -->
<!-- SpringBoot 2.x 需要额外配置 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,密钥通过环境变量注入

到此这篇关于SpringBoot整合Jasypt实现配置文件加密的实战指南的文章就介绍到这了,更多相关SpringBoot Jasypt配置文件加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis 字段名自动转小写的实现

    mybatis 字段名自动转小写的实现

    这篇文章主要介绍了mybatis 字段名自动转小写的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java实现导出pdf格式文件的示例代码

    Java实现导出pdf格式文件的示例代码

    这篇文章主要为大家详细介绍了Java实现导出pdf格式文件的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Java后端配置允许跨域方式

    Java后端配置允许跨域方式

    本文介绍了在不同技术和框架中配置跨域资源共享(CORS)的方法,包括使用SpringMVC的@CrossOrigin注解、SpringBoot的全局CORS配置、SpringSecurity中的CORS集成以及手动设置响应头,根据具体需求和技术栈,选择合适的方法来确保跨域请求的安全性和有效性
    2025-02-02
  • 使用spring的restTemplate注意点

    使用spring的restTemplate注意点

    这篇文章主要介绍了使用spring的restTemplate注意点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java向kettle8.0传递参数的方式总结

    Java向kettle8.0传递参数的方式总结

    介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValue,以及通过EL表达式获取参数值
    2025-01-01
  • JAVA时间存储类Period和Duration使用详解

    JAVA时间存储类Period和Duration使用详解

    这篇文章主要为大家介绍了JAVA时间存储类Period和Duration使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • java发送http请求时如何处理异步回调结果

    java发送http请求时如何处理异步回调结果

    这篇文章主要介绍了java发送http请求时如何处理异步回调结果问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • java后端+前端使用WebSocket实现消息推送的详细流程

    java后端+前端使用WebSocket实现消息推送的详细流程

    后端向前端推送消息就需要长连接,首先想到的就是websocket,下面这篇文章主要给大家介绍了关于java后端+前端使用WebSocket实现消息推送的详细流程,需要的朋友可以参考下
    2022-10-10
  • Spring Service功能作用详细讲解

    Spring Service功能作用详细讲解

    service层测试较简单,目前大多数测试主要是针对public方法进行的。依据测试方法划分,可以分为两种:基于mock的隔离测试和基于dbunit的普通测试
    2022-12-12
  • idea中@Autowired注解下变量报红的解决

    idea中@Autowired注解下变量报红的解决

    这篇文章主要介绍了idea中@Autowired注解下变量报红的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论