Springboot采用jasypt加密配置

目录

前言

一、Jasypt简介

二、运用场景

三、整合Jasypt

2.1.环境配置

2.2.添加依赖

2.3.添加Jasypt配置

2.4.编写加/解密工具类

2.5.自定义加密属性前缀和后缀

2.6.防止密码泄露措施

2.61.自定义加密器

2.6.2通过环境变量指定加密盐值

总结


前言

   在以往的多数项目中,配置文件中的数据库密码、redis密码、nacos密码等敏感性信息一般是以明文形式存在,存在泄露的风险,因此,对敏感信息加固是很有必要,加固的一个重要环节就是对重要信息做加密处理。

这里简单的介绍一下Jasypt加密

一、Jasypt简介

Jasypt 是一个 java 库,可以使开发者不需要太多操作来给 Java 项目添加基本加密功能,而且不需要知道加密原理。Jasypt 为开发人员提供了一种简单易用加密功能,包括:密码认证、字符串加密等。

二、运用场景

一般来说,项目配置文件里,所有涉及信息安全的配置项(或字段)都应该做处理,典型的比如:

  • 数据库密码,如mysql、oracle
  • 缓存中间件的密码,如 redis、mongodb
  • 其他中间件,如消息中间件、zk、nacos等
  • 第三方服务的,如appid、 Access_Key

三、整合Jasypt

官方示例:GitHub - ulisesbocchio/jasypt-spring-boot-samples: Sample apps using jasypt-spring-boot

2.1.环境配置

  • SpringBoot 2.0以上
  • Jasypt 3.0.5
  • jdk1.8

2.2.添加依赖

在项目 pom.xml 添加 Jasypt 相关依赖。

<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>

2.3.添加Jasypt配置

jasypt:encryptor:password: 123456algorithm: PBEWITHHMACSHA512ANDAES_256iv-generator-classname: org.jasypt.iv.RandomIvGeneratorsalt-generator-classname: org.jasypt.salt.RandomSaltGeneratorstring-output-type: base64provider-name: SunJCEpool-size: 1key-obtention-iterations: 1000property:# 标识为加密属性的前缀prefix: ENC(# 标识为加密属性的后缀suffix: )

2.4.编写加/解密工具类

