SpringBoot3:轻松使用Jasypt实现配置文件信息加密

文章目录

  • 前言
  • 一、概述
    • 1.1 Jasypt库简介
    • 1.2 Jasypt库的主要特点
  • 二、开发环境
  • 三、Jasypt集成到SpringBoot3
    • 3.1 引入依赖
    • 3.2 配置Jasypt
    • 3.3 加密配置文件信息
      • 3.3.1 方案一(不推荐)
        • a.编写测试类生成加密后的配置文件信息
        • b.运行
        • c.修改原本的配置文件信息
      • 3.3.2 方案二(推荐)
        • a.添加Maven 插件
        • b.修改配置文件
        • c.运行如下maven命令:
        • d.打包项目
        • e.运行jar包
        • f.测试
  • 四、总结

在这里插入图片描述

前言

对于一些单体项目而言,在没有使用SpringCloud的情况下,配置文件中包含着大量的敏感信息,比如数据库的账号密码、API服务的秘钥等等,如果这些信息泄露出去将会对企业的资产产生重大威胁。因此,对配置文件中的敏感信息加密是一件极其必要的事。

一、概述

1.1 Jasypt库简介

下载 (12)

Jasypt是一个易于使用的Java库,专门用于加密和解密配置文件中的敏感信息,如数据库凭据、API密钥等。它提供了一种安全的方式来存储和管理配置文件中的敏感数据,而不是以明文形式暴露。

Jasypt支持多种加密算法,如DES、AES、Blowfish等,以及基于口令的加密算法(PBE)。它还提供了灵活的配置选项,允许开发人员自定义加密算法、密码、初始化向量等。

官网:jasypt-spring-boot

1.2 Jasypt库的主要特点

Jasypt的主要特点包括:

  • 简单易用:Jasypt提供了简单的API和注解,使得在应用程序中集成和使用Jasypt变得非常容易。
  • 安全性高:Jasypt使用强加密算法来保护配置文件中的敏感信息,防止数据泄露和未授权访问。
  • 兼容性好:Jasypt可以与各种Java应用程序和框架集成,包括Spring、Spring Boot、Hibernate等。

二、开发环境

  • JDK版本:JDK 17
  • Spring Boot版本:Spring Boot 3.2.2
  • MySQL版本:8.0.37
  • 构建工具:Maven

三、Jasypt集成到SpringBoot3

3.1 引入依赖

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>

3.2 配置Jasypt

jasypt:encryptor:algorithm: PBEWITHHMACSHA512ANDAES_256iv-generator-classname: org.jasypt.iv.RandomIvGeneratorpassword: secret_key # 这里的秘钥一般不会写在配置文件中,为了方便理解暂时放在这里property:prefix: ENC(suffix: )
  • algorithm: jasypt的加密算法,这里指定加密算法为一种结合了SHA-512 HMAC和AES-256加密算法的强加密算法。
  • iv-generator-classname: 指定用于生成初始化向量的类。RandomIvGenerator是一个随机生成初始化向量的生成器,它适用于需要初始化向量的加密算法,如AES。每次加密时,它都会生成一个新的随机初始化向量,增加了解密的难度。
  • password: 指定用于加密和解密的密码。
  • property.prefix: 指定加密值的前缀。当Jasypt处理配置文件时,它会查找以这个前缀开始的属性值,并尝试使用配置的加密算法进行解密。默认值是ENC(,也可以进行修改。
  • property.suffix: 指定加密值的后缀。与prefix类似,Jasypt会查找以这个后缀结束的属性值进行解密。默认值是)

更多配置属性:

