对SpringBoot配置文件配置项加密原理

参考认识BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor - 知乎

SpringBoot 之 Jasypt 实现yml配置文件加密_-djasypt.encryptor.password-CSDN博客

【springboot】jasypt加密_jasypt.encryptor.password-CSDN博客

实现:

导包:

使用说明参考GitHub - ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot

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

生成加密后的配置value:

public class EncryptionUtil {//https://blog.csdn.net/qq_41055045/article/details/126740841public static void main(String[] args) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();// 加密方式config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");// 盐值config.setPassword("salt");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);// 加密明文String encryptValue1 = encryptor.encrypt("root");String encryptValue2 = encryptor.encrypt("root");System.out.println(encryptValue1);System.out.println(encryptValue2);// 解密密文String decryptValue = encryptor.decrypt("1B94SNKIuVmRNKeNmd2dkvAJTCilDPlof8l/FroMMYrH/nxXDf1OPdlUYkbBXB48");System.out.println(decryptValue);}}

配置文件片段:

spring:datasource:primary:jdbc-url: jdbc:postgresql://localhost:5432/test?characterEncoding=utf8&useSSL=trueusername: postgrespassword: ENC(76va5Nw3V+NjHHPh0Ekei7hwitxCAYCzEIpoJLYMOebc+VbCm66hYWm12+AWoKcO) #roottype: com.alibaba.druid.pool.DruidDataSourcehikari:driver-class-name: org.postgresql.Driversecondary:jdbc-url: jdbc:sqlserver://localhost:1433;DatabaseName=test;Trusted_Connection=Trueusername: sapassword: ENC(H0MxJHbEiwXXiRp09UwEbU91HcNiufhAUTeIrptzW5vLllycbWodE0BgIxtDAoU7) #roottype: com.alibaba.druid.pool.DruidDataSourcehikari:driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
#参考
#https://zhuanlan.zhihu.com/p/653695574
#https://blog.csdn.net/qq_41617261/article/details/121448939
jasypt:encryptor:password: ${ENCRYPT:salt}

原理:

主要思路是实现了BeanFactoryPostProcessor,再装饰容器中原来的PropertySource类。   

参考认识BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor - 知乎 

BeanFactoryPostProcessor位于org.springframework.beans.factory.config包中。它与BeanPostProcessor有相似的核心逻辑,但它们之间的主要区别在于它们所操作的对象。BeanFactoryPostProcessor的主要目的是对Bean的配置元数据进行操作,这意味着它可以影响Bean的初始配置数据。

在Spring IoC容器实例化beans之前,特别是除了BeanFactoryPostProcessor之外的其他beans,BeanFactoryPostProcessor有权利修改这些beans的配置。在Spring中,所有的beans在被完全实例化之前都是以BeanDefinition的形式存在的。BeanFactoryPostProcessor为我们提供了一个机会,使我们能够在bean完全实例化之前调整和修改这些BeanDefinition。对BeanDefinition的任何修改都会影响后续的bean实例化和初始化过程。

 源码解析:

package com.ulisesbocchio.jasyptspringboot.configuration;import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyResolver;
import com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;/*** <p>{@link BeanFactoryPostProcessor} that wraps all {@link PropertySource} defined in the {@link Environment}* with {@link com.ulisesbocchio.jasyptspringboot.wrapper.EncryptablePropertySourceWrapper} and defines a default {@link* EncryptablePropertyResolver} for decrypting properties* that can be configured through the same properties it wraps.</p>* <p>* <p>It takes the lowest precedence so it does not interfere with Spring Boot's own post processors</p>** @author Ulises Bocchio*/
@Slf4j
public class EnableEncryptablePropertiesBeanFactoryPostProcessor implements BeanFactoryPostProcessor, Ordered {private final ConfigurableEnvironment environment;private final EncryptablePropertySourceConverter converter;public EnableEncryptablePropertiesBeanFactoryPostProcessor(ConfigurableEnvironment environment, EncryptablePropertySourceConverter converter) {this.environment = environment;this.converter = converter;}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {log.info("Post-processing PropertySource instances");MutablePropertySources propSources = environment.getPropertySources();//得到原始配置类,再做替换converter.convertPropertySources(propSources);}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE - 100;}
}

com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter#makeEncryptable 

方法内部得到PropertySource包装类 EncryptableMapPropertySourceWrapper内部封装了CachingDelegateEncryptablePropertySource,CachingDelegateEncryptablePropertySource内部封装了EncryptablePropertyResolver

