【Java】Ruoyi-Vue-Plus 整合 jasypt 为SpringBoot配置文件进行加密

本文主要是介绍【Java】Ruoyi-Vue-Plus 整合 jasypt 为SpringBoot配置文件进行加密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发环境

  • 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_256saltGeneratorClassname默认值是org.jasypt.salt.RandomSaltGeneratorproperty中的默认前后缀为ENC( ) 等。

在 ruoyi-admin 模块的 application.yml 文件中配置如下:

--- # jasypt 配置(这是JDK17下的配置)
jasypt:encryptor:# 加密的秘钥password: abc123456# 加密算法 jasypt3.0后,默认算法为 PBEWITHHMACSHA512ANDAES_256,需要JDK9以上或者 添加JCE(Java Cryptography Extension 无限强度权限策略文件)支持algorithm: PBEWITHHMACSHA512ANDAES_256iv-generator-classname: org.jasypt.iv.RandomIvGeneratorproperty:# 算法识别的前后缀,默认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();// 指定算法 PBEWithMD5AndDESconfig.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/contentdynamic:# 性能分析插件(有性能损耗 不建议生产环境使用)p6spy: true# 设置默认的数据源或者数据源组,默认值即为 masterprimary: master# 严格模式 匹配不到数据源则报错strict: truedatasource:# 主库数据源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 留出一个空格的位置
在这里插入图片描述
添加后如下
在这里插入图片描述

这篇关于【Java】Ruoyi-Vue-Plus 整合 jasypt 为SpringBoot配置文件进行加密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/613301

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多