当前位置: 首页 > news >正文

spring boot集成jasypt 并 实现自定义加解密

一. 技术需求

由于项目中的配置文件 配置的地方过多,现将配置文件统一放到nacos上集中管理 且密码使用加密的方式放在配置文件中

项目中组件使用的版本环境如下
spring cloud 2021.0.5
spring cloud alibaba 2021.0.5.0
spring boot 2.6.13

二. 技术实现

配置文件的加密使用 加密库 jasypt

三. 简单使用步骤

  • 引入maven依赖

    <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
    </dependency>
    
  • 添加配置

    #加解密使用的密码 可以理解为密钥
    jasypt.encryptor.password=12581
    
  • 使用jasypt配置的密码来加密密码 并替换配置原先密码 (提供工具类进行加密)

    #原密码
    spring.datasource.passsword=1232456
    #新的密码 其实 rngDAJwRU09A3oNLkxzNaP3wfyhHt5N4DPAjudNJKDYAWXDeFmdGcFvgZJSh4gqZ 为源密码加密后的值
    spring.datasource.password=ENC(rngDAJwRU09A3oNLkxzNaP3wfyhHt5N4DPAjudNJKDYAWXDeFmdGcFvgZJSh4gqZ)
    

工具类如下

@Slf4j
public class Custom {public static void main(String[] args) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();//TODO 替换为配置文件中的密码config.setPassword("12581");//默认的加密算法config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);//TODO 123456 替换为所需加密的 原文String encrypt = encryptor.encrypt("123456");log.info("encrypt: {}", encrypt);}
}

到此就完成基本的配置文件加解密

你以为结束了吗,no~~~~

四. 高级使用篇

上面使用的默认的加解密的工具类,但是jasypt.encryptor.password 还是需要配置在配置文件中的 (配置文件、jvm参数等)本质来讲还是容易统一泄露。到这里,可能就有灵感了。不如我们自定义的加密的工具类 复杂的话 也可以搞个非对称加密(这个可自行研究)

目前我们来使用下 自定义加密的工具

(1)首先实现自定义的加密工具 需要实现 StringEncryptor 即可 我们这是用的国密4的对称加密算法 同时使用了 hutool的工具类

import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SM4;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;
import org.jasypt.encryption.StringEncryptor;import java.nio.charset.StandardCharsets;/*** @author leon* @date 2023-08-19 10:54:32*/
@Slf4j
public class Sm4Encryptor implements StringEncryptor {private static final SM4 SM_4;static {byte[] key = "1234567891234560".getBytes();byte[] iv = "1234567891234560".getBytes();SM_4 = new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv);}@Overridepublic String encrypt(String message) {return SM_4.encryptHex(message);}@Overridepublic String decrypt(String encryptedMessage) {return SM_4.decryptStr(encryptedMessage);}public static void main(String[] args) {String originalValue = "123456";String encrypted = SM_4.encryptHex(originalValue);String decrypted = SM_4.decryptStr(encrypted);log.info("Original Value: {}" , originalValue);log.info("Encrypted Value: {}" , encrypted);log.info("Decrypted Value: {}", decrypted);}}

(2)注册该bean 这需要使用特殊的方式注册bean 因为我们希望在 Spring Boot 应用程序启动期间提前将自定义的加解密类添加到 Spring 的应用程序上下文中,以便在配置文件加载之前,加解密类已经可用。这样可以确保配置文件中的加密属性能够在加载时使用正确的自定义加解密逻辑进行解密

新建初始化类

import com.stlye.encryptor.Sm4Encryptor;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;/*** @date 2023-08-21 13:57:20* @author leon*/
public class CustomContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {applicationContext.getBeanFactory().registerSingleton("encryptorBean", new Sm4Encryptor());}
}

其次在resource 下新建 META_INF文件夹 并新建 spring.factories 文件

org.springframework.context.ApplicationContextInitializer=com.style.order.config.CustomContextInitializer

(3)调整配置

#移除该配置 
jasypt.encryptor.password=12581#新增如下配置 自定义加解密工具的bean名称 
jasypt.encryptor.bean=encryptorBean

(4) 使用该工具类生成需要加密的内容 并替换 原配置文件中的内容

#其中cab60ba208f8a7d87c4f631e2763607a为源密码加密后的内容
spring.datasource.password=ENC(cab60ba208f8a7d87c4f631e2763607a)#另外属性解密的前缀和后缀都是支持自定义 默认如下
jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix=)

