Jasypt是一个Java库,允许开发人员以很简单的方式添加基本加密功能,而无需深入研究加密原理。利用它可以实现高安全性的,基于标准的加密技术,无论是单向和双向加密。加密密码,文本,数字,二进制文件。
说了这么多,我们spring boot 配置管理到底用Jasypt做什么?
为了方便,简单编写了一个bat脚本方便使用。
@echo off
set/p input=待加密的明文字符串:
set/p password=加密密钥(盐值):
echo 加密中......
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI ^
input=%input% password=%password% ^
algorithm=PBEWithMD5AndDES
pause
注意:
jasypt-1.9.2.jar
文件需要和bat脚本放在相同目录下。此包可直接在示例项目中直接下载。
使用示例,双击上面的bat脚本文件,输入待加密内容和密钥,得到加密结果:
注意:相同的盐值(密钥),每次加密的结果是不同的。
/**
* 对family.father.name进行加密
*/
@Test
public void tes4(){
//加密解密对象:默认是被springboot集成过来了,引入包就可以用。
BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();
//加密所需的salt(盐)
basicTextEncryptor.setPassword("123456");
//对family.father.name进行加密
String s = basicTextEncryptor.encrypt("happy family");
System.out.println(s);
}
/**
* 对family.father.name进行加密
*/
@Test
public void tes5(){
//加密工具
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
//加密配置
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm("PBEWithMD5AndDES");//加密方式,默认PBEWithMD5AndDES,可改PBEWithMD5AndTripleDES
config.setPassword("123456");//加密所需的salt(盐)
//应用配置
encryptor.setConfig(config);
//对family.father.name进行加密
String s = encryptor.encrypt("zhoujinyuan");
System.out.println(s); //4R6l0dB4vAQtqmKO1L1Ywpl6YIsVKAwP
}
首先引入Jasypt的maven坐标
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
在properties或yml文件中需要对明文进行加密的地方使用ENC()包裹,如原值:"happy family",加密后使用ENC(密文)
替换。程序中像往常一样使用@Value("${}")
获取该配置即可,获取的是解密之后的明文值。
文本被加密之后,我们需要告知Spring Boot该如何解密,因为Spring Boot要读取该配置的明文内容。在application.properties或yml文件中,做如下配置:
# 设置盐值(加密解密密钥),我们配置在这里只是为了测试方便
# 生产环境中,切记不要这样直接进行设置,可通过环境变量、命令行等形式进行设置。下文会讲
jasypt:
encryptor:
password: 123456
EncryptionOperationNotPossibleException
代码没问题
后来发现引入的Jasypt包的版本和我的SpringBoot2.4.0最新版冲突
把Jasypt改成了2.1.1就可以用了
本身加解密过程都是通过盐值
进行处理的,所以正常情况下盐值
和加密串
是分开存储的。出于安全考量,盐值
应该放在系统属性
、命令行
或是环境变量
来使用,而不是放在同一个配置文件里面。
java -jar xxx.jar --jasypt.encryptor.password=xxx &;
设置环境变量(linux):
# 打开/etc/profile文件
vim /etc/profile
# 文件末尾插入
export JASYPT_PASSWORD = xxxx
启动命令:
java -jar xxx.jar --jasypt.encryptor.password=${JASYPT_PASSWORD} &;
有的同学会问这样的问题:如果的linux主机被攻陷了怎么办,黑客不就知道了密钥?
对于这个问题:我只能这么说,如果你的应用从内部被攻陷,在这个世界上没有一种加密方法是绝对安全的。这种加密方法只能做到:防君子不防小人。大家可能都听说过,某著名互联网公司将明文数据库密码上传到了github上面,导致用户信息被泄露的问题。这种加密方式,无非是将密钥与加密结果分开存放,减少个人疏忽导致的意外,增加破解难度。
如果密钥被从内部渗透暴露了,任何加密都是不安全的。就像你的组织内部有离心离德的人,无论你如何加密都不安全,你需要做的是把他找出来干掉,或者防范他加入你的组织!
原文:https://www.cnblogs.com/jinyuanya/p/13975457.html