2021.2.24 更新

1 概述

Jasypt是一个加密库,Github上有一个集成了JasyptSpring 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-stringjasypt.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的更多相关文章

  1. Spring Boot demo系列(二):简单三层架构Web应用

    2021.2.24 更新 1 概述 这是Spring Boot的第二个Demo,一个只有三层架构的极简Web应用,持久层使用的是MyBatis. 2 架构 一个最简单的Spring Boot Web应 ...

  2. Spring Boot demo系列(十):Redis缓存

    1 概述 本文演示了如何在Spring Boot中将Redis作为缓存使用,具体的内容包括: 环境搭建 项目搭建 测试 2 环境 Redis MySQL MyBatis Plus 3 Redis安装 ...

  3. Spring Boot demo系列(六):HTTPS

    2021.2.24 更新 1 概述 本文演示了如何给Spring Boot应用加上HTTPS的过程. 2 证书 虽然证书能自己生成,使用JDK自带的keytool即可,但是生产环境是不可能使用自己生成 ...

  4. Spring Boot demo系列(五):Docker部署

    2021.2.24 更新 1 概述 本文讲述了如何使用Docker部署Spring Boot应用,首先介绍了Docker的安装过程,接着介绍了Docker的一些基础知识,最后讲述了Dockerfile ...

  5. Spring Boot demo系列(四):Spring Web+Validation

    2021.2.24 更新 1 概述 本文主要讲述了如何使用Hibernate Validator以及@Valid/@Validate注解. 2 校验 对于一个普通的Spring Boot应用,经常可以 ...

  6. Spring Boot demo系列(一):Hello World

    2021.2.24 更新 1 新建工程 打开IDEA选择新建工程并选择Spring Initializer: 可以在Project JDK处选择JDK版本,下一步是选择包名,语言,构建工具以及打包工具 ...

  7. Spring Boot demo系列(三):Spring Web+MyBatis Plus

    2021.2.24 更新 1 概述 Spring Web+MyBatis Plus的一个Demo,内容和上一篇类似,因此重点放在MyBatis Plus这里. 2 dao层 MyBatis Plus相 ...

  8. Spring Boot demo系列(八):Swagger

    2021.2.24 更新 1 概述 Swagger主要用于生成API文档,本文演示了如何使用目前最新的OpenAPI3以及Swagger来进行接口文档的生成. 2 依赖 <dependency& ...

  9. 程序员DD 《Spring boot教程系列》补充

    最近在跟着程序员DD的Spring boot教程系列学习Spring boot,由于年代原因,Spring boot已经发生了一些变化,所以在这里进行一些补充. 补充的知识大多来自评论区,百度,Sta ...

随机推荐

  1. hadoop环境搭建:高可用

    目录 1.硬件配置 2.软件版本 3.准备工作 3.1.配置网络环境 3.2.安装JDK 3.3.安装ZOOKEEPER 4.安装Hadoop 5.启动 6.问题 7.配置文件 1.硬件配置 采用3台 ...

  2. JavaScriptBOM操作

    BOM(浏览器对象模型)主要用于管理浏览器窗口,它提供了大量独立的.可以与浏览器窗口进行互动的功能,这些功能与任何网页内容无关.浏览器窗口的window对象是BOM的顶层对象,其他对象都是该对象的子对 ...

  3. 5. vue常用高阶函数及综合案例

    一. 常用的数组的高阶函数 假设, 现在有一个数组, 我们要对数组做如下一些列操作 1. 找出小于100的数字: 2. 将小于100的数字, 全部乘以2: 3. 在2的基础上, 对所有数求和: 通常我 ...

  4. 详细探秘Linux 和 Window 双系统访问Windows 磁盘需要输入密码问题解决过程分析

    将要讲很多的内容真正产生作用的配置就只有下面这一句而已.如果你只是想要解决问题看这一句就行了,后面都没有必要在看下去了. 将allow-active标签中的auth_admin_keep 改为 yes ...

  5. 微信小程序(七)-项目实例(原生框架 MINA转云开发)==02-云开发-配置

    云开发:1.就是用云函数的型式来使用云存储和云数据库完成各种操作!     2.只关注调什么函数,完成什么功能即可,无需关心HTTP请求哪一套!     3.此模式不代表没有服务器,只是部署在云环境中 ...

  6. SpringCloud Sleuth

    1.定义 Sleuth(分布式请求链路跟踪):提供了一套完整的服务跟踪解决方案,也兼容zipkin. 参考网址:https://github.com/spring-cloud/spring-cloud ...

  7. 实现 Abp Vnext Pro

    Abp Vnext Pro 的 Vue 实现版本 开箱即用的中后台前端/设计解决方案 知识点 .Net Core5.0 Abp Vnext 4.x , Ant Design, Vue2.x Mysql ...

  8. 剑指 Offer 60. n个骰子的点数 + 动态规划 + 空间优化

    剑指 Offer 60. n个骰子的点数 Offer_60 题目详情 题解分析 package com.walegarrett.offer; /** * @Author WaleGarrett * @ ...

  9. CCF(消息传递口:80分):字符串相关+队列

    消息传递口 201903-4 本题主要是利用队列进行模拟,因为一开始我没有注意到要按照顺序,所以一开始的解法错误. #include<iostream> #include<algor ...

  10. jquery ajax error 函数的参数及使用

    使用jquery的ajax方法向服务器发送请求的时候,可选的回调函数有success.complete.beforeSend.error函数等.error函数常用来进行错误信息的处理,这里着重提一下e ...