【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利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方