开发环境
- Ruoyi-Vue-Plus 5.1.2(Spring Boot 3.1.7)
- jasypt 3.0.5
进入依赖
项目的根pom.xml
项目的根 pom.xml 文件中,添加同一版本管理
<properties>
<!--配置文件参数加密-->
<jasypt.version>3.0.5</jasypt.version>
</properties>
<!-- 依赖声明 -->
<dependencyManagement>
<dependencies>
<!-- 其他依赖配置 -->
<!--配置文件参数加密-->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>${jasypt.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
ruoyi-admin 模块的 pom.xml
ruoyi-admin 模块的 pom.xml 中引入依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
</dependency>
application.yml 配置
注意:如果在 application.yml 中没有配置对应的属性,将使用默认值,比如algorithm默认值为PBEWITHHMACSHA512ANDAES_256,saltGeneratorClassname默认值是org.jasypt.salt.RandomSaltGenerator,property中的默认前后缀为ENC( 和 ) 等。
在 ruoyi-admin 模块的 application.yml 文件中配置如下:
--- # jasypt 配置(这是JDK17下的配置)
jasypt:
encryptor:
# 加密的秘钥
password: abc123456
# 加密算法 jasypt3.0后,默认算法为 PBEWITHHMACSHA512ANDAES_256,需要JDK9以上或者 添加JCE(Java Cryptography Extension 无限强度权限策略文件)支持
algorithm: PBEWITHHMACSHA512ANDAES_256
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
property:
# 算法识别的前后缀,默认ENC(),包含在前后缀的加密信息,会使用指定算法解密
prefix: ENC(
suffix: )
如果是JDK8的环境,
algorithm
设置为PBEWithMD5AndDES
,·iv-generator-classname
设置为org.jasypt.iv.NoIvGenerator
。
生成密码工具类
注意: 此处的配置要与 application.yml中的jasypt配置参数保持一致
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
/**
* Jasyp工具类
*
* @since 2024/1/12 17:19
*/
public class JasyptUtils {
public static void main(String[] args) {
String url = encrypt("jdbc:mysql://127.0.0.1:3306/practice?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8");
System.out.println("加密后url:" + url);
String decryptUrl = decrypt(url);
System.out.println("解密后url:" + decryptUrl);
String username = encrypt("root");
System.out.println("加密后username:" + username);
String decryptUsername = decrypt(username);
System.out.println("解密后username:" + decryptUsername);
String pwd = encrypt("root@2024");
System.out.println("加密后pwd:" + pwd);
String decryptPwd = decrypt(pwd);
System.out.println("解密后pwd:" + decryptPwd);
}
/**
* 加密
*
* @param plaintext 明文
* @return
*/
public static String encrypt(String plaintext) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
// 指定算法 PBEWithMD5AndDES
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
// 指定秘钥,和yml配置文件中保持一致
config.setPassword("abc123456");
// 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置
// config.setKeyObtentionIterations( "1000");
// config.setPoolSize("1");
// config.setProviderName("SunJCE");
// config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
// config.setStringOutputType("base64");
encryptor.setConfig(config);
// 生成加密数据
return encryptor.encrypt(plaintext);
}
/**
* 解密
*
* @param data 加密后数据
* @return
*/
public static String decrypt(String data) {
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
config.setPassword("abc123456");
// 为减少配置文件的书写,以下都是 Jasyp 3.x 版本,配置文件默认配置
// config.setKeyObtentionIterations( "1000");
// config.setPoolSize("1");
// config.setProviderName("SunJCE");
// config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
// config.setStringOutputType("base64");
encryptor.setConfig(config);
// 解密数据
return encryptor.decrypt(data);
}
}
生成密码
通过 Jasyp工具类 生成密码,密钥以及config配置信息与application.yml保持一致,此处仅以数据库url、账户、密码 示例
public static void main(String[] args) {
String url = encrypt("jdbc:mysql://127.0.0.1:3306/practice?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8");
System.out.println("加密后url:" + url);
String decryptUrl = decrypt(url);
System.out.println("解密后url:" + decryptUrl);
String username = encrypt("root");
System.out.println("加密后username:" + username);
String decryptUsername = decrypt(username);
System.out.println("解密后username:" + decryptUsername);
String pwd = encrypt("root@2024");
System.out.println("加密后pwd:" + pwd);
String decryptPwd = decrypt(pwd);
System.out.println("解密后pwd:" + decryptPwd);
}
执行结果如下:
加密后url:pbrf06ntoiZQtlGia15Dq1DxJog/0cRcHADwq0dbgjX3n2F6PC69QJVOKH2rGnvYz4RaqA/+g3104JHhTz1J290DFUk/bAGhIWgYu3fSGa96YwLlojJFuYWws5/aZf5/ekeszjM4Na3jgVHoNpg4Hl4v22gq7qHeINpRgevi4FPst58b3NvaLBHIvNWRkmxjrCoyMl10CrBZkhDYoEcT/FN/O0VABuwPrSDtMKu7Imc=
解密后url:jdbc:mysql://127.0.0.1:3306/practice?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8
加密后username:5eyNEdPpyr8ToSWdlqTkfwI05MIHQOxgRVk2/99rbHkIXb/UcvjxmFLVURiwigJx
解密后username:root
加密后pwd:+5b1ZcErluyEd0V+AjYg0J8jULHm7RkSNo8PRhAeguPjuc56OB/1vKPWujKCtaRc
解密后pwd:root@2024
配置文件
将以上生成的加密字符串,使用ENC()包裹,替换原配置文件中的对应属性,此处示例配置文件为
application-dev.yml
。
--- # 数据源配置
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: true
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
# 严格模式 匹配不到数据源则报错
strict: true
datasource:
# 主库数据源
master:
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: ENC(pbrf06ntoiZQtlGia15Dq1DxJog/0cRcHADwq0dbgjX3n2F6PC69QJVOKH2rGnvYz4RaqA/+g3104JHhTz1J290DFUk/bAGhIWgYu3fSGa96YwLlojJFuYWws5/aZf5/ekeszjM4Na3jgVHoNpg4Hl4v22gq7qHeINpRgevi4FPst58b3NvaLBHIvNWRkmxjrCoyMl10CrBZkhDYoEcT/FN/O0VABuwPrSDtMKu7Imc=)
username: ENC(5eyNEdPpyr8ToSWdlqTkfwI05MIHQOxgRVk2/99rbHkIXb/UcvjxmFLVURiwigJx)
password: ENC(+5b1ZcErluyEd0V+AjYg0J8jULHm7RkSNo8PRhAeguPjuc56OB/1vKPWujKCtaRc)
启动服务测试连接是否正常启动。
开发
jasypt 本身的密钥
abc123456
配置在application.yml
文件中,也有暴露的风险,因此可以通过配置JVM启动参数的方式来配置密钥,如此密钥仅仅会存在本地,并不会随代码上传而泄露。
以IDEA2023.1为例,服务启动类中右键选择Edit Configuration
进入项目启动配置管理页面,选择 Modify opinions
添加 VM opinion
设置VM启动参数 -Djasypt.encryptor.password=abc123456
,然后应用即可。
项目全局配置
上述方式需要每个模块单独配置,下面的方法可以全局配置 VM 启动参数
在下面红框中 添加VM启动参数,注意与前面的 -ea
留出一个空格的位置
添加后如下