到这里就完成配置的文件的加密 你肯定会好奇,解密需要我们自己做么,回答当然不需要,这个框架中已经自动帮我们进行了解密

具体的实现原理可看源码类 EnableEncryptablePropertiesBeanFactoryPostProcessor 和 EncryptablePropertyResolverConfiguration 两大核心类 本质上来讲也是动态代理。

以下是国密4加密算法的参数介绍


密码的加密算法选择了 SM4 国密的对称加密算法

内置参数 模式和补码方式对比如下

//不同的模式和补码方式在加密算法中有不同的作用,它们会影响加密和解密的行为以及安全性。下面我会简要解释一下不同模式和补码方式的区别,并提供一些关于安全性的信息:
//
//**模式(Mode)**:
//加密模式定义了数据块之间是如何加密的,它影响到同一消息分成多个数据块时的加密方式。以下是一些常见的加密模式:
//
//1. **ECB(Electronic Codebook)**:每个数据块都独立加密,相同的输入会得到相同的输出。不适合加密大量数据,安全性较差。
//
//2. **CBC(Cipher Block Chaining)**:前一个数据块的加密结果会与当前数据块一起进行加密。需要一个初始化向量(IV)来增加安全性。
//
//3. **CFB(Cipher Feedback)**:前一个密文块被解密并与当前明文块进行异或操作,然后再进行加密。不需要 IV。
//
//4. **OFB(Output Feedback)**:类似于 CFB,但是前一个密文块只用于生成密钥流,不直接与明文块进行操作。不需要 IV。
//
//5. **CTR(Counter)**:将 IV 与一个计数器组合,生成密钥流,然后与明文块进行异或操作。不需要 IV。
//
//**补码方式(Padding)**:
//补码方式是在加密块大小与数据大小不匹配时,如何填充数据块的方式。以下是一些常见的补码方式:
//
//1. **NoPadding**:不进行任何填充,要求明文的大小必须是加密块大小的倍数。
//
//2. **PKCS5Padding** / **PKCS7Padding**:在数据块的末尾填充字节,字节的值等于需要填充的字节数。
//
//3. **ISO10126Padding**:在数据块的末尾填充随机字节,最后一个字节指示填充的字节数。
//
//4. **ZeroBytePadding**:在数据块的末尾填充零字节。
//
//**安全性评估**:
//安全性评估涉及多个因素,包括加密算法的强度、密钥的管理、数据传输的安全性等。在选择加密模式和补码方式时,要根据具体的应用场景和安全需求进行权衡。一般而言,以下是一些建议:
//
//- **模式选择**:CBC 模式相对较为常见和安全,适用于大多数场景。CTR 也是一种常见的选择,适合并行加解密。
//
//- **补码方式选择**:PKCS7Padding / PKCS5Padding 是常见的选择,它们会根据需要填充的字节数进行填充,相对比较安全。
//
//总之,选择加密模式和补码方式时,应该综合考虑性能、安全性和适用性。在设计和实现加密系统时,最好参考专业的加密标准和最佳实践,以确保数据的安全性。

其中安全性较高 mode参数可选择值的是 CBC / GCM

在国密4(SM4)加密算法中,GCM(Galois/Counter Mode)和CBC(Cipher Block Chaining)都是加密模式,用于定义不同的加密操作方式。它们有一些区别,包括加密过程、性能、安全性等方面。

  1. GCM模式(Galois/Counter Mode):

    • GCM是一种高级的分组加密模式,除了提供加密和解密功能外,还具有认证和完整性校验的能力。
    • GCM模式在加密过程中会使用一个称为"Nonce"的值,用于确保每个加密操作的唯一性,避免重复使用Nonce导致的安全问题。
    • GCM模式可以同时进行加密和认证,因此在一些场景中可以减少通信的复杂性和性能开销。
    • 由于GCM模式的性能较高且提供了认证能力,通常在需要较高性能和安全性的场景中被使用。
  2. CBC模式(Cipher Block Chaining):

    • CBC是一种较为传统的分组加密模式,每个分组的密文会依赖于前一个分组的明文,因此具有一定的关联性。
    • CBC模式需要在加密前进行填充操作,以适应固定长度的分组大小。
    • 由于每个分组的加密都依赖于前一个分组的密文,所以在并行处理时可能存在性能上的限制。
    • CBC模式通常需要额外的认证步骤来保证数据完整性和安全性。

