Spring Boot demo系列(九):Jasypt
2021.2.24 更新
1 概述
Jasypt
是一个加密库,Github
上有一个集成了Jasypt
的Spring Boot
库,叫jasypt-spring-boot
,本文演示了如何使用该库对配置文件进行加密。
2 依赖
首先添加依赖:
<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.println(encryptor.encrypt(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.println(encryptor.encrypt(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.println(encryptor.encrypt(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 = SecureUtil.generateKeyPair("RSA");
System.out.println(Base64.getEncoder().encodeToString(pair.getPublic().getEncoded()));
System.out.println(Base64.getEncoder().encodeToString(pair.getPrivate().getEncoded()));
生成后添加到jasypt.encryptor.public-key-string
与jasypt.encryptor.private-key-string
:
jasypt:
encryptor:
# password: test
# bean: encryptor
public-key-string: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCZV5U0+Ck4AEpawUoiHOkG4ZNC6EeEvFZVCcyaIM0MiusGMM6ye9ZT6Ok756/vQsJbsYDGDtIDX82TsmYbZkN7QPuclABSL5SmaDYdJM/MeYKfMwrDb0lWARqF5ql9Rgol7Agq4ef8yQEbSmUDW/LQe+xXtCTer5MoJViUHV56MwIDAQAB
private-key-string: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJlXlTT4KTgASlrBSiIc6Qbhk0LoR4S8VlUJzJogzQyK6wYwzrJ71lPo6Tvnr+9CwluxgMYO0gNfzZOyZhtmQ3tA+5yUAFIvlKZoNh0kz8x5gp8zCsNvSVYBGoXmqX1GCiXsCCrh5/zJARtKZQNb8tB77Fe0JN6vkyglWJQdXnozAgMBAAECgYA8syFCrwtt+ht00ne8ijIqQagP/6+z2PPZxL/DsUFJ+kGvmSlxGLlOTO/qgTuxG/2g22JsxFgY8tcHZMKrjO8f4TLKPsaFgX1OwNhJO4SoMlfUUAR9HSMv49vx5mOvh2QUrC5+4rIQI1Rm8zbKyAqCjHIKr8hA6bIKEHO2qXK05QJBANhAA+djwrr3orIIBTRp+H6/JChH76XtoQfcQyT+CrEu/4tHVkbO2cEqcdKDScswHyTPu5UaSU2HFW/0Lj8Kg40CQQC1h1YMysd51djCf/Ud7L2sSIduy3DUSLc6XRX1IWAqxO+8gkvknDW7QztNES9YqwYEkLNLAjp1v8Gq+o2JQKS/AkAENCpfQycz70BwaYuAW1cDT7/qMIvOE/J/bp63h2C51QoOsRJSSg8dnC+eQgMbOhJA6vDgkyQ9p5SZGowTmaa5AkEAneQAIZJC3KL3LX20ivm+pFpVijXjhpFU5avPjG4iQjEXQISoVEjWp3G747V91Aa1bkUZ3bUref13Cytw7h/O6wJBAJHNIHKKTAkmslguJU5hll1HqrzyI9lcB5XqcgvdsxijUkZ95FThk6hNQuNV0sO/itUijQsJAtNdDITKmdcPMWg=
然后就可以像加密得到密文并替换明文了。
5 非明文口令
对于jasypt.encryptor.password
,可以使用非明文口令,这样口令的传递方式有三种:
- 通过命令行参数传递
- 通过应用环境变量传递
- 通过系统环境变量传递
5.1 通过命令行参数传递
首先先写上明文口令,得到密文:
jasypt:
encryptor:
password: test
test: value
加上前后缀替换明文后,去掉加密口令:
#jasypt:
# encryptor:
# password: test
test: ENC(quCu1b+Z7SPHmgVsmbkeyNZmNe1LJw+SxjmwwLjNaWoH/ce3r6iHGvaMN5eQcu0P)
并在测试类的参数类加上
--jasypt.encryptor.password=test
由于这里是测试类命令行参数添加不了,但是在启动类是可以添加的:
这种方法就跳过演示了。
对于Gradle
,测试的时候需要在build.gradle
/build.gradle.kts
添加参数:
tasks.withType<Test> {
useJUnitPlatform()
jvmArgs("-Djasypt.encryptor.password=test")
// 不能是jvmArgs("--jasypt.encryptor.password=test")
}
5.2 通过应用环境变量传递
和第一种方式差不多,第一种在Program arguments
设置,而这种方法在VM options
中设置:
-Djasypt.encryptor.password=test
5.3 系统环境变量方式传递
通过系统环境变量方式传递jasypt.encryptor.password
时,需要指定是哪一个环境变量:
jasypt:
encryptor:
password: ${ENCRYPT}
比如这里指定的是ENCRYPT
环境变量,设置好环境变量后就可以直接加密解密了。
6 部署注意事项
6.1 打包
因为在配置文件中缺少了jasypt.encryptor.password
,因此使用Maven
打包时会出错:
在Maven
打包配置中加上参数即可:
但是使用Gradle
打包时不需要添加额外的参数。
6.2 部署
现在一般通过JAR
直接部署即可,也就是通过
java -jar demo.jar
部署,这时候根据需要加上对应的参数即可,比如:
java -jar demo.jar --jasypt.encryptor.password=test
java -Djasypt.encryptor.password=test -jar demo.jar
如果通过系统变量获取加密口令,请确保对应的环境变量存在。
另外,如果通过Docker
部署,请在ENTRYPOINT
加上对应参数,比如:
ENTRYPOINT ["java","-Djasypt.encryptor.password=test","-jar","demo.jar"]
ENTRYPOINT ["java","-jar","demo.jar",,"--jasypt.encryptor.password=test",]
通过系统环境变量获取请加上ENV
:
ENV ENCRYPT="test"
7 参考源码
Java
版:
Kotlin
版:
Spring Boot demo系列(九):Jasypt的更多相关文章
- Spring Boot demo系列(二):简单三层架构Web应用
2021.2.24 更新 1 概述 这是Spring Boot的第二个Demo,一个只有三层架构的极简Web应用,持久层使用的是MyBatis. 2 架构 一个最简单的Spring Boot Web应 ...
- Spring Boot demo系列(十):Redis缓存
1 概述 本文演示了如何在Spring Boot中将Redis作为缓存使用,具体的内容包括: 环境搭建 项目搭建 测试 2 环境 Redis MySQL MyBatis Plus 3 Redis安装 ...
- Spring Boot demo系列(六):HTTPS
2021.2.24 更新 1 概述 本文演示了如何给Spring Boot应用加上HTTPS的过程. 2 证书 虽然证书能自己生成,使用JDK自带的keytool即可,但是生产环境是不可能使用自己生成 ...
- Spring Boot demo系列(五):Docker部署
2021.2.24 更新 1 概述 本文讲述了如何使用Docker部署Spring Boot应用,首先介绍了Docker的安装过程,接着介绍了Docker的一些基础知识,最后讲述了Dockerfile ...
- Spring Boot demo系列(四):Spring Web+Validation
2021.2.24 更新 1 概述 本文主要讲述了如何使用Hibernate Validator以及@Valid/@Validate注解. 2 校验 对于一个普通的Spring Boot应用,经常可以 ...
- Spring Boot demo系列(一):Hello World
2021.2.24 更新 1 新建工程 打开IDEA选择新建工程并选择Spring Initializer: 可以在Project JDK处选择JDK版本,下一步是选择包名,语言,构建工具以及打包工具 ...
- Spring Boot demo系列(三):Spring Web+MyBatis Plus
2021.2.24 更新 1 概述 Spring Web+MyBatis Plus的一个Demo,内容和上一篇类似,因此重点放在MyBatis Plus这里. 2 dao层 MyBatis Plus相 ...
- Spring Boot demo系列(八):Swagger
2021.2.24 更新 1 概述 Swagger主要用于生成API文档,本文演示了如何使用目前最新的OpenAPI3以及Swagger来进行接口文档的生成. 2 依赖 <dependency& ...
- 程序员DD 《Spring boot教程系列》补充
最近在跟着程序员DD的Spring boot教程系列学习Spring boot,由于年代原因,Spring boot已经发生了一些变化,所以在这里进行一些补充. 补充的知识大多来自评论区,百度,Sta ...
随机推荐
- C++算法代码——关于马的问题
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1285 题目描述 小R参加一个派对,这个派队的参加者需要带上四匹颜色不同的马.小R目前 ...
- 官网GitLab CI/CD英文文档翻译
在查阅GitLab官网的CI/CD功能说明时,全是英文看起来不方便,通过翻译软件自动翻译后"内容失真",看起来很变扭.查阅了百度上的资料发现很多翻译很老旧,有些甚至是挂羊头卖狗肉. ...
- 后端程序员之路 25、Redis Cluster
官方教程和功能介绍: REDIS cluster-tutorial -- Redis中文资料站 -- Redis中国用户组(CRUG)http://www.redis.cn/topics/cluste ...
- 后端程序员之路 23、一个c++的api framework
在"21.一个cgi的c++封装"中,我们封装了cgi,在这之上,我们可以再来封装一个webapi的framework.当然,前文的Casablanca是个不错的选择,但是它比较庞 ...
- jquery ajax error 函数的参数及使用
使用jquery的ajax方法向服务器发送请求的时候,可选的回调函数有success.complete.beforeSend.error函数等.error函数常用来进行错误信息的处理,这里着重提一下e ...
- 【资源下载】Linux下的Hi3861一站式鸿蒙开发烧录(附工具)
下载附件 2021春节前夕,华为发布了 HUAWEI DevEco Device Tool 2.0 Beta1,整体提供了异常强大的功能.得知消息后,我在第一时间带着无比兴奋的心情下载尝鲜,但结果却是 ...
- 《Asp.Net Core3 + Vue3入坑教程》 - Vue 1.使用vue-cli创建vue项目
简介 <Asp.Net Core3 + Vue3入坑教程> 此教程适合新手入门或者前后端分离尝试者.可以根据图文一步一步进操作编码也可以选择直接查看源码.每一篇文章都有对应的源码 目录 & ...
- SQL-MYSQL的时间格式转换(持续补充)
======================SQLSERVER===================================== SELECT CONVERT(varchar(100), GE ...
- 确保某个BeanDefinitionRegistryPostProcessor Bean被最后执行的几种实现方式
目录 一.事出有因 二.解决方案困境 三.柳暗花明,终级解决方案 第一种实现方案 第二种实现方案 第三种实现方案 四.引发的思考 一.事出有因 最近有一个场景,因同一个项目中不同JAR包依赖同一个 ...
- java基础详解-集合
一.集合组成 java集合主要由Map和Collection组成,Collection主要类图如下(图片来源于网络,懒得画图): 从上图中能很明显的看出来Collection下主要是Set.List和 ...