Springboot 配置文件脱敏的实践

news2024/12/30 2:21:42

写作目的

数据安全这块还是挺严重的,尤其是自己专注于业务开发,不能总停留在一个地方,还要关注其他的一些问题,比如数据安全。

配置脱敏

实现配置的脱敏我使用了Java的一个加解密工具Jasypt。该工具支持对称加密和非对称加密。
首先通过简单的demo配置进行配置和测试。

1、首先引入jasypt-spring-boot-starter

<!--配置文件加密-->
 <dependency>
     <groupId>com.github.ulisesbocchio</groupId>
     <artifactId>jasypt-spring-boot-starter</artifactId>
     <version>2.1.0</version>
 </dependency>

2、接下来就是application的配置,如下面代码所示。其中password是密钥,即类似于MD5盐值加密的盐;prefixsuffix*为判断要解密的规则条件或正则表达式

jasypt:
  encryptor:
    password: demo   # 秘钥
    property:
      prefix: "abc["  #前缀
      suffix: "]"     #后缀

3、配置好后我们就需要在配置文件中配置加密后的数据了,如下面的数据库密码

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: abc[B6jeXwl1AotiulW1vfsKmQ==]   ### 前缀和后缀包围着密文
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

那么这串密文是怎么来的呢?

    System.out.println("--------------加密----------------");
    StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
    // 秘钥
    standardPBEStringEncryptor.setPassword("demo");
    // 明文进行加密
    String code = standardPBEStringEncryptor.encrypt("123456");
    System.out.println(code);
    System.out.println("--------------解密----------------");
    // 解密
    String decrypt = standardPBEStringEncryptor.decrypt(code);
    System.out.println(decrypt);

结果为
在这里插入图片描述

4、接下来就是启动项目了。

整个配置文件脱敏的配置就算完成了。其实就是两步。配置jasypt的密钥、前缀和后缀等信息;获取加密后的数据(如本文中的数据库密码信息)

脱敏原理

添加BeanFactoryPostProcessor

既然是以springboot方式集成,那么就先从jasypt-spring-boot-starter源码开始入手。该starter中会有一个spring.factories文件,文件中会配置自动装配的类,即JasyptSpringBootAutoConfiguration
该类又通过Import注解引入了EnableEncryptablePropertiesConfiguration

其中EnableEncryptablePropertiesConfiguration主要向ioc容器中注入了一个EnableEncryptablePropertiesBeanFactoryPostProcessor,其中一个参数为environment,如下图所示,我们只要把这个类搞明白就理解核心了。
在这里插入图片描述

该BeanFactoryPostProcessor的目的

那么EnableEncryptablePropertiesBeanFactoryPostProcessor是什么呢?那就要看他实现的接口,该类实现了BeanFactoryPostProcessor接口,那么我们有理由去看postProcessBeanFactory方法(Spring的生命周期知识点)。
在postProcessBeanFactory方法里,该方法的主要逻辑为获取environment的propSources并进行convert转换,如下图所示。
在这里插入图片描述

propSources是什么?

propSources其实是环境变量文件或者配置文件的集合。如下图所示。我们直接下标为6的元素里的数据,其实可以发现下标为6的元素对应的就是我们的application.yml
在这里插入图片描述
其实EnableEncryptablePropertiesBeanFactoryPostProcessor获取上述的环境变量文件或者配置文件的数据也可以理解,毕竟你需要对里面的数据进行加密和解密,你不拿到数据怎么加密和解密呢?

convert动作的逻辑是什么?

convert的代码如下图所示,对于propSources里的每一个元素ps,都通过makeEncryptable方法转换为一个新的对象,并替换掉原来的ps
在这里插入图片描述
那么makeEncryptable方法是怎么替换的?一直跟上面的convert最后到了下图中的方法。其实就是把propertySource对象进行包装Wrapper,然后替换掉原来的propertySource对象。
在这里插入图片描述
当我们想获取某个配置文件中的kv时,再调用getProperty时其实已经走EncryptablePropertySourceWrapper的getProperty方法了(因为上面被替换了)。

