java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot Jasypt配置文件加密

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

作者:张老师技术栈

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(加密后的密文)  # ← 别人看不懂

安全风险:

二、集成 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配置文件加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文