package com.bexk.util;import java.util.Base64;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;/*** @Description: 加解密密算法* @Author developer* @Date 2024/10/11 9:48 上午*/
public class JasyptUtil {/*** PBE 算法*/public static final String PBE_ALGORITHMS_MD5_DES = "PBEWITHMD5ANDDES";public static final String PBE_ALGORITHMS_SHA512_AES_256 = "PBEWithHMACSHA512ANDAES_256";private JasyptUtil() {}/*** 加密** @param encryptedStr 加密字符串* @param password     盐值* @return*/public static String encrypt(String encryptedStr, String password) {return encrypt(encryptedStr, PBE_ALGORITHMS_MD5_DES, password);}/*** 加密** @param encryptedStr 加密字符串* @param algorithm    加密算法* @param password     盐值* @return*/public static String encrypt(String encryptedStr, String algorithm, String password) {        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();EnvironmentPBEConfig config = new EnvironmentPBEConfig();// 指定加密算法config.setAlgorithm(algorithm);// 加密盐值config.setPassword(password);config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");encryptor.setConfig(config);// 加密return encryptor.encrypt(encryptedStr);}/*** 解密** @param decryptStr 解密字符串* @param password   盐值* @return*/public static String decrypt(String decryptStr, String password) {return decrypt(decryptStr, PBE_ALGORITHMS_MD5_DES, password);}/*** 解密** @param decryptStr 解密字符串* @param algorithm  指定解密算法* @param password   盐值* @return*/public static String decrypt(String decryptStr, String algorithm, String password) {StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();EnvironmentPBEConfig config = new EnvironmentPBEConfig();// 指定解密算法:解密算法要与加密算法一一对应config.setAlgorithm(algorithm);// 加密秘钥config.setPassword(password);config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");encryptor.setConfig(config);// 解密return encryptor.decrypt(decryptStr);}}

修改配置文件

如图,通过编写加/解密工具类得到对应的加密结果,然后将配置文件的原始明文密码替换成上一步对应的结果,并通过 ENC(加密结果) 包裹起来。

加密前:

加密后:

2.5.自定义加密属性前缀和后缀

如果您只想为加密属性使用不同的前缀/后缀,则可以继续使用所有默认实现,只需覆盖 application.yml (或 application.properties)中的以下属性(property):

jasypt:encryptor:property:prefix: "ENC@["suffix: "]"

2.6.防止密码泄露措施

若使用的是默认的加密规则,会让当自定义加密盐值(jasypt.encryptor.password) 泄漏,可能变得不安全。那么如何进一步防止密码泄露呢?

2.61.自定义加密器

自定义加密规则非常简单,只需要提供自定义的加密器配置类,然后通过jasypt.encryptor.bean配置指定加密配置类即可。

@Bean(name = "encryptorBean")static public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("password");config.setAlgorithm("PBEWithHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}

也将自定义加密器添加到 Spring IoC 容器中。

@Configuration
public class JasyptConfig {/*** 加解密盐值*/@Value("${jasypt.encryptor.password}")private String password;// @Bean("jasyptStringEncryptor")@Bean("encryptorBean")public StringEncryptor myStringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword("password");config.setAlgorithm("PBEWithHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setProviderName("SunJCE");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}
}

修改配置文件

jasypt:encryptor:# 指定加解密bean的名称,默认jasyptStringEncryptorbean: encryptorBean# 盐值password: 123456#省略其它

注意事项:Jasypt默认加解密器bean的Name为 jasyptStringEncryptor,若不想在配置文件中指定自定义加密器名称,需将自定义加密器bean的Name设置为jasyptStringEncryptor,否则将不生效。

Springcloud项目最好不要采用自定义,容易出现找不到bean的问题。

2.6.2通过环境变量指定加密盐值

方式一:直接作为程序启动时的命令行参数

java -jar test.jar --jasypt.encryptor.password=盐值

方式二:直接作为程序启动时的应用环境变量

java -Djasypt.encryptor.password=盐值 -jar test.jar

如果通过Docker部署,请在ENTRYPOINT加上对应参数,比如:

ENTRYPOINT ["java","-Djasypt.encryptor.password=test","-jar","test.jar"]

方式三:直接作为系统环境变量
1. 设置系统环境变量 :JASYPT_PWD

   在windows系统设置:

在eclipse设置,如图:

在idea中设置,需要通过VM options设置,如图:

在linux系统设置

#打开全局配置文件:      
sudo vim /etc/profile
#编辑全局配置文件:      
export JASYPT_PWD=nrmZtkF7T0kjG
#重载profile配置文件:  
source /etc/profile

2. Spring Boot的项目配置文件指定系统环境变量:

jasypt:encryptor:password: ${JASYPT_PWD:123456}

总结

本文介绍了如何在Springboot项目中使用Jasypt对配置文件中的敏感信息进行加密,包括环境配置、依赖添加、配置设置、自定义加密器和使用环境变量管理盐值,以提升项目的安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)

fetch 是啥&#xff1f; fetch 函数是 JavaScript 中用于发送网络请求的内置 API&#xff0c;可以替代传统的 XMLHttpRequest。它可以发送 HTTP 请求&#xff08;如 GET、POST 等&#xff09;&#xff0c;并返回一个 Promise&#xff0c;从而简化异步操作 基本用法 /* 下面是…

贪吃蛇小游戏设计

贪吃蛇小游戏 1.引言1.1 背景1.2 目的1.3 意义1.4 任务1.5 技术可行性分析1.5.1执行平台1.5.2 语言特性与功能方面 2.需求分析2.1 环境需求2.2开发环境分析2.3游戏功能分析2.4 游戏性能分析2.5 数据流图2.6 数据字典 3.概要设计3.1 设计思路3.2 游戏界面设计3.3 总设计模块的划…

DNS面临的4大类共计11小类安全风险及防御措施

DNS在设计之初&#xff0c;并未考虑网络安全限制&#xff0c;导致了许多问题。DNS安全扩展(DNSSEC)协议的开发旨在解决DNS的安全漏洞&#xff0c;但其部署并不广泛&#xff0c;DNS仍面临各种攻击。接下来我们一起看下DNS都存在哪些安全攻击及缓解措施&#xff0c;旨在对DNS安全…

【大数据学习 | flume】flume的概述与组件的介绍

1. flume概述 Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 Flume两个版本区别&#xff1a; ​ 1&…

Jmeter中的定时器(一)

定时器 1--固定定时器 功能特点 固定延迟&#xff1a;在每个请求之间添加固定的延迟时间。精确控制&#xff1a;可以精确控制请求的发送频率。简单易用&#xff1a;配置简单&#xff0c;易于理解和使用。 配置步骤 添加固定定时器 右键点击需要添加定时器的请求或线程组。选…

区块链技术在慈善捐赠中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 引言 区块链技术概述 定义与原理 发…

[数组二分查找] 0074. 搜索二维矩阵

文章目录 1. 题目链接2. 题目大意3. 示例4. 解题思路5. 参考代码 1. 题目链接 74. 搜索二维矩阵 - 力扣&#xff08;LeetCode&#xff09; 2. 题目大意 描述&#xff1a;给定一个 mn 大小的有序二维矩阵 matrix。矩阵中每行元素从左到右升序排列&#xff0c;每列元素从上到下…

使用 Python 脚本在 Ansys Mechanical 中创建用于后处理的螺栓工具

介绍 由螺栓连接定义的接头在工业应用中非常普遍。在 Ansys Mechanical FEA 中分析它们是一种非常常见的做法。通过Object Generator或Bolt Tools Add-on&#xff0c;使用线体、梁连接甚至3D实体中的梁单元&#xff0c;在Ansys Mechanical中生成螺栓连接非常容易。定义螺栓联接…

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:创新与应用

一、引言 随着科技的迅猛发展&#xff0c;声音克隆技术已经成为一个炙手可热的研究领域。SoVITS&#xff08;Sound Voice Intelligent Transfer System&#xff09;&#xff0c;作为该领域的先锋&#xff0c;凭借其卓越的性能和广泛的适用性&#xff0c;正在为多个行业带来前所…

python调用MySql详细步骤

一、下载MySql MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/windows/installer/8.0.html点击上面链接&#xff0c;进入MySQL8.0的下载页面&#xff0c;选择离线安装包下载。 不需要登陆&#xff0c;直接点击下方的 No thanks,just start my download. …

《InsCode AI IDE:编程新时代的引领者》

《InsCode AI IDE&#xff1a;编程新时代的引领者》 一、InsCode AI IDE 的诞生与亮相二、独特功能与优势&#xff08;一&#xff09;智能编程体验&#xff08;二&#xff09;多语言支持与功能迭代 三、实际应用与案例&#xff08;一&#xff09;游戏开发案例&#xff08;二&am…

华为路由策略配置

一、AS_Path过滤 要求&#xff1a; AR1与AR2、AR2与AR3之间建立EBGP连接 AS10的设备和AS30的设备无法相互通信 1.启动设备 2.配置IP地址 3.配置路由器的EBGP对等体连接&#xff0c;引入直连路由 [AR1]bgp 10 [AR1-bgp]router-id 1.1.1.1 [AR1-bgp]peer 200.1.2.2 as-nu…

如何解决JAVA程序通过obloader并发导数导致系统夯住的问题 | OceanBase 运维实践

案例背景 某保险机构客户的数据中台&#xff0c;自系统上线后不久&#xff0c;会定期的用 obload 工具从上游业务系统导入数据至OceanBase数据库。但&#xff0c;不久便遇到了应用服务器的 Memory 与 CPU 资源占用持续攀升&#xff0c;最终导致系统夯住而不可用的异常。 memo…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

react17安装html-react-parser运行报错记录

背景 react17 安装 html-react-parser npm install html-react-parser运行终端报错信息 ERROR in ./node_modules/html-react-parser/esm/index.mjs 2:0-122 Cant reexport the named export htmlToDOM from non EcmaScript module (only default export is available)原因…

websocket初始化

websocket初始化 前言 上一集我们HTTP的ping操作就可以跑通了&#xff0c;那么我们还有一个协议---websocket&#xff0c;我们在这一集就要去完成我们websocket的初始化。 分析 我们在初始化websocket的之前&#xff0c;我们考虑一下&#xff0c;我们什么时候就要初始化我们…

JavaEE 重要的API阅读

JavaEE API阅读 目的是为了应对学校考试&#xff0c;主要关注的是类的继承关系、抛出错误的类型、包名、包结构等等知识。此帖用于记录。 PageContext抽象类 包名及继承关系 继承自JspContext类。PageContext 实例提供对与某个 JSP 页⾯关联的所有名称空间的访问&#xff0…

Yocto项目 - VIRTUAL-RUNTIME,它有什么用?

Yocto 项目是一个完整的 Linux 分布构建工具集&#xff0c;提供了构建完全自定义小型核心或完整应用的能力。在这样一个构建系统中&#xff0c;VIRTUAL-RUNTIME这个概念是应用构建和选择处理中的重要部分。这篇文章将从概念、优势、应用场景和实战案例几个方面&#xff0c;全面…

基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

【Qt】在 Qt Creator 中使用图片资源方法(含素材网站推荐)

先准备图片资源 推荐一个好用的图标素材网站&#xff0c;有很多免费资源。 Ic, fluent, animal, dog, filled icon - Free download 其他辅助工具&#xff0c;类似 AI 抠图去背景&#xff0c;实测效果还行&#xff0c;但是非免费。 美图秀秀-在线一键抠图&#xff0c;无需P…