Springboot-配置文件中敏感信息的加密:三种加密保护方法比较

一. 背景

当我们将项目部署到服务器上时,一般会在jar包的同级目录下加上application.yml配置文件,这样可以在不重新换包的情况下修改配置。

一般会将数据库连接,Redis连接等放到配置文件中。

例如配置数据库连接:

spring:servlet:multipart:max-file-size: 10MB # 文件大小限制max-request-size: 100MB # 请求大小限制datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456

这种方式存在安全隐患,如果配置文件泄露,就会造成数据库密码泄露。

所以需要将配置文件中数据库密码等敏感数据加密,然后在使用的时候解密后再使用。
推荐使用第三种方式。

二. 方法介绍

有三种方法:

1. 解密方法嵌入到业务逻辑代码中

例如我可以在service或者正常的业务代码中去加密后再使用。

但是这种和业务耦合度高,不推荐。

2. 使用jasypt

2.1 第一步:pom引入依赖
<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>2.1.2</version>
</dependency>
2.2 第二步:application.yml中增加jasypt配置

该算法加解密的盐值,算法不需要我们自己实现,该第三方库已经实现了。我们仅需要配置这个盐值即可。

# 如果密文加盐,需要配置盐值
jasypt:encryptor:password: ueiej@8e8r
2.3 第三步:application.yml中密文替代明文。

配置文件里将加密后得到的密文用ENC(密文)方式配置即可。

数据的加密可以自己实现工具类来加密,或者一些在线网站提供jasypt的加解密,然后将加密的密码替换明文密码。

password: ENC(UBHpSHxjL2F8ZiNTJUciZw==)

到此就全部结束了。项目启动的时候程序会自动去解密,并注入到实际的springApplication中。

优缺点

优点是业务代码不需要任何改动。

缺点是把jasypt的盐放到配置文件中,那实际上你的加密数据也跟裸奔一样了,别人一样可以用这个jasypt解密得到你的数据库密码等加密数据。

3. 使用自定义加解密并自动装配

3.1 第一步:确定加解密规则,编写工具类

我们可以自定义加解密算法来实现数据的加解密,这里采用AES算法。工具类的代码省略。

3.2 第二步:实现EnvironmentPostProcessor

Spring Boot没有为加密属性值提供任何内置支持。 EnvironmentPostProcessor 接口允许你在应用程序启动前操作 Environment,可以用来修改Spring Environment 中包含的值。实现接口,并在接口里遍历所有的配置项,将指定的配置项解密后重新写入Environment。

示例:

@Configuration
public class DecryptEnvironmentPostProcessor implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {Properties props = new Properties();  // 临时存储需要替换的配置// 假设加密密码前缀为 "ENC(",后缀为 ")"MutablePropertySources propertySources = environment.getPropertySources();for (PropertySource<?> propertySource : propertySources) {if (propertySource instanceof EnumerablePropertySource) {EnumerablePropertySource<?> enumerablePropertySource = (EnumerablePropertySource<?>) propertySource;String[] propertyNames = enumerablePropertySource.getPropertyNames();// 遍历所有配置key:valuefor (String propertyName : propertyNames) {String propertyVal = environment.getProperty(propertyName);// 根据自己写的规则来解析那些配置是需要解密的if (propertyVal != null && propertyVal.startsWith("ENC(") && propertyVal.endsWith(")")) {// 解析得到加密的数据String encryptedValue = propertyVal.substring(4, propertyVal.length() - 1);// 调用自定义工具类解密String decryptedValue = AESUtil.decryptEcbMode(encryptedValue);// 保存需要替换的配置props.put(propertyName, decryptedValue);}}}}// 添加解密后的属性到环境中if (!props.isEmpty()) {PropertiesPropertySource pps = new PropertiesPropertySource("decryptedProperties", props);environment.getPropertySources().addFirst(pps);}}
}
3.3 自动装配

resources/META-INF/spring.factories中注册EnvironmentPostProcessor

org.springframework.boot.env.EnvironmentPostProcessor=\  
your.package.DecryptEnvironmentPostProcessor

这里把自己实现的.DecryptEnvironmentPostProcesso的全路径放进去即可。

