【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

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We