在Spring Boot项目中,配置文件中往往包含数据库的用户名和密码等敏感信息,如果不加保护直接上传到Git仓库并对外网开放,可能会导致严重的安全问题。本文介绍了如何使用Jasypt(Java Simplified Encryption)对这些敏感信息进行加密处理,从而提高项目的安全性。通过引入Jasypt依赖、配置加解密方法、在配置文件中使用加密后的密码,并在项目启动时提供加密密钥,我们可以有效地保护敏感信息。本文还详细讲解了Jasypt的工作原理以及如何在Spring Boot项目中集成和使用这一工具,同时提供了安全管理的建议,确保加密密码和其他敏感信息的安全性。
SpringBoot项目配置文件数据库密码安全上传方案
在Spring Boot项目中,配置文件中往往会包含数据库的用户名和密码等敏感信息。如果不加保护直接上传到Git仓库并对外网开放,后果不堪设想。本文将介绍如何使用Jasypt工具来加密这些敏感信息,从而提高项目的安全性。
Jasypt简介
Jasypt (Java Simplified Encryption) 是一个开源的Java加密工具库,旨在简化加密操作。通过使用Jasypt,我们可以轻松地对配置文件中的敏感信息进行加密和解密。
SpringBoot项目引入Jasypt
首先,在pom.xml
中添加Jasypt的依赖:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
加解密测试
接下来,我们编写一个简单的单元测试来验证Jasypt的加解密功能:
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.junit.jupiter.api.Test;
public class JasyptTest {
@Test
public void testEncryptionDecryption() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword("123456"); // 加密密码
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); // 加密算法
config.setKeyObtentionIterations("1000"); // 密钥获取迭代次数
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
String originalText = "hello ...";
String encryptedText = encryptor.encrypt(originalText);
System.out.println("加密后: " + encryptedText);
String decryptedText = encryptor.decrypt(encryptedText);
System.out.println("解密后: " + decryptedText);
}
}
运行测试,我们可以看到:
加密后: nOvch7+afYNA0xcbPQq1yzmK0yLj7GmCQR6YpVFH61IkMnTEULVgJz2b2yU3DKbs
解密后: hello ...
在SpringBoot中使用Jasypt
我们可以在Spring Boot项目中使用Jasypt来加密配置文件中的敏感信息。首先,将配置文件中的明文密码替换为加密后的密码,并使用ENC()
包装:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/scott?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: ENC(nOvch7+afYNA0xcbPQq1yzmK0yLj7GmCQR6YpVFH61IkMnTEULVgJz2b2yU3DKbs)
在启动项目时,需要通过启动参数传递加密密码:
-Djasypt.encryptor.password=123456
配置示例
在Spring Boot项目中,可以在application.yml
或application.properties
文件中配置Jasypt:
jasypt:
encryptor:
password: ${JASYPT_ENCRYPTOR_PASSWORD}
algorithm: PBEWITHHMACSHA512ANDAES_256
key-obtention-iterations: 1000
pool-size: 1
provider-name: SunJCE
salt-generator-classname: org.jasypt.salt.RandomSaltGenerator
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
string-output-type: base64
并确保在运行时通过环境变量提供加密密码,例如:
export JASYPT_ENCRYPTOR_PASSWORD=123456
原理解析
Jasypt在启动时,会扫描配置文件中的属性值,判断是否以ENC(
开头并以)
结尾。如果是,则提取出其中的密文,并使用提供的加密密码和配置进行解密,将解密后的明文值注入到对应的属性中。在代码中通过如@Value("${spring.datasource.password}")
方式获取的将是解密后的明文。
安全注意事项
- 密钥管理:加解密密码必须安全存储,建议通过环境变量或专门的密钥管理服务(如AWS KMS、Azure Key Vault等)来管理。
- 最小权限原则:确保应用仅拥有所需的最低权限,避免过高的数据库权限。
- 代码审计:定期对代码和配置进行审计,确保没有明文密码泄露。
通过以上方法,我们可以有效保护Spring Boot项目中的敏感信息,避免其在Git仓库中被暴露,提高项目的安全性。