【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_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 留出一个空格的位置
在这里插入图片描述
添加后如下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/325794.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MAX-4/11/03/032/99/1/1/00智能伺服驱动器ELAU

MAX-4/11/03/032/99/1/1/00智能伺服驱动器ELAU MAX-4/11/03/032/99/1/1/00智能伺服驱动器ELAU A-B 1394-SJT05-C A-B 1326AS-B440G-21-A A-B 6186M-17PT ELAU MAX-4/11/03/032/99/1/1/00 ELAU MAX-4/11/03/032/08/1/1/00 ELAU MAX-4/11/03/016/99/1/1/00 E…

外观模式介绍

目录 一、外观模式介绍 1.1 外观模式定义 1.2 外观模式原理 1.2.1 外观模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、外观模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 具体实现 2.2.2.1 灯光类 2.2.2.2 电视类 2.2.2.3 空调类 2.2.2.4 外观面板类…

计算机毕业设计----SSH实现的一个宠物商城

项目介绍 本项目分为前后台&#xff0c;分为管理员与用户两种角色&#xff0c;普通用户登录前台&#xff0c;管理员登录后台&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,用户管理,管理商品,商品分类管理,订单管理,留言管理,公告管理,新闻管理等功能。 用户…

MySQL索引创建原则和失效问题

一.索引创建原则 数据量较大,且查询比较频繁的表常作为查询条件、分组、排序的字段字段内容区分度高内容较长,使用前缀索引尽量创建联合索引要控制索引的数量如果索引列不能存储NULL值,请在创建表示使用NOT NULL约束它 二.索引失效 违反最左前缀法则范围查询右边的列,不能使用…

Linux文件同步

Linux文件同步 scp简介基本用法 rsync简介基本用法 tftp简介基本用法 其他命令ftpsftplftp 此博客将主要介绍Linux文件同步常用的两种命令&#xff1a;scp&#xff08;secure copy&#xff09;、rsync&#xff08;remote synchronization&#xff09;和tftp&#xff08;Trivial…

k8s源码阅读:Informer源码解析

写在之前 Kubernetes的Informer机制是一种用于监控资源对象变化的机制。它提供了一种简化开发者编写控制器的方式&#xff0c;允许控制器能够及时感知并响应 Kubernetes 集群中资源对象的变化。Informer通过与Kubernetes API服务器进行交互&#xff0c;通过监听API服务器上资源…

计算机毕业设计 | SpringBoot宠物店管理系统(附源码)

1&#xff0c;绪论 项目背景 我国已经成为世界第二大经济体&#xff0c;经济实力高速发展以及百姓生活水平的普遍提高&#xff0c;不断地要求企业提供更加多元化的娱乐方式&#xff0c;更加快速和方便的服务&#xff0c;因此对宠物行业也提出了更加严格的要求&#xff0c;如管…

layabox_2d游戏A*寻路实践

使用工具 Red Blob Games 效果 项目地址 LayaAStar2D: Laya2.0引擎2D游戏使用AStar实践。

C++设计模式-- 2.代理模式 和 外观模式

文章目录 代理模式外观模式角色和职责代码演示一&#xff1a;代码演示二&#xff1a;外观模式适用场景 代理模式 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合 或不能直接引用另一个对象&#xff0c;而代…

<蓝桥杯软件赛>零基础备赛20周--第13周--DFS剪枝

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上答疑&#x…

docker安装nacos+mysql+配置网络

一、配置网络 为什么要配置网络&#xff1f;因为 Nacos 内要连接MySQL数据库的&#xff0c;我的 MySQL 数据库也是用 Docker启动的&#xff0c;所以2个容器间要通信是需要配置他们使用相同的网络。这个操作要在启动Nacos容器之前。 注意&#xff1a;这里配置的网络只在镜像内部…

zabbix6.4设置网络设备端口流量P95

P95概念&#xff1a; p95函数写法&#xff1a; 需要监控P95的设备如下&#xff1a; 先找到原来的端口接收发送速率的监控项&#xff1a; 可以看到他们归属于自动发现规则&#xff1a;端口表UP 找到自动发现规则&#xff1a; 点击创建监控项原型&#xff1a; 公式如下&#xff…

基于LLM大模型的信息提取指南

信息提取&#xff08;information Extraction&#xff09;是从文本或文档集合中自动检索与特定主题相关的特定信息的过程。 这通常涉及自然语言处理技术的使用。 使用自然语言处理来提取信息通常会导致构建复杂的逻辑&#xff0c;这些逻辑有时非常具体并且不能很好地概括。 好…

Linux例行性工作 at和crontab命令

1&#xff0c;例行性工作 例行性工作 —— 在某一时刻&#xff0c;必须要做的事情 —— 定时任务 &#xff08;比如&#xff1a;闹钟&#xff09; 例行性工作分为两种&#xff1a;“单一的例行性工作 at”和“循环的例行性工作 crontab” 2&#xff0c;单一执行的例行性工作 …

C 程序运行机制

1.编辑 编写C语言源程序代码&#xff0c;源程序文件以“.c”作为扩展名。 2.编译 将C语言源程序转换为目标程序(或目标文件)。如果程序没有错误&#xff0c;没有任何提示&#xff0c;就会生成一个扩展名为“.obj”的二进制文件。C语言中的每条可执行语句经过编译后最终都将被…

Go语言中的HTTP请求发送

在Go语言中&#xff0c;发送HTTP请求是一种常见的网络操作。Go语言的net/http包提供了强大的API&#xff0c;使开发者能够轻松地构建HTTP请求并处理响应。 下面我们将详细介绍如何使用Go语言发送HTTP请求&#xff0c;包括设置请求参数、处理响应状态码和头部信息、发送JSON数据…

中湖盐——健康盐,盐中贵族

祁连山古老的盐湖,有一个水晶女和玉莹郎的传说,他们来到凡间做盐为生,做出的盐像水晶玉莹一样纯净。直到有一天,始皇帝传旨修长城,玉莹和水晶不忍百姓疾苦,用相思之泪化为了水晶般的白盐;血肉精华冶炼成萤石般的盐根,造福一方。 雪水溶积汇入的盐湖,水天倒映,美不胜收,中湖盐坚…

Zero-Shot Learning—A Comprehensive Evaluation of the Good, the Bad and the Ugly

目录 背景知识why zero-shot learning?广义零样本学习设置 1 INTRODUCTION1.1 zero-shot learning——methods1.2 zero-shot learning——datasets1.3 zero-shot learning——evaluation protocol 2 RELATED WORK2.1 早期工作2.1.1 Attribute-based classification for zero-s…

STC8H8K蓝牙智能巡线小车——3.按键开关状态获取

电路分析 引脚为P37开关未按下时&#xff0c;P37是高电平开关按下时&#xff0c;GND导通&#xff0c;P37是低电平 编程思路 Driver目录中添加KEY.h文件&#xff0c;应包含引脚定义、开关GPIO实例化函数、开关状态获取函数以及当按下和未按下时执行不同的函数&#xff08;函数…

多级缓存架构(三)OpenResty Lua缓存

文章目录 一、nginx服务二、OpenResty服务1. 服务块定义2. 配置修改3. Lua程序编写4. 总结 三、运行四、测试五、高可用集群1. openresty2. tomcat 通过本文章&#xff0c;可以完成多级缓存架构中的Lua缓存。 一、nginx服务 在docker/docker-compose.yml中添加nginx服务块。…