SpringBoot下使用Jasypt工具类加密属性配置

本文介绍了SpringBoot下使用Jasypt对属性进行加密,其中密文的获取使用工具类而非终端的方式.

项目github地址为:https://github.com/ulisesbocchio/jasypt-spring-boot

一. 集成jasypt

集成jasypt主要有以下三种方式

1. 直接加依赖

项目中使用了@SpringBootApplication@EnableAutoConfiguration注解,则直接加入以下依赖即可.(任何系统属性,环境属性,命令行参数,application.properties,yaml属性和任何其他自定义属性源可以包含加密属性)

<dependency>
        <groupId>com.github.ulisesbocchiogroupId>
        <artifactId>jasypt-spring-boot-starterartifactId>
        <version>2.1.0version>
dependency>

2. 使用全局启用注解

我个人更偏向这种风格.在SpringBoot启动类添加功能的全局启用注解,这样方便以后看启用了哪些功能,如果是添加在pom文件以后很难留意到的.(任何系统属性,环境属性,命令行参数,application.properties,yaml属性和任何其他自定义属性源可以包含加密属性)
先添加以下依赖(注意和第一种方式的依赖不一样)

<dependency>
        <groupId>com.github.ulisesbocchiogroupId>
        <artifactId>jasypt-spring-bootartifactId>
        <version>2.1.0version>
dependency>

然后在SpringBoot启动类添加注解:@EnableEncryptableProperties

3. 使用局部启用注解

如果加密属性只存在于少数properties或yaml文件,不需要Jasypt对全局生效,则可用这种方法.
这个和第二种方式依赖是一样的,只是把@EnableEncryptableProperties换成了@EncryptablePropertySource,使用方法如下

@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class MyApplication {
    ...
}

    @Configuration
    @EncryptablePropertySources({@EncryptablePropertySource("classpath:encrypted.properties"),
                                 @EncryptablePropertySource("classpath:encrypted2.properties")})
    public class MyApplication {
        ...
    }

二. 编写工具类

代码如下,这里使用的单例参考自单例模式及其4种推荐写法和3类保护手段,核心是jasyptStatelessService类的encrypt方法.使用时可以直接利用main方法获取加密后的数据,而不需要像其他教程一样特地打开命令行.

/**
 * @version V1.0
 * @author: lin_shen
 * @date: 2018/9/16
 * @Description: Jasypt加密工具类
 */

public enum  JasyptEncryptUtil {
    /**
     * 唯一实例,使工具类单例化
     */
    INSTANCE;

    private static JasyptStatelessService jasyptStatelessService=new JasyptStatelessService();

    public static String encrypt(String input,String password,String algorithm){
        return jasyptStatelessService.encrypt(input,password,null,null,algorithm,null,null,null,null,
                null,null,null,null,null,null,
                null,null,null,null,null,null,null);
    }

    /**
     * 使用默认加密算法:PBEWithMD5AndDES
     * @param input 要加密的内容
     * @param password 密钥
     * @return
     */
    public static String encrypt(String input,String password){
        return encrypt(input,password,"PBEWithMD5AndDES");
    }

    public static void main(String[] args){
        System.out.println(encrypt("",""));
    }

}

三. 配置jasypt

1. 自定义前缀后缀

用上面的工具类获得密文后需要用前缀+密文+后缀的形式包围起来,前缀和后缀都可以自定义,如下(最终应如LIN@[密文]),

jasypt:
  encryptor:
    property:
      prefix: "LIN@["
      suffix: "]"

2. 利用环境变量配置JASYPT_ENCRYPTOR_PASSWORD

application.yml文件中添加如下配置

jasypt:
  encryptor:
    password: ${JASYPT_ENCRYPTOR_PASSWORD:}

可以使用如下方式在启动springboot 的jar包时将特定环境变量传递进去(配置环境变量的方式很多,命令行只是其中一种,不要跟下面讲的命令行指定参数混淆)

JASYPT_ENCRYPTOR_PASSWORD=password java -jar target/jasypt-spring-boot-demo-1.5-SNAPSHOT.jar

3. 利用命令行参数配置jasypt.encryptor.password

注意,这种方法不需要在yaml或者properties文件中再配置jasypt.encryptor.password了
将传递加密密码作为命令行参数运行如下:

java -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password

java -Djasypt.encryptor.password=password -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar

你可能感兴趣的:(SpringBoot)