本文介绍了SpringBoot下使用Jasypt对属性进行加密,其中密文的获取使用工具类而非终端的方式.
项目github地址为:https://github.com/ulisesbocchio/jasypt-spring-boot
一. 集成jasypt
集成jasypt主要有以下三种方式
1. 直接加依赖
项目中使用了@SpringBootApplication或@EnableAutoConfiguration注解,则直接加入以下依赖即可.(任何系统属性,环境属性,命令行参数,application.properties,yaml属性和任何其他自定义属性源可以包含加密属性)
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
2. 使用全局启用注解
我个人更偏向这种风格.在SpringBoot启动类添加功能的全局启用注解,这样方便以后看启用了哪些功能,如果是添加在pom文件以后很难留意到的.(任何系统属性,环境属性,命令行参数,application.properties,yaml属性和任何其他自定义属性源可以包含加密属性)
先添加以下依赖(注意和第一种方式的依赖不一样)
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot</artifactId>
<version>2.1.0</version>
</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