使用jasypt加密配置文件信息
我们的配置文件中,其实包含着大量与安全相关的敏感信息,例如数据库的账号密码、一些服务的密钥等。而这些信息一旦泄露,对于企业的重要数据资产是相当危险的。 所以对于这些配置文件中存在的敏感信息进行加密,是每个成熟开发团队都一定会去的事。
下面通过使用Jasypt来加密配置信息:https://github.com/ulisesbocchio/jasypt-spring-boot
Jasypt是一个Java库,可以方便地对Spring Boot应用中的敏感配置信息进行加密。
一.Springboot项目的配置信息加密:
1. 添加依赖
首先在项目的pom.xml
中添加Jasypt依赖:
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version> <!-- 使用最新版本 -->
</dependency>
然后再插件中加入:
<plugin><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-maven-plugin</artifactId><version>3.0.3</version>
</plugin>
2. 生成加密值
使用Jasypt工具类生成加密后的值:
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;public class JasyptEncryptor {public static void main(String[] args) {StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();encryptor.setPassword("mySecretKey123!"); // 设置加密密钥encryptor.setAlgorithm("PBEWithMD5AndDES");// 加密用户名String encryptedUsername = encryptor.encrypt("admin");System.out.println("Encrypted username: ENC(" + encryptedUsername + ")");// 加密密码String encryptedPassword = encryptor.encrypt("secret123");System.out.println("Encrypted password: ENC(" + encryptedPassword + ")");}
}
假设输出:
Encrypted username: ENC(4B5A6C8D9E0F1G2H3I4J5K6L7M8N9O0P)
Encrypted password: ENC(1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P)
3. 配置加密值
将加密后的值放入application.properties
。
在application.properties
或application.yml
中,使用ENC()
包裹加密后的值:
# 未加密的普通配置
app.name=MyApp# 加密的数据库配置
db.url=jdbc:mysql://localhost:3306/mydb
db.username=ENC(4B5A6C8D9E0F1G2H3I4J5K6L7M8N9O0P)
db.password=ENC(1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P)
Spring会自动解密这些值,可以像使用普通配置一样使用它们:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class DatabaseConfig {@Value("${db.url}")private String url;@Value("${db.username}")private String username;@Value("${db.password}")private String password;public void printConfig() {System.out.println("Database URL: " + url);System.out.println("Database Username: " + username); // 自动解密System.out.println("Database Password: " + password); // 自动解密}
}
4. 配置加密密钥
有几种方式配置加密密钥:
方式1:直接写在配置文件中
jasypt.encryptor.password=your-secret-key
方式2:通过环境变量
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD:}
然后在启动时传入环境变量:
export JASYPT_ENCRYPTOR_PASSWORD=your-secret-key
java -jar your-app.jar
方式3:通过命令行参数(推荐)
java -jar your-app.jar --jasypt.encryptor.password=your-secret-key
二.SpringCloud项目分布式配置中心的加密解密:
Spring Cloud Config提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。
{cipher}
前缀是Spring Cloud Config Server的加密标识,后面跟随的是 AES加密后的十六进制字符串(64位字符)
比如下面的例子:
spring.datasource.username=eleven
spring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b
但是我们需要进行以下操作:
配置加密密钥:
# application.properties
encrypt.key=my-secret-key-123 # 必须与加密时使用的密钥一致
server.port=8888
测试解密:
curl -X POST http://localhost:8888/decrypt \-d "dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b"
下面我们演示如何加密密码:
创建Config Server:
<!-- pom.xml 添加依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>
启动Config Server:
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}
}
启动Config Server后加密新密码:
curl -X POST http://localhost:8888/encrypt -d "你的新密码"
# 返回类似:dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b
将加密结果存入配置
spring.datasource.password={cipher}新生成的加密字符串
通过环境变量传入密钥:
# 启动Config Server时
export ENCRYPT_KEY=my-secret-key-123
java -jar config-server.jar
或在启动命令中指定:
java -jar config-server.jar \--encrypt.key=my-secret-key-123