一、Jasypt加密介绍
为什么要使用Jasypt加密?
Jasypt是一个专门用于为属性文件中的属性提供加密功能的工具。在应用程序开发中,我们通常需要在配置文件中存储一些敏感信息,如数据库密码等。若这些信息被不良分子窃取,将会带来严重的安全风险。
同时,源代码中的明文密码也无法通过第三方机构的安全缺陷检测。因此,使用Jasypt可以有效地保护敏感信息的安全性,使得应用程序能够自动解密并获取原始值。
二、SpringBoot集成步骤
2.1 使用Jasypt-Spring-Boot-Starter依赖 在项目的配置文件(例如Maven的pom.xml)中添加以下依赖:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
2.2 启动类添加注解 在启动类上添加@EnableEncryptableProperties注解,以启用对配置文件中加密属性的支持。
@EnableEncryptableProperties
@SpringBootApplication
public class YourApplication {
// ...
}
2.3 配置文件修改 将【秘钥】添加到配置文件中,应用程序启动时会自动解密。
properties文件版本:
jasypt.encryptor.password=秘钥
yml文件版本:
jasypt:
encryptor:
password: 秘钥
加密函数示例:
public class JasyptUtil {
public static void main(String[] args) {
// 秘钥【注意:加密使用秘钥必须与配置文件秘钥一致】
String secretKey = "your-secret-key";
// 明文密码【配置文件中待加密的明文密码】
String plainPassplainword = "your-plain-password";
// 创建加密对象,默认加密算法为PBEWithMD5AndDES
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
// 设置加密所需的秘钥
textEncryptor.setPassword(secretKey);
// 加密后的密文【使用方法:将结果在配置文件密码处替换为ENC(密文);ENC()为固定默认写法,也可以配置指定的前后缀】
String encryptedPassword = textEncryptor.encrypt(plainPassword);
// 将密文解密后的结果
String decryptedPassword = textEncryptor.decrypt(encryptedPassword);
System.out.println("明文密码: " + plainPassplainword);
System.out.println("加密后(将该结果复制到配置文件): " + encryptedPassword);
System.out.println("密文解密后: " + decryptedPassword);
}
}
2.4 使用示例:
redis:
host: 127.0.0.1
port: 6379
# 将ENC()中内容替换为JasyptUtil加密后的秘文
password: ENC(NpZrUS9IHvykNTeiYm59XqcaSdJFR4im)
2.5 拓展:自定义秘文属性值的前后缀
配置:
jasypt:
encryptor:
property:
# 设置指定前缀
prefix: "ENC@["
# 设置指定后缀
suffix: "]"
# Jasypt 加密器的密码
password: sxgw
使用示例:
redis:
host: 127.0.0.1
port: 6379
password: ENC@[NpZrUS9IHvykNTeiYm59XqcaSdJFR4im]
2.6 如何管理秘钥?
按照上面的方法,将秘钥显示的写在配置文件中,在三方检测机构进行安全缺陷检查时候,扫描到明文密码同样认为检测不合格,因为知道密钥之后任然可以进行解密轻松得到具体密码。
那么有两种方式可以解决,一是将密钥在代码中进行配置(当然这同样是在代码中显示体现密码,本质上同样不安全,仅仅是为了三方检测通过),因此更推荐第二种方式,在应用程序部署时通过变量传入。
2.6.1 在应用程序启动时在代码中设置默认属性(在启动类进行配置)
@SpringBootApplication
@EnableEncryptableProperties// 启用对配置文件中加密属性的支持
public class BusinessApplication {
public static void main( String[] args ) {
// 创建SpringApplication实例
SpringApplication app = new SpringApplication(BusinessApplication.class);
// 创建默认属性的Map对象
Map<String, Object> defaultProperties = new HashMap<>();
// 设置jasypt加密器的秘钥为"sxgw"
defaultProperties.put("jasypt.encryptor.password", "sxgw");
// 设置应用程序的默认属性
app.setDefaultProperties(defaultProperties);
// 运行应用程序
app.run(args);
}
}
2.6.2 在应用程序部署时通过变量传入
方式一:java -Djasypt.encryptor.password=密钥 -jar xxx.jar
该命令使用Java虚拟机(JVM)的系统属性来传递秘钥。通过-D参数,设置系统属性的值。此处使用jasypt.encryptor.password作为系统属性名,秘钥作为属性值。
方式二:java -jar xxx.jar --jasypt.encryptor.password=密钥
该命令使用SpringBoot的命令行参数来传递秘钥。通过–前缀,指定命令行参数的名称和值。此处使用jasypt.encryptor.password作为命令行参数名,秘钥作为参数值。
无论选择哪种方式,都可以在应用程序启动时将密钥作为变量传递给应用程序。
请注意,秘钥(secretKey)的保密非常重要,因此建议不要将其放在代码或配置文件中。建议使用安全方法管理密钥,如环境变量或部署时通过变量传入。
通过以上步骤,SpringBoot应用程序将成功集成Jasypt,并能够安全地使用加密后的敏感信息,将极大提升应用程序的安全性和可靠性。