性能方面,GCM模式通常在处理大量数据时具有更好的性能,因为它可以同时进行加密和认证,而且不需要像CBC那样需要明确的填充步骤。然而,由于GCM模式引入了额外的认证计算,对于较小的数据块,GCM的性能可能会略逊于CBC。

选择合适的加密模式取决于具体的应用场景和需求。如果你需要高性能和认证能力,可以考虑使用GCM模式。如果你更关注传统的分组加密模式,并且不需要认证能力,可以选择CBC模式。

GCM 由于使用一个称为"Nonce"的值,每次加密都需要保证唯一 ,每次需要新建实例 ,避免重复使用Nonce导致的安全问题 这就导致了性能来讲可能稍逊于 CBC 且GCM模式 不需要补码

相关文章:

spring boot集成jasypt 并 实现自定义加解密

一. 技术需求 由于项目中的配置文件 配置的地方过多&#xff0c;现将配置文件统一放到nacos上集中管理 且密码使用加密的方式放在配置文件中 项目中组件使用的版本环境如下 spring cloud 2021.0.5 spring cloud alibaba 2021.0.5.0 spring boot 2.6.13 二. 技术实现 配置文…...

Qt文件系统操作和文件的读写

一、文件操作类概述 QIODevice&#xff1a;所有输入输出设备的基础类 QFile&#xff1a;用于文件操作和文件数据读写的类QSaveFile&#xff1a;用于安全保存文件的类QTemporaryFile&#xff1a;用于创建临时文件的类QTcpSocket和QUdpSocket&#xff1a;分别实现了TCP和UDP的类…...

MME: A Comprehensive Evaluation Benchmark for Multimodal Large Language Models

本文也是LLM系列相关文章&#xff0c;针对《MME: A Comprehensive Evaluation Benchmark for Multimodal Large Language Models》的翻译。 MME:一个多模态大型语言模型的综合评估基准 摘要1 引言2 MME评估套件3 实验4 分析5 结论 摘要 多模态大语言模型&#xff08;MLLM&…...

学习开发振弦采集模块的注意事项

学习开发振弦采集模块的注意事项 &#xff08;三河凡科科技/飞讯教学&#xff09;振弦采集模块是一种用来实时采集和处理振弦信号的电子设备&#xff0c;在工业、航空、医疗等领域都有广泛应用。学习开发振弦采集模块需要注意以下几点&#xff1a; 一、硬件选择 首先需要选择…...

抵御时代风险:高级安全策略与实践

目录 网页篡改攻击 流量攻击 数据库攻击 恶意扫描攻击 域名攻击 在今天的数字时代&#xff0c;网站已经成为企业、机构和个人展示信息、交流互动的重要平台。然而&#xff0c;随着网络攻击技术的不断进步&#xff0c;网站也面临着各种安全威胁。本文将探讨五种常见的网络攻…...

(3)、SpringCache源码分析

1、入口说明 @EnableCaching是开启SpringCache的一个总开关,开启时候我们的缓存相关注解才会生效,所以我们@EnableCaching开始作为入口进行分析, 2、分析@EnableCaching注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(...

如何在 Ubuntu 中安装最新的 Python 版本

动动发财的小手&#xff0c;点个赞吧&#xff01; Python 是增长最快的主要通用编程语言。其原因有很多&#xff0c;例如其可读性和灵活性、易于学习和使用、可靠性和效率。 目前使用的 Python 有两个主要版本 – 2 和 3&#xff08;Python 的现在和未来&#xff09;&#xff1…...

等保测评--安全物理环境--测评方法

安全子类--物理位置选择 a)机房场地应选择在具有防震、防风和防雨等能力的建筑内; 一、测评对象 记录类文档和机房 二、测评实施 1)检查机房所在建筑物是否具有建筑物抗震设防审批文档; 2)检查机房门窗是否不存在因风导致的尘土严重; 3)检查机房是否不存在雨水渗漏…...

解决jmeter导入jmx文件报错方法

有的时候我们导入别人的jmx文件&#xff0c;但是在导入的时候会报错&#xff0c;如下图&#xff1a; 这是缺少jmeter插件jar包所引起的&#xff0c;下载对应jar包放到jmeter安装目录对应的lib/ext下就可以了。可以通过插件管理工具包下载安装&#xff0c;也可以直接下载对应的…...

CH32V307 开启浮点后rtthread的修改

