Jasypt 为开发人员提供一种简单的方式来为项目增加加密功能,该技术可用于加密任务与应用程序,例如加密密码、敏感信息和数据通信、创建完整检查数据的sums. 其他性能包括高安全性、基于标准的加密技术、可同时单向和双向加密的加密密码、文本、数字和二进制文件。Jasypt也可以与Acegi Security整合也即Spring Security。Jasypt亦拥有加密应用配置的集成功能,而且提供一个开放的API从而任何一个Java Cryptography Extension都可以使用Jasypt。
Jasypt还符合RSA标准的基于密码的加密,并提供了无配置加密工具以及新的、高可配置标准的加密工具。
简单的说,就是在开发部署项目时,连接数据库的账号/密码赤果果的写在application.properties文件里面,人家一看就知道了,不安全,通过Jasypt加密后人家看到的是一串加密后的字符串,提高了一些敏感信息的的安全性。
首先引入依赖:
com.github.ulisesbocchio
jasypt-spring-boot-starter
2.1.0
然后在:bootstrap.yml 或者.properties 文件中指明Jasypt加密数据的加密盐:
(当然,jasypt加密方式,默认PBEWithMD5AndDES,可改PBEWithMD5AndTripleDES)
#设置jasypt加密配置
jasypt:
encryptor:
password: lj&92&jm
最后就是将你要加密的信息 在jasypt中通过你设置的加密盐加密后,配置到XXX.properties文件中:ENC(加密串)(上面指明了加密盐为:lj&92&jm)
例如:账号/密码:root/123456
cloud.cs1db.common.username=ENC(1NmCzZBAyJC9qgbE40v8ug==)
cloud.cs1db.common.password=ENC(Em39zu4mO5gW7fW4/NgsSg==)
在maven仓库中找到jasypt-1.9.2.jar包(我的地址是C:\Program Files\Java\maven\repository\org\jasypt\jasypt\1.9.2\jasypt-1.9.2.jar),这个包就是加密的包了
cmd 命令 cd到这个包的路径下,执行如下命令,它会返回你加密后的密码:
(因为我的加密盐为:lj&92&jm 有特殊字符"&",所以用""包起来了)
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="root" password="lj&92&jm" algorithm=PBEWithMD5AndDES
效果如下:
直接写个工具类:
/**
* Jasypt 加/解 密工具
*/
public class JasyptTool {
public static void main(String[] args) {
//加密工具
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
//加密配置
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm("PBEWithMD5AndDES");//加密方式,默认PBEWithMD5AndDES,可改PBEWithMD5AndTripleDES
config.setPassword("lj&92&jm");//加密所需的salt(盐)
//应用配置
encryptor.setConfig(config);
//加密
encryption(encryptor, "root");
//解密
decrypt(encryptor, "Lx2KkAQulcP98WHYA4zslQ==");
}
/**
* Jasypt加密 结果
* @param encryptor 加密工具
* @param plaintext 需要加密字符串
*/
public static void encryption(StandardPBEStringEncryptor encryptor, String plaintext){
//加密
String ciphertext=encryptor.encrypt(plaintext);
System.out.println(plaintext + " : " + ciphertext);
}
/**
* Jasypt解密 结果
* @param encryptor 解密工具
* @param ciphertext 需要解密字符串
*/
public static void decrypt(StandardPBEStringEncryptor encryptor, String ciphertext){
//解密
String plaintext=encryptor.decrypt(ciphertext);
System.out.println(ciphertext + " : " + plaintext);
}
}
效果如下:
为了防止salt(盐)泄露,反解出密码.可以在项目部署的时候使用命令传入salt(盐)值。
实际项目开发时,配置如下:
#设置jasypt加密配置
jasypt:
encryptor:
password: ${jasypt_encryptor_password:lj&92&jm}
开发正常启动,部署时打包成jar,启动时加入盐,按如下命令启动,但缺点是会话一关闭,程序就停止运行了
jasypt_encryptor_password="lj&92&jm" java -jar xxxx.jar
优化:需要以守护进程启动,例如写成:以后端进程的方式启动,将日志输出到nohup.log中
nohup jasypt_encryptor_password="lj&92&jm" java -jar xxxx.jar > nohup.log 2>&1 &
这样一来,生产上的加密盐通过命令输入,不存在配置文件中,就可以避免被人获取了。
......
结束!!!听说还有将salt(盐)配置在系统环境变量中的,大体上应该是如下套路,有兴趣的小伙伴可以实验下
打开/etc/profile文件
vim /etc/profile
文件末尾插入变量设置salt(盐)
export JASYPT_PASSWORD = XXX密码盐
编译
source /etc/profile
运行
java -jar -Djasypt_encryptor_password=${JASYPT_PASSWORD} xxx.jar