没有META-INF/spring.factories文件的,直接建好目录新增这个文件就行。

3.4 配置文件密文替换明文

使用自定义的工具类将密码加密,得到密文。用密文替换配置中的密文。

例如:

spring:  datasource:  password: ENC(你的加密密码)
注意事项

你可以写死你的加密的配置项,然后在postProcessEnvironme()方法里找到对应的配置项解密。或者你可以将加密的所有数据都用ENC(加密的数据)表示,然后在postProcessEnvironme方法里匹配后解密即可。当然这里的编写规则你可以自己定义,只要能匹配出来即可。

例如我的配置如下:

spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: ENC(UBHpSHxjL2F8ZiNTJUciZw==)

其中数据库的密码就是AES算法解密后的结果。

4. 总结

建议用第三种方式,因为这种加密算法可以自定义,并且不需要把加解密的秘钥放到配置文件里,即便有人拿到配置文件,也无法得到真实的密码,更加的安全。

而且第三种方式对业务代码没有侵入,也不需要特定引入第三方库和配置其他东西。

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

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

相关文章

排序-插入排序的优化--半插入排序

半插入排序&#xff08;有时也称为二分查找插入排序&#xff09;是对传统插入排序的一种优化。基本思想是在执行插入操作时&#xff0c;不是简单地从前向后遍历已排序序列来寻找插入位置&#xff0c;而是使用二分查找法来确定新元素的正确位置&#xff0c;从而减少比较次数&…

MSMQ消息队列

MQ是一种企业服务的消息中间节技术&#xff0c;这种技术常常伴随着企业服务总线相互使用&#xff0c;构成了企业分布式开发的一部分&#xff0c;如果考虑到消息的发送和传送之间是可以相互不联系的并且需要分布式架构&#xff0c;则可以考虑使用MQ做消息的中间价技术&#xff0…

Java高级开发2024高频面试提问题目

1、请先简单自我介绍一下自己&#xff1f;&#xff08;一般不超过5min&#xff09; 2、你最熟悉的项目是哪一个&#xff0c;讲一下用了哪些技术栈&#xff1f;&#xff08;尽量讲出系统架构图使用到的技术组件和为什么选型这个组件&#xff1f;&#xff09; 3、你项目中使用什…

如何给远程服务器配置代理

目录 前言 正文 更换镜像源 开始之前 安装过程 遇到的问题 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4…

TFN CK1840B 喇叭天线 定向 18GHz~40GHz

沃比得 CK1840B 喇叭天线 定向 18GHz~40GHz 产品概述 沃比得 CK1840B喇叭天线工作频率为 18GHz~40GHz。具有频带宽&#xff0c; 性能可靠&#xff0c; 增益高等优 点&#xff0c; 是理想的 EMC 测试、电子对抗等领域的定向接收、发射天线。 应用领域 ● 电子对抗领域 ● EM…

NPDP考完后多久出结果?(内附查成绩流程)

NPDP全称为New Product Development Professional&#xff0c;也叫产品经理国际资格认证。为了获得NPDP认证&#xff0c;不少人都在报考NPDP考试&#xff0c;那么NPDP考试一般多长时间出成绩呢&#xff1f; NPDP考试成绩查询时间&#xff1a; 一般在考试结束后的4-6周左右进行…

IT服务台的演变趋势

在技术进步和用户期望变化的推动下&#xff0c;IT服务台正在经历重大变化。IT服务台的未来将主要受到以下趋势的推动&#xff1a; 先进的人工智能和认知技术 预计高级人工智能 &#xff08;AI&#xff09; 和认知技术在 IT 服务台中的集成度会更高。通过将 IT 服务台集成到 IT…

Matlab简介应用和绘制函数图像教程具体案例

MATLAB是由美国MathWorks公司出品的商业数学软件,其名称是matrix & laboratory两个词的组合,意为“矩阵工厂(或矩阵实验室)”。MATLAB主要用于算法开发、数据可视化、数据分析以及数值计算等领域,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一…

PMC高手如何玩转跨部门协作?让团队和谐共生

