一、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,并能够安全地使用加密后的敏感信息,将极大提升应用程序的安全性和可靠性。