本文共 4070 字,大约阅读时间需要 13 分钟。
在软件开发中,数据安全性一直是核心关注点。尤其是在配置管理方面,如何保护敏感信息而不影响系统运行,成为开发者面临的重要挑战。Jasypt(Java Simplified YAML Properties)等工具为我们提供了一种灵活且高效的解决方案。以下将详细介绍如何在 Spring Boot 项目中使用 Jasypt 来加密配置,并分享实际应用中的经验总结。
首先,我们需要将 Jasypt 的相关依赖引入到项目中。以下是 Maven 项目中配置的示例:
com.github.ulisesbocchio jasypt-spring-boot-starter 3.0.3
Jasypt 提供了三种主要方式来生成加密字符串,每种方式都有其适用的场景。
可以通过编写简单的 Java 类来调用 Jasypt 的 API 来实现加密。以下是一个典型的实现示例:
public class EncryptionUtil { private static final BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); public static String encrypt(String plaintext) { textEncryptor.setPassword("ADUMDFUOV7834*"); return textEncryptor.encrypt(plaintext); }} 调用方法如下:
String encryptedUsername = EncryptionUtil.encrypt("test");String encryptedPassword = EncryptionUtil.encrypt("123"); 输出示例:
username: yB0xTBF7SimOMLKlD7b3WA==password: NTT9dRodj5y6o+Ppq1rFsQ==
如果你不想在代码中直接使用 API,可以使用命令行工具来实现加密。以下是执行 JAR 的命令示例:
java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \ -password="ADUMDFUOV7834*" \ -algorithm=PBEWithMD5AndDES \ input=test
输出示例:
----ENVIRONMENT-----------------Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.231-b11----ARGUMENTS-------------------input: testalgorithm: PBEWithMD5AndDESpassword: ADUMDFUOV7834*----OUTPUT----------------------y7lANzmle3mXD2aiComkww==
需要注意的是,使用命令行工具加密的结果与 API 获取的结果有一些差异,但无论哪种方式,解密时都需要提供相同的密钥才能恢复原始数据。
在 Maven 项目中,可以通过配置插件来实现自动化加密。以下是一个典型的 Maven 配置示例:
com.github.ulisesbocchio jasypt-maven-plugin 3.0.3 src/main/resources/application.yml
在 application.yml 文件中,使用 DEC() 标签包裹需要加密的配置项,例如:
spring: datasource: username: DEC(test) password: DEC(123456) redis: password: DEC(123)
执行命令:
mvn jasypt:encrypt -Djasypt.encryptor.password="ADUMDFUOV7834*"
执行成功后,application.yml 文件中的敏感信息会被自动加密,并且加密后的配置值前缀会变为 ENC()。
加密后的示例:
spring: datasource: username: ENC(qU0YwDQ3Y+X8tyuw/HPJlUsCKgMj7Zk0F+z/9tCNNMPLsSD506TM/I8U9VyXGWN0) password: ENC(du4D62bhnGX8vcFQkamwfn/VzDLPwkmxWn4A1wyWu/e6pM0HfrOBc7lqd/vVGUEo) redis: password: ENC(8yn4z61PwOJTXrpVx+iQVmJbsuNEQGLFVf5TDcnKKzsge4rmInCPMKUfqIIotyGc)
为了确保加密和解密过程的正确性,可以通过编写简单的 REST 控制器来验证加密后的数据是否能够准确解密。以下是一个典型的控制器实现:
@RestControllerpublic class TestController { @Value("${spring.datasource.password}") private String databaseUsername; @Value("${spring.datasource.username}") private String databasePassword; @GetMapping("/getDatabaseInfo") public String getDatabaseInfo() { return "username: " + databaseUsername + ", password: " + databasePassword; }} 在加密之前,配置文件中可能会显示如下内容:
spring: datasource: username: test password: 123456
加密后,配置文件会变为:
spring: datasource: username: ENC(qU0YwDQ3Y+X8tyuw/HPJlUsCKgMj7Zk0F+z/9tCNNMPLsSD506TM/I8U9VyXGWN0) password: ENC(du4D62bhnGX8vcFQkamwfn/VzDLPwkmxWn4A1wyWu/e6pM0HfrOBc7lqd/vVGUEo)
为了确保解密过程能够正常运行,需要在 application.yml 文件中添加如下配置:
jasypt: encryptor: password: ADUMDFUOV7834*
重新启动项目后,你可以通过浏览器访问 localhost:8080/getDatabaseInfo 来验证加密解密是否正确。期望的输出结果为:
username: test, password: 123456
在实际生产环境中,Jasypt 的优势更加明显。只需要引入依赖,对需要加密的配置项进行简单标记,Jasypt 会自动完成加密和解密过程。
密钥应妥善管理,避免泄露。通过将密钥与加密后的配置分开存储,可以实现类似“锁与钥匙分开存放”的效果,确保即使有人获取到密钥,也无法单独解密出配置信息。
启动命令传递:可以通过 Java 应用的启动命令来传递密钥。
java -jar demo.jar --Djasypt.encryptor.password="ADUMDFUOV7834*"
环境变量传递:通过 shell 脚本传递密钥。
#!/bin/bash export ENCRYPTOR_PASSWORD=ADUMDFUOV7834* java -jar -Djasypt.encryptor.password=$ENCRYPTOR_PASSWORD
通过以上方法,可以确保在不同环境中使用不同的密钥,从而实现配置信息的安全性管理。## 总结Jasypt 在 Spring Boot 项目中的应用提供了一种灵活且安全的配置加密方式。通过合理配置依赖和插件,可以轻松实现敏感信息的加密与解密,同时密钥管理的实现也为配置信息的安全性提供了有力保障。在实际应用中,可以根据项目需求选择最适合的加密方式,并妥善管理密钥配置,确保系统运行的安全性与稳定性。
转载地址:http://vxqfk.baihongyu.com/