获取配置文件的kv进行过滤和解密

当然经过各种实现类和实现类里依赖的其他接口的实现类,最后getProperty的方法会到下面的方法里,如下面代码所示,其实就是先在原始source获取数据,然后判断是否需要解密,需要的话就直接把解密后的数据返回,完美了。

#EncryptablePropertySource
    default Object getProperty(EncryptablePropertyResolver resolver, EncryptablePropertyFilter filter, PropertySource<T> source, String name) {
        Object value = source.getProperty(name);
        if (filter.shouldInclude(source, name) && value instanceof String) {
            String stringValue = String.valueOf(value);
            return resolver.resolvePropertyValue(stringValue);
        }
        return value;
    }

总结

注册一个BeanFactoryPostProcessor
在postProcessBeanFactory方法里对propSources进行包装为propSourcesWrapper
在获取配置文件时对propSourcesWrapper进行获取数据,当符合解密规则时进行解密

参考

Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)

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

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

相关文章

pytorch基础学习-tensorboardX

最近训练总是出问题&#xff0c;听取建议&#xff0c;在pytorch环境下引入了tensorboard 1、安装tensorboardX tensorboardX是在tensorboard前提下进行安装的&#xff0c;所以我们需要先安装tensorboard pip install tensorboardpip install tensorboardX2、简单使用 这里我…

应急响应-windows

win系统常见的安全事件 1.病毒&#xff0c;木马&#xff0c;蠕虫事件 2.web服务器入侵事件或第三方服务入侵事件 3.系统入侵事件&#xff0c;用win漏洞入侵系统&#xff0c;利用弱口令等。 4.网络攻击事件&#xff0c;如DDos&#xff0c;ARP欺骗等。 win系统安全事件发现的…

基于自适应反馈调节因子的阿基米德优化算法(IAOA)-附代码

基于自适应反馈调节因子的阿基米德优化算法(IAOA) 文章目录 基于自适应反馈调节因子的阿基米德优化算法(IAOA)1.阿基米德优化算法2. 改进阿基米德优化算法2.1 佳点集种群初始化2.2 自适应反馈调节因子2.3 莱维旋转变换策略 3.实验结果4.参考文献5.Matlab代码6.Python代码 摘要&…

软考A计划-试题模拟含答案解析-卷七

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Maven学习笔记(单一架构案例)22版

第一节 创建工程&#xff0c;引入依赖 1 架构 ①架构的概念 『架构』其实就是『项目的结构』&#xff0c;只是因为架构是一个更大的词&#xff0c;通常用来形容比较大规模事物的结构。 ②单一架构 单一架构也叫『all-in-one』结构&#xff0c;就是所有代码、配置文件、各种…

基于hdoop的短视频用户画像研究_kaic

基于hadoop的短视频用户画像研究 摘 要 在这个互联网迅速发展的时代&#xff0c;网络和信息技术都跟上了时代的潮流&#xff0c;在互联网中的用户数据也出现了爆炸性的增长。用户的各种日常行为都通过互联网被记录下来&#xff0c;对于所有的互联网企业来说&#xff0c;想要从…

TCP报文中序列号的作用

TCP&#xff08;传输控制协议&#xff09;中的序列号用于标识TCP报文段中的数据部分。每个TCP报文段都包含一个序列号字段&#xff0c;该字段指示了报文段中第一个字节的序号。在后续的报文段中&#xff0c;序列号将递增&#xff0c;以指示下一个字节的序号。 TCP序列号是一个…

升级Springboot2.7.11之后内嵌tomcat启动成功, 但访问任何接口都是404

背景 最近项目在升级JDK17, 但原先低版本Springboot不能识别jdk17编译的字节码, 为了能够使用JDK17的语法, 因此对SpringBoot也做了升级, 直接升级到了SpringBoot 2.7.11版本. 对一些变更修改升级完成后, 本地启动服务运行, 一切正常!!! 于是发布到公司的容器环境运行, 发布平…

queue的常见接口说明(基于c++标准库的STL)