Key描述RequiredDefault Value
jasypt.encryptor.password用于加密和解密的密码。这个密码非常重要,因为它用于生成加密密钥和解密密文。True-
jasypt.encryptor.algorithm指定加密算法。默认值是PBEWITHHMACSHA512ANDAES_256,这是一种结合了SHA-512 HMAC和AES-256加密算法的强加密算法。FalsePBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.key-obtention-iterations指定获取加密密钥的迭代次数。这个值越大,获取密钥的过程越慢,但越安全。False1000
jasypt.encryptor.pool-size指定加密器池的大小。如果设置为大于1的值,Jasypt将使用一个线程池来并行处理加密和解密请求。False1
jasypt.encryptor.provider-name指定加密提供者的名称。默认值是SunJCE,这是Java加密扩展(JCE)的Sun Microsystems实现。FalseSunJCE
jasypt.encryptor.provider-class-name指定加密提供者的类名。如果指定了这个属性,Jasypt将使用这个类作为加密提供者,而不是默认的SunJCEFalsenull
jasypt.encryptor.salt-generator-classname指定用于生成盐值的类。默认值是org.jasypt.salt.RandomSaltGenerator,它生成一个随机的盐值。Falseorg.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.iv-generator-classname指定用于生成初始化向量的类。默认值是org.jasypt.iv.RandomIvGenerator,它生成一个随机的初始化向量。Falseorg.jasypt.iv.RandomIvGenerator
jasypt.encryptor.string-output-type指定加密后的字符串输出类型。默认值是base64,这意味着加密后的值将转换为Base64编码的字符串。Falsebase64
jasypt.encryptor.proxy-property-sources指定是否代理属性源。如果设置为true,Jasypt将代理所有的属性源,以便在获取属性值时进行解密。Falsefalse
jasypt.encryptor.skip-property-sources指定要跳过的属性源列表。如果某些属性源不包含敏感信息,或者您不想对它们进行加密,可以将它们添加到这个列表中。Falseempty list

3.3 加密配置文件信息

先看一下我们现有的配置文件信息,我们要加密的信息是数据库urlusernamepassword这三个属性:

spring:application:name: serverdatasource: url: jdbc:mysql://localhost:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456

3.3.1 方案一(不推荐)

a.编写测试类生成加密后的配置文件信息
    @Autowiredprivate StringEncryptor encryptor;@Testpublic void encrypt() {String url = encryptor.encrypt("jdbc:mysql://localhost:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai");String name = encryptor.encrypt("root");String password = encryptor.encrypt("123456");System.out.println("database url: " + url);System.out.println("database username: " + name);System.out.println("database password: " + password);}
b.运行

image-20240726193839480

c.修改原本的配置文件信息
spring:application:name: serverdatasource: url: ENC(z3xy2E55GmC126NvY1Mb3uprgXGjyaOWS4J3y72r1FFeTSno3m5ljGV22TqyYr85bptOY7drFHzrxaUfqbmetNWCsFY7i4vu5ig7ow0gk6ObLK/dVI4MRePxM5CGVzQ3XUWSJrUbLU1o+13g2erP2yV4uqeH6oVZH/FrBDQ6YfeeHmpl73emqMoGFFBnWdMvF1tzJxYMLcwthGBoaRopyA==)driver-class-name: com.mysql.cj.jdbc.Driverusername: ENC(9oaZel6CzsIM/ws23QcX2ijvZvn8A5HBYJM4PDUvwFSqmCO26MJKKshhPE5Hi+BU)password: ENC(b5FqkU7mOSb0esB1qLXveDBalnUz7OtBxp0By/Q1sd5yk0cgOuJqIV2zSmqHA5mz)

再次运行和测试:

image-20240726194120745

测试的接口是我随便写的一个接口,实现的功能就是根据用户名查询数据库中的一个用户:

    @Operation(summary = "你好")@GetMapping("/hello")public Result<UserInfo> test2(String username) {List<UserInfo> userList = userInfoService.lambdaQuery().like(UserInfo::getUserName, username).list();return Result.success(userList.get(0));}

可以看到成功查询到了用户信息,说明数据库连接成功。

但这种方案有个问题,秘钥写在配置文件当中,一旦代码泄露,那别人就可以使用秘钥解密我们的密文,因此可以采取方案二。

3.3.2 方案二(推荐)

官方文档:https://github.com/ulisesbocchio/jasypt-spring-boot#maven-plugin

a.添加Maven 插件
    <build><plugins><plugin><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-maven-plugin</artifactId><version>3.0.5</version><configuration><path>file:src/main/resources/application.yaml</path></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

使用此插件时,提供加密密码的最简单方法是通过系统属性,即 -Djasypt.encryptor.password=“密码”。

默认情况下,插件会在./src/main/resources下的Spring Boot配置文件application. properties中加密配置,但我们用的一般都是yaml文件,因此修改一下即可。

记得一定要加spring-boot-maven-plugin依赖(ps:本人之前cv了依赖代码忘记cv构建代码导致一直报错🤡)。