PMC&#xff08;生产与物料控制&#xff09;作为连接生产与供应链的关键部门&#xff0c;其与其他部门之间的协作关系显得尤为重要。本文&#xff0c;深圳天行健精益管理咨询公司分享具体方法如下&#xff1a; 首先&#xff0c;PMC需要明确自己的角色定位。作为生产与供应链之间…

Ubuntu 系统中设置中文输入法

在 Ubuntu 系统中设置中文输入法&#xff0c;通常涉及以下几个步骤&#xff1a; 添加中文语言支持&#xff1a; 打开系统设置&#xff08;Settings&#xff09;&#xff0c;选择“Region & Language”。点击“Manage Installed Languages”&#xff0c;搜索并安装“Chinese…

Flutter不常用组件----IntrinsicHeight,IntrinsicWidth

终于有勇气做一些不常用组件的博文&#xff0c;最近行情不景气&#xff0c;大家的工作应当也是不少&#xff0c;笔者也是一样。之前筹备了好久想着做一些不常用的组件分享&#xff0c;一直没付诸于行动。现在打算开始慢慢做起来&#xff0c;各位粉丝如果有是一些使用场景代码繁…

Redis经典问题:数据并发竞争

大家好,我是小米!今天我们要聊的话题是在大流量系统中常见的一个问题:数据并发竞争。不管是火车票系统还是微博系统,一旦出现数据并发竞争,都可能导致用户体验下降,甚至系统崩溃。那么,我们该如何解决这个问题呢?让我们一起来深入探讨! 数据并发竞争 当我们谈论大流…

代码随想录:长度最小的子数组相关题目推荐(904、76)

904.水果成篮 题目 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须…

三. TensorRT基础入门-ONNX注册算子的方法

目录 前言0. 简述1. 执行一下我们的python程序2.转换swin-tiny时候出现的不兼容op的例子3. 当出现导出onnx不成功的时候&#xff0c;我们需要考虑的事情4. unsupported asinh算子5. unsupported deformable conv算子总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战…

MR混合现实情景实训教学系统在室内设计课堂上的应用

MR混合现实情景实训教学系统在室内设计课堂上的应用可以带来许多积极的影响&#xff0c;包括提高学生的参与度、增强学生的实践技能、以及提供更真实和全面的学习体验。 首先&#xff0c;MR混合现实情景实训教学系统能够创建出一种沉浸式的环境&#xff0c;使学生能够直接接触到…

EmotiVoice 实时语音合成TTS

参考:https://github.com/netease-youdao/EmotiVoice 测试整体速度可以 docker安装: 运行容器:默认运行了两个服务,8501 一个streamlit页面,另外8000是一个api接口服务 docker run -dp 8501:8501 -p 8250:8000 syq163/emoti-voice:latest ##gpu运行 docker run --gpus a…

前端页面 贴边拖拽 盒子

vue 悬浮球(带自动吸附功能)_vue悬浮球-CSDN博客

windows内存管理-检查内存可用性

在驱动程序开发中&#xff0c;对内存的操作要格外小心。如果某段内存是只读的&#xff0c;而驱动程序试图去写操作&#xff0c;会导致系统的崩溃。同样&#xff0c;当某段内存是不可读的情况下&#xff0c;驱动程序试图去读&#xff0c;同样会导致系统的崩溃。 DDK提供了两个函…

第四届微调——炼丹

学习地址&#xff1a;Tutorial/xtuner/README.md at main InternLM/Tutorial GitHub 笔记 微调是一种在已有的预训练模型基础上&#xff0c;通过使用新的数据对模型进行进一步优化和调整的技术手段。它的目的是使模型能够更好地适应特定的应用场景和任务需求&#xff0c;进一…

基础ArkTS组件:帧动画,内置动画组件,跑马灯组件(HarmonyOS学习第三课【3.6】)

帧动画 帧动画也叫序列帧动画&#xff0c;其原理就是在时间轴的每帧上逐帧绘制不同的内容&#xff0c;使其连续播放而成动画。ArkUI开发框架提供了 ImageAnimator 组件实现帧动画能力&#xff0c;本节笔者介绍一下 ImageAnimator 组件的简单使用。 官方文献 说明 该组件从A…