官方版本是3.1.3&#xff0c;而且只有整数的&#xff0c;开启浮点后要做一些修改&#xff0c;这里问了官方并贴出来方便大家使用&#xff1a; 首先在mounriver开启浮点&#xff0c;步骤&#xff1a; 开启浮点&#xff1a;ide 开启float point->rvf, floating point abi->…...

网络面试题(172.22.141.231/26,该IP位于哪个网段? 该网段拥有多少可用IP地址?广播地址是多少?)

此题面试中常被问到&#xff0c;一定要会172.22.141.231/26&#xff0c;该IP位于哪个网段&#xff1f; 该网段拥有多少可用IP地址&#xff1f;广播地址是多少&#xff1f; 解题思路&#xff1a; 网络地址&#xff1a;172.22.141.192 10101100.00010110.10001101.11000000 广播…...

macOS nginx部署前端项目

1、安装nginx&#xff1b; brew install nginx2、配置nginx&#xff0c;主要配置代码&#xff0c;服务器代理 1、配置文件地址 根目录是 macOS 文件系统的最顶层目录。您可以在 Finder 中使用快捷键 Shift Command G&#xff0c;然后输入 /usr&#xff0c;即可直接打开 /u…...

管理类联考——逻辑——真题篇——按知识分类——汇总篇——二、论证逻辑——削弱——第一节 推理论证

文章目录 第七章 削弱质疑第一节 削弱-题型1-推理论证-论证为预测结果题-削弱质疑-预测-推理论证-分类1-削弱论点真题(2019-24)-削弱质疑-预测-推理论证-分类1-削弱论点真题(2019-42)-削弱质疑-预测-推理论证-分类1-削弱论点真题(2011-32)-削弱质疑-预测-推理论证-分类…...

LoRa 网络的高效自适应数据链路层架构

介绍 LoRa 是用于实现物联网的最流行的低功耗无线网络技术之一,与 Zigbee 或蓝牙等技术相比,其优点是提供远距离通信,但数据速率较低。LoRa 是一种单通道物理层技术,LoRaWAN 在此基础上实现了更复杂的多通道网络,并具有增强的功能,例如自适应数据速率。然而,LoRaWAN 依赖…...

Ubuntu软件源、pip源大全,国内网站网址,阿里云、网易163、搜狐、华为、清华、北大、中科大、上交、山大、吉大、哈工大、兰大、北理、浙大

文章目录 一、企业镜像源1、阿里云2、网易1633、搜狐镜像4、华为 二&#xff1a;高校镜像源1、清华源2、北京大学3、中国科学技术大学源 &#xff08;USTC&#xff09;4、 上海交通大学5、山东大学6、 吉林大学开源镜像站7、 哈尔滨工业大学开源镜像站8、 西安交通大学软件镜像…...

4 Python的函数

概述 在上一节&#xff0c;我们介绍了Python的数据类型&#xff0c;包括&#xff1a;数字、字符串、列表、元组、集合、字典等内容。在本节中&#xff0c;我们将介绍Python的函数。在Python中&#xff0c;函数是一段可以重复使用的代码块&#xff0c;它可以提高代码的可重用性和…...

Claude 2 国内镜像站

Claudeai是什么&#xff1f; Claude 2被称为ChatGPT最强劲的竞争对手&#xff0c;支持100K上下文对话&#xff0c;并且可以同时和5个文档进行对话&#xff0c;不过国内目前无法正常实用的&#xff0c;而claudeai是一个Claude 2 国内镜像站&#xff0c;并且免翻可用&#xff0…...

MySQL的基础操作

前言 对MySQL的一些基础操作做一下学习性的总结&#xff0c;基本上是照着视频写的。 MySQL的安装 MySQL的下载 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 配置环境变量 下载之后直接解压&#xff0c…...

Dockerfile快速搭建自己专属的LAMP环境

目录 编写Dockerfile 1.文件内容需求&#xff1a; 2.值得注意的是centos6官方源已下线&#xff0c;所以需要切换centos-vault源&#xff01; 3.Dockerfile内容 4.进入到 lamp 开始构建镜像 推送镜像到私有仓库 1.创建用户并添加到私有仓库&#xff1a;​编辑​编辑 2.推…...

秒懂算法│博弈论

博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论。博弈论是研究互动决策的理论。博弈可以分析自己与对手的利弊关系,从而确立自己在博弈中的优势,因此有不少博弈理论,可以帮助对弈者分析局势,从而采取相应策略,最终达到取胜的目的。…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...