b.修改配置文件
spring:application:name: serverdatasource:url: ENC(jdbc:mysql://localhost:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai)driver-class-name: com.mysql.cj.jdbc.Driverusername: ENC(root)password: ENC(123456)
jasypt:encryptor:algorithm: PBEWITHHMACSHA512ANDAES_256iv-generator-classname: org.jasypt.iv.RandomIvGeneratorproperty:prefix: ENC(suffix: )
c.运行如下maven命令:

如果采用的是多模块开发,记得选择模块

image-20240726215037612

mvn jasypt:encrypt -Djasypt.encryptor.password=secret_key
d.打包项目

image-20240726215253282

e.运行jar包

转到target目录用命令行运行下面的命令

java -jar xxx.jar --jasypt.encryptor.password=secret_key
f.测试

image-20240726215611607

四、总结

本文介绍了在SpringBoot3项目中集成Jasypt实现配置文件信息加密的方法。Jasypt不仅可以用来加密数据库用户名、密码,还可以用来加密API秘钥等等敏感信息,只需要添加一个加密前缀和缀就可以轻松实现配置信息加密,希望对大家有所帮助😊。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

vue实现电子签名、图片合成、及预览功能

业务功能&#xff1a;电子签名、图片合成、及预览功能 业务背景&#xff1a;需求说想要实现一个电子签名&#xff0c;然后需要提供一个预览的功能&#xff0c;可以查看签完名之后的完整效果。 需求探讨&#xff1a;后端大佬跟我说&#xff0c;文档我返回给你一个PDF的oss链接…

开源大模型的格式转成GGUF,并量化后使用ollama推理

https://github.com/ggerganov/llama.cpphttps://github.com/ggerganov/llama.cpp使用到的工具: llama.cpp ollama 步骤 1、下载llama.cpp,并使用make编译 2、新建conda环境,安装llama.cpp里所需的库(requirements.txt) 3、下载需要量化的模型

1. BES2700ZP概述

1. 概述 恒玄BES2700采用RTX5操作系统&#xff0c;配合mindmics算法或者自研算法。 RTX5相关接口可参考&#xff1a;RTX v5 Implementation 2. 芯片框架 2.1 内存 - 4MB 2.2 flash - 8MB

openmv 学习笔记(24电赛笔记)

模版匹配 模版匹配是一种计算机视觉技术&#xff0c;用于图像或者视频中查找特定的模版或者对象&#xff0c;查找模版可以是数字或者是物体&#xff0c;技术通过在目标图像中寻找与模版图像相似的区域来实现匹配。这种技术最早起源在 20世纪70年代 的图像处理领域。 使用模版匹…

《python程序语言设计》第6章14题 估算派值 类似莱布尼茨函数。但是我看不明白

这个题提供的公式我没看明白&#xff0c;后来在网上找到了莱布尼茨函数 c 0 for i in range(1, 902, 100):a (-1) ** (i 1)b 2 * i - 1c a / bprint(i, round(4 / c, 3))结果 #按题里的信息&#xff0c;但是结果不对&#xff0c;莱布尼茨函数到底怎么算呀。

无人机的飞行模式

无人机的飞行模式是提升飞行效率和完成特定任务的关键。现代无人机通常配备多种智能飞行模式&#xff0c;这些模式能够帮助飞行员高效且安全地完成飞行任务。以下是几种常见的无人机飞行模式及其应用场景的解析&#xff1a; 一、跟随模式 应用场景&#xff1a;跟随模式非常适…

【React】详解classnames工具:优化类名控制的全面指南

文章目录 一、classnames的基本用法1. 什么是classnames&#xff1f;2. 安装classnames3. 导入classnames4. classnames的基本示例 二、classnames的高级用法1. 动态类名2. 传递数组3. 结合字符串和对象4. 结合数组和对象 三、实际应用案例1. 根据状态切换类名2. 条件渲染和类名…

Halcon 设置处理区域AOI(用户交互,drawing_object)

主程序 * 1.加载并显示图片 ************************* read_image (Image, ./model)dev_get_window (WindowHandle) set_display_font (WindowHandle, 14, sans, true, false) dev_set_draw (margin) dev_set_line_width (3) dev_display (Image)* 读取字典文件 ************…

35.【C语言】详解函数递归

目录&#xff1a; 定义 作用 例子1~3 拓展学习 趣味练习 1.定义&#xff1a;函数自己调用自己&#xff08;递推回归&#xff09; int main() {main()return 0; } 这样容易死循环&#xff0c;导致爆栈(Stack Overflow) 所以需要设立限制条件&#xff0c;使执行时越来越接近条…

DOS攻击实验

实验背景 Dos 攻击是指故意的攻击网络协议实现的缺陷或直接通过野蛮手段&#xff0c;残忍地耗尽被攻击对象的资源&#xff0c;目的是让目标计算机或网络无法提供正常的服务或资源访问&#xff0c;使目标系统服务系统停止响应甚至崩溃。 实验设备 一个网络 net:cloud0 一台模…

顺序表算法题

在学习了顺序表专题后&#xff0c;了解的顺序表的结构以及相关概念后就可以来试着完成一些顺序表的算法题了&#xff0c;在本篇中将对三道顺序表相关的算法题进行讲解&#xff0c;希望能对你有所帮助&#xff0c;一起加油吧&#xff01;&#xff01;&#xff01; 1.移除元素 2…

SpringBoot知识笔记

一、基本概念 1.1 特性 起步依赖 自动配置 其它特性:内嵌的Tomcat、Jetty(无需部署WAR文件),外部配置,不需要XML配置(properties/yml)。 1.2 配置文件 SpringBoot提供了多种属性配置方式 //application.properties server.port=9090 server.servlet.context-path…

Linux下Centos7中的gcc/g++

命为志存。 —— 朱熹 Linux中C/C翻译过程 1、样例介绍1、1、gcc版本过低不能编译成功1、2、编写 .cxx或.cc或.cpp代码(都是C) 2、程序的翻译过程2、1、条件编译(补充)2、2、语言历史 3、深入理解链接3、1、静态链接的使用场景 1、样例介绍 1、1、gcc版本过低不能编译成功 in…

前端自动化测试(一):揭秘自动化测试秘诀

目录 [TOC](目录)前言自动化测试 VS 手动测试测试分类何为单元测试单元测试的优缺点优点缺点 测试案例测试代码 测试函数的封装实现 expect 方法实现 test 函数结语 正文开始 &#xff0c; 如果觉得文章对您有帮助&#xff0c;请帮我三连订阅&#xff0c;谢谢&#x1f496;&…

android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion

1、先明白几个概念 &#xff08;1&#xff09;平台版本&#xff08;Android SDK版本号&#xff09; 平台版本也就是我们平时说的安卓8、安卓9、安卓10 &#xff08;2&#xff09;API级别&#xff08;API Level&#xff09; Android 平台提供的框架 API 被称作“API 级别” …

Android APK混淆处理方案分析

这里写目录标题 一、前言1.1 相关工具二、Apk 分析2.1 apk 解压文件2.2 apk 签名信息2.3 apk AndroidManifest.xml2.4 apk code三、Apk 处理3.1 添加垃圾文件3.2 AndroidManifest.xml 处理3.3 dex 混淆处理3.4 zipalign对齐3.5 apk 重新签名3.6 apk 安装测试四、总结一、前言 提…

Unity打包设置

1.Resolution and Presentation (分辨率和显示) Fullscreen Window (全屏窗口): 应用程序将以全屏窗口模式运行&#xff0c;但不会独占屏幕。适用于想要全屏显示但仍需访问其他窗口的情况。 Resizable Window (可调整大小的窗口): 允许用户调整应用程序窗口的大小。适用于窗口…

Selenium相对定位

测试网站&#xff1a;Web form 相对定位的方法&#xff1a; above()&#xff1a;定位基准元素上方的元素below()&#xff1a;定位基准元素下方的元素to_left_of()&#xff1a;定位基准元素左侧的元素to_right_of()&#xff1a;定位基准元素右侧的元素near() &#xff1a;定位基…

糊涂工具包和commons包(Java)

工具包&#xff08;Commons-io&#xff09; 介绍&#xff1a; Commons是apache开源基金组织提供的工具包&#xff0c;里面有很多帮助我们提高开发效率的API 比如&#xff1a; StringUtils 字符串工具类 NumberUtils 数字工具类 ArrayUtils 数组工具类 RandomUtils…

集群自组网应急指挥体系应用技术分析

一、技术背景与意义 随着社会的快速发展和科技的日益进步&#xff0c;面对自然灾害、突发事件等紧急情况&#xff0c;快速有效的应急指挥体系成为维护社会稳定和人民生命财产安全的重要保障。集群自组网应急指挥体系&#xff0c;以其快速部署、高可靠性、强抗毁性等优势&#…