前言 队列是一种容器适配器&#xff0c;专门用于先进先出&#xff08;FIFO&#xff09;的操作中 &#xff0c;其容器从一端插入数据&#xff0c;从另一端取出数据。队列作为一种容器适配器实现&#xff0c;容器适配器即将特定的容器封装起来&#xff0c;queue提供一组特定的成员…

LBM-BGK计算泊肃叶流动

LBM在计算泊肃叶流动时&#xff0c;需要添加外力项&#xff0c;这部分网上没什么资料&#xff0c;仅有的资料也写的模糊不清&#xff0c;这里点名批评这个知乎博文。 有些地方字母都对不上。。。 本站上也有一篇博文&#xff0c;写的也比较一般&#xff0c;但是代码是多松弛MR…

测试C#分词工具jieba.NET(续2:其它用法)

jieba.NET除分词和关键词提取功能之外&#xff0c;还有一些其它用法&#xff0c;本文基于参考文献学习并记录。 设置停用词 提取关键词时&#xff0c;部分词语可能不重要或者并非所需的词语&#xff0c;此时可以通过设置停用词&#xff0c;在提取关键词时过滤掉指定的停用词。…

【笔记整理】图神经网络学习

【笔记整理】图神经网络学习 文章目录 【笔记整理】图神经网络学习一、GNN简介1、图结构 & 图基础算法1&#xff09;引言&#xff08;"非欧几何, 处理图数据的NN"&#xff09;2&#xff09;图基本概念 & 分类&#xff08;"邻接矩阵, 图结构分类"&a…

搭建springboot工程_学习笔记

2.搭建springboot环境 2.1 使用maven项目 在pox.xml文件中加入parent <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version></parent>在pom…

chatgpt赋能python:Python中8%3的运算:一种常见的数学问题

Python中8%3的运算&#xff1a;一种常见的数学问题 在Python中&#xff0c;8%3是一种常见的数学问题。在本文中&#xff0c;我们将介绍Python中的这种运算符以及它的用途。 什么是8%3&#xff1f; 百度百科给出的解释是&#xff1a; 求余运算符&#xff08;%&#xff09;用来…

为什么要“内卷”创始人?如何内卷?

受疫情影响&#xff0c;近几年各个行业都受到很大的冲击&#xff0c;同时有许多知识创业者反而逆势增长&#xff0c;这是为什么呢&#xff1f;因为有一个好的领导者&#xff01;一家企业的发展&#xff0c;和创始人的心力和决心紧密联系着&#xff0c;只有好的将军才能带领出好…

【社群运营】关于社群运营的一些学习和思考

社群运营 运营流程&#xff08;自己&#xff09;背景流程过去经验1.你觉得社群最重要的价值是什么&#xff1f;对个人对DW 2.学习社群组织好哪些环节你觉得非常重要&#xff1f;3.这些环节有没有比较好的运营经验/方法&#xff1f;价值共鸣情感共鸣精神共鸣 社群总结 运营流程&…

《数据库应用系统实践》------ 超市管理系统

系列文章 《数据库应用系统实践》------ 超市管理系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&#xff…

剑指 Offer 11. 旋转数组的最小数字解题思路

文章目录 题目解题思路优化 题目 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers &#xff0c;它原来是一个升序排列的数组&#xff0c;并按上述情形进行了一次旋转。请返回旋转数组的最小元素。…

直流电机 PID 开发指南学习笔记

直流电机 PID 开发指南 &#xff08;基于【平衡小车之家】直流电机 PID 学习套件 1.0&#xff09; 目录 1.位置闭环控制 1.1 理论分析 1.2 控制原理图 1.3 C 语言实现 1.4 参数整定 2.速度闭环控制 2.1 理论分析 2.2 控制原理图 2.3 C 语言实现 PID 调节器出现于上世…

keepalived脑裂后,近20min不能访问虚拟IP事故分析

问题现象和说明 真实的场景比较复杂&#xff0c;抽象起来可以用下面的图表示&#xff0c; #mermaid-svg-q8mZrLctqAENT1r0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-q8mZrLctqAENT1r0 .error-icon{fill:#5522…