    public <T> PropertySource<T> makeEncryptable(PropertySource<T> propertySource) {if (propertySource instanceof EncryptablePropertySource || skipPropertySourceClasses.stream().anyMatch(skipClass -> skipClass.equals(propertySource.getClass()))) {if (!(propertySource instanceof EncryptablePropertySource)) {log.info("Skipping PropertySource {} [{}", propertySource.getName(), propertySource.getClass());}return propertySource;}PropertySource<T> encryptablePropertySource = convertPropertySource(propertySource);log.info("Converting PropertySource {} [{}] to {}", propertySource.getName(), propertySource.getClass().getName(),AopUtils.isAopProxy(encryptablePropertySource) ? "AOP Proxy" : encryptablePropertySource.getClass().getSimpleName());return encryptablePropertySource;}

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

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

相关文章

Gitlab不允许使用ssh拉取代码的解决方案

一、起因 之前一直是用ssh进行代码拉取&#xff0c;后来公司搞网安行动&#xff0c;不允许ssh进行连接拉取代码了 因为我是用shell写了个小型的CI/CD,部署前端项目用于后端联调的&#xff0c;因此在自动部署时&#xff0c;不方便人机交互&#xff0c;所以需要自动填充账密。 …

ZLMediaKit cmake 编译 要点

# 加载自定义模块 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") project(ZLMediaKit LANGUAGES C CXX) # 使能 C11 set(CMAKE_CXX_STANDARD 11) ############################### SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_SYSTEM_PROCESS…

护网2024-攻防对抗解决方案思路

一、护网行动简介 近年来&#xff0c;网络安全已被国家上升为国家安全的战略层面&#xff0c;网络安全同样也被视为维护企业业务持续性的关键。国家在网络安全治理方面不断出台法规与制度&#xff0c;并实施了一些大型项目和计划&#xff0c;如网络安全法、等级保护、网络安全…

【UE C++】 虚幻引擎C++开发需要掌握的C++和U++的基础知识有哪些?

目录 0 引言1 关键的 C 知识2 Unreal Engine 相关知识3 学习建议 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;【UE C】 虚幻引擎C开发需要掌握的C和U的基础知识有哪些&#xff1f;❣️ 寄语&…

【MySQL精通之路】安全(1)-安全指南

任何在连接到Internet的计算机上使用MySQL的人都应该阅读本节&#xff0c;以避免最常见的安全错误。 在讨论安全性时&#xff0c;有必要考虑充分保护整个服务器主机&#xff08;而不仅仅是MySQL服务器&#xff09;免受所有类型的适用攻击&#xff1a;窃听、更改、播放和拒绝服…

kafkastream

kafkastream的介绍&#xff1a; Kafka Streams是一个开源的流处理库&#xff0c;用于构建实时数据流应用程序和微服务。它是Apache Kafka项目的一部分&#xff0c;是一种基于事件驱动的流处理解决方案。 Kafka Streams提供了高级别的API&#xff0c;使开发人员能够以简单和声…

什么情况下JVM内存中的一个对象会被垃圾回收?

什么情况下JVM内存中的一个对象会被垃圾回收? 1、什么时候会触发垃圾回收?2、被哪些变量引用的对象是不能回收的?3、Java中对象不同的引用类型4、finalize()方法的作用1、什么时候会触发垃圾回收? 平时我们系统运行创建的对象都是优先分配在新生代里的,如图: 然后如果…

【Oracle】PL SQL 怎么重新编译无效的对象

1.打开PL SQL &#xff0c;点击图中有红色的 2.点击齿轮按钮即可 from&#xff1a;【Oracle】PL SQL 怎么重新编译无效的对象_plsql编译无效对象的按钮在哪里-CSDN博客

redis查看一个key占用了多少内存

Redis 本身并没有直接提供一个命令来查看一个特定的 key 占用了多少内存。但是&#xff0c;你可以通过一些间接的方法来估算这个值。 以下是一些建议的方法&#xff1a; 使用 DEBUG OBJECT 命令&#xff1a; 虽然这不是一个官方推荐或稳定的命令&#xff0c;但在某些 Redis …

最新php项目加密源码

压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。源码全开源 如果上传的压缩包里有子文件夹&#xff08;子文件夹里的php文件也会被加密&#xff09;&#xff0c;加密后的压缩包需要先修复一下&#xff0c;步骤&#xff1a;打开压缩包 》 工具 》 修复压缩文件…

AIGC 010-CLIP第一个文本和图像对齐的大模型!

AIGC 010-CLIP第一个文本和图像对齐的大模型&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 不客气的说CLIP和扩散模型的成功让计算式视觉领域几乎所有工作都重新做了一遍。 CLIP&#xff08;对比语言-图像预训练&#xff09;论文提出了一种新的对比学习方法&a…

28-ESP32-S3 lwIP 轻量级 TCP/IP 协议栈

ESP32-S3 lwIP 介绍 ESP32-S3 是一款集成了Wi-Fi 和蓝牙功能的微控制器。它的设计初衷是为了方便嵌入式系统的开发。不过你可能会好奇&#xff0c;ESP32-S3 怎么实现与外部网络的通信呢&#xff1f;这里就要提到一个开源的 TCP/IP 协议栈&#xff0c;它叫做lwIP&#xff08;轻…

博客系统多模块开发

创建工程 创建父工程 删除src目录&#xff0c;在pom.xml添加依赖&#xff1a; <!--统一版本 字符编码--><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.b…

使用 Flask 和 Vue.js 构建 Web 应用

文章目录 入门1. 设置 Flask 后端2. 设置 Vue.js 前端 将 Flask 与 Vue.js 集成1. 配置 Flask 来提供 Vue.js 文件2. 构建 Vue.js 组件3. 运行应用程序 结论 在现代 Web 开发中&#xff0c;创建动态和响应式的应用通常涉及将后端框架如 Flask 与前端库如 Vue.js 结合起来。这种…

职责链设计模式

职责链设计模式&#xff08;Chain of Responsibility Design Pattern&#xff09;是一种行为设计模式&#xff0c;使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合。这些对象被链接成一条链&#xff0c;沿着这条链传递请求&#xff0c;直到有一…

2024年5月20日 (周一) 叶子游戏新闻

报告老板&#xff0c;现在就加班&#xff01;《职场浮生记》抢先体验版现已上线今天由LeiYun Games开发&#xff0c;2P Games发行的《职场浮生记》正式在Steam平台推出抢先体验版。玩家将跟随主角的步伐踏入一个最为真实的职场环境之中&#xff0c;在生活与工作之间找寻平衡&am…

数据库多表查询

多表查询&#xff1a; SELECT *FROM stu_table,class WHERE stu_table.c_idclass.c_id; 多表查询——内连接 查询两张表交集部分。 隐式内连接&#xff1a; #查询学生姓名&#xff0c;和班级名称&#xff0c;隐式调用 SELECT stu_table.s_name,class.c_name FROM stu_table…

Linux管理文本文件002

今天简单和大家分享一些管理文本文件的指令 1、查看文件类型 file 1&#xff09;file /etc/passwd 文本文件 2&#xff09;File /dev/sda 块设备&#xff08;磁盘&#xff09; 3&#xff09;File /dev/tty 字符设备&#xff08;鼠标&#xff09; 4&#xff09;File /usr/…

力扣hot100学习记录(七)

240. 搜索二维矩阵 II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 题意 在二维矩阵中搜索是否存在一个目标值&#xff0c;该矩阵每一行每一列都是升序…

谷歌推出TransformerFAM架构,以更低的消耗处理长序列文本

Transformer对大模型界的影响力不言而喻&#xff0c;ChatGPT、Sora、Stable Difusion等知名模型皆使用了该架构。 但有一个很明显的缺点&#xff0c;其注意力复杂度的二次方增长在处理书籍、PDF等超长文档时会显著增加算力负担。 虽然会通过滑动窗口注意力和稀疏注意力等技术…