SpringBootdemo系列(九):Jasypt
1 概述
Jasypt是⼀个加密库,Github上有⼀个集成了Jasypt的Spring Boot库,叫jasypt-spring-boot,本⽂演⽰了如何使⽤该库对配置⽂件进⾏加密。
2 依赖
⾸先添加依赖:
springboot原理pdf<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
Gradle:
implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3")
3 简单加密
简单加密就是直接把加密⼝令(注意不是加密密码)以明⽂形式写在配置⽂件中,步骤如下:
配置⽂件配置加密⼝令
获取密⽂
替换明⽂
3.1 加密⼝令
在配置⽂件加上如下参数:
jasypt:
encryptor:
password: test
其中test就是加密的⼝令。
3.2 获取密⽂
⽐如配置⽂件需要加密的值如下:
test: value
在测试类对StringEncryptor进⾏注⼊并使⽤其中的encrypt加密通过@Value获取的值:
@SpringBootTest
class DemoApplicationTests {
@Autowired
private StringEncryptor encryptor;
@Value("${test}")
private String value;
@Test
void contextLoads() {
System.out.pt(value));
}
}
点击旁边的绿⾊⼩三⾓形即可运⾏,输出如下:
这个就是对应的密⽂。
3.3 替换明⽂
把密⽂加上前缀ENC(与后缀)替换明⽂:
test: ENC(IlEvyvcULhZJrHLDtPun2ut433RvAdpaNJ9IZt9uNUk3hDSKQsdOXLEkWyiK6QR3)
这样就完成了对属性test进⾏加密。
3.4 测试
直接通过@Value获取的值即为明⽂:
@SpringBootTest
class DemoApplicationTests {
@Autowired
private StringEncryptor encryptor;
@Value("${test}")
private String value;
@Test
void contextLoads() {
System.out.pt(value));
}
@Test
void decrypt()
{
System.out.println(value);
}
}
直接运⾏其中的decrypt即可输出明⽂。
4 ⾃定义加密
4.1 ⾃定义加密类
默认采⽤的加密算法为PBE算法,如果觉得不能符合要求可以⾃定义加密类。
⾃定义加密类实现StringEncrypto接⼝即可,需要在配置⽂件写上Bean的名称:
@Component
public class Encryptor implements StringEncryptor{
@Override
public String encrypt(String s) {
return s+"111";
}
@Override
public String decrypt(String s) {
return s.substring(0,s.indexOf("111"));
}
}
这⾥的加密很简单,直接在明⽂后⾯加上111,解密的话去掉111。另外在配置⽂件上写上Bean的名称:jasypt:
encryptor:
#    password: test
bean: encryptor
同时可以把⼝令注释掉,因为此时已经不需要使⽤⼝令进⾏加密了。
测试:
@SpringBootTest
class DemoApplicationTests {
@Autowired
private StringEncryptor encryptor;
@Value("${test}")
private String value;
@Test
void contextLoads() {
System.out.pt(value));
}
@Test
void decrypt()
{
System.out.println(encryptor.decrypt(value));
}
}
4.2 ⾮对称加密
⽣成公钥与私钥借助了⼯具类库Hutool,依赖如下:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-crypto</artifactId>
<version>5.4.3</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.66</version>
</dependency>
Gradle:
implementation("cn.hutool:hutool-crypto:5.4.3")
implementation("org.bouncycastle:bcprov-jdk15on:1.66")
⽣成公钥私钥:
KeyPair pair = ateKeyPair("RSA");
System.out.Encoder().Public().getEncoded()));
System.out.Encoder().Private().getEncoded()));
⽣成后添加到ptor.public-key-string与ptor.private-key-string:
jasypt:
encryptor:
#    password: test
#    bean: encryptor
public-key-string: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCZV5U0+Ck4AEpawUoiHOkG4ZNC6EeEvFZVCcyaIM0MiusGMM6ye9Z T6Ok756/vQsJbsYDGDtIDX82TsmYbZkN7QPuclABSL5SmaDYdJM/MeYKfMwrDb0lWARqF5ql9Rgol7Agq4ef8yQEbSmUDW/LQe+xXtCTer5MoJVi UHV56MwIDAQAB
private-key-string: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJlXlTT4KTgASlrBSiIc6Qbhk0LoR4S8VlUJzJogzQyK6wYwz rJ71lPo6Tvnr+9CwluxgMYO0gNfzZOyZhtmQ3tA+5yUAFIvlKZoNh0kz8x5gp8zCsNvSVYBGoXmqX1GCiXsCCrh5/zJARtKZQNb8tB77Fe0JN6vkyglW JQdXnozAgMBAAECgYA8syFCrwtt+ht00ne8ijIqQagP/6+z2PPZxL/DsUFJ+kGvmSlxGLlOTO/qgTuxG/2g22JsxFgY8tcHZMKrjO8f4TLKPsaFgX1OwN hJO4SoMlfUUAR9HSMv49vx5mOvh2QUrC5+4rIQI1Rm8zbKyAqCjHIKr8hA6bIKEHO2qXK05QJBANhAA+djwrr3orIIBTRp+H6/JChH76XtoQfcQyT+C
rEu/4tHVkbO2cEqcdKDScswHyTPu5UaSU2HFW/0Lj8Kg40CQQC1h1YMysd51djCf/Ud7L2sSIduy3DUSLc6XRX1IWAqxO+8gkvknDW7QztNES9Yqw YEkLNLAjp1v8Gq+o2JQKS/AkAENCpfQycz70BwaYuAW1cDT7/qMIvOE/J/bp63h2C51QoOsRJSSg8dnC+eQgMbOhJA6vDgkyQ9p5SZGowTmaa5A kEAneQAIZJC3KL3LX20ivm+pFpVijXjhpFU5avPjG4iQjEXQISoVEjWp3G747V91Aa1bkUZ3bUref13Cytw7h/O6wJBAJHNIHKKTAkmslguJU5hll1Hqrz yI9lcB5XqcgvdsxijUkZ95FThk6hNQuNV0sO/itUijQsJAtNdDITKmdcPMWg=
然后就可以像加密得到密⽂并替换明⽂了。
5 ⾮明⽂⼝令
对于ptor.password,可以使⽤⾮明⽂⼝令,这样⼝令的传递⽅式有三种:
通过命令⾏参数传递
通过应⽤环境变量传递
通过系统环境变量传递
5.1 通过命令⾏参数传递
⾸先先写上明⽂⼝令,得到密⽂:
jasypt:
encryptor:
password: test
test: value
加上前后缀替换明⽂后,去掉加密⼝令:
#jasypt:
#  encryptor:
#    password: test
test: ENC(quCu1b+Z7SPHmgVsmbkeyNZmNe1LJw+SxjmwwLjNaWoH/ce3r6iHGvaMN5eQcu0P)并在测试类的参数类加上
--ptor.password=test
由于这⾥是测试类命令⾏参数添加不了,但是在启动类是可以添加的:
这种⽅法就跳过演⽰了。
对于Gradle,测试的时候需要在adle.kts添加参数:
tasks.withType<Test> {
useJUnitPlatform()
jvmArgs("-ptor.password=test")
// 不能是jvmArgs("--ptor.password=test")
}
5.2 通过应⽤环境变量传递
和第⼀种⽅式差不多,第⼀种在Program arguments设置,⽽这种⽅法在VM options中设置:
-ptor.password=test
5.3 系统环境变量⽅式传递
通过系统环境变量⽅式传递ptor.password时,需要指定是哪⼀个环境变量:
jasypt:
encryptor:
password: ${ENCRYPT}
⽐如这⾥指定的是ENCRYPT环境变量,设置好环境变量后就可以直接加密解密了。
6 部署注意事项
6.1 打包
因为在配置⽂件中缺少了ptor.password,因此使⽤Maven打包时会出错:
在Maven打包配置中加上参数即可:
但是使⽤Gradle打包时不需要添加额外的参数。
6.2 部署
现在⼀般通过JAR直接部署即可,也就是通过
java -jar demo.jar
部署,这时候根据需要加上对应的参数即可,⽐如:
java -jar demo.jar --ptor.password=test
java -ptor.password=test -jar demo.jar
如果通过系统变量获取加密⼝令,请确保对应的环境变量存在。
另外,如果通过Docker部署,请在ENTRYPOINT加上对应参数,⽐如:
ENTRYPOINT ["java","-ptor.password=test","-jar","demo.jar"] ENTRYPOINT ["java","-jar","demo.jar",,"--ptor.password=test",]通过系统环境变量获取请加上ENV:
ENV ENCRYPT="test"
7 参考源码
Java版:
Kotlin版:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。