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配置
配置文件里配置该算法加解密的盐值。jaspypt算法不需要我们自己实现,该第三方库已经实现了。我们仅需要配置这个盐值即可。
# 如果密文加盐,需要配置盐值
jasypt:encryptor:password: ueiej@8e8r
2.3 第三步:application.yml中密文替代明文。
配置文件里将加密后得到的密文用ENC(密文)方式配置即可。项目启动的时候,程序会自动去解析配置文件中值为ENC(密文)格式的配置,然后解密后加载程序。
数据的加密可以自己实现工具类来加密,或者一些在线网站提供jasypt的加解密,得到加密后的密文后,将密文替换明文即可。
例如:
password: ENC(UBHpSHxjL2F8ZiNTJUciZw==)
到此就全部结束了。项目启动的时候程序会自动去解密,并注入到实际的springApplication中。
优缺点
优点是引入第三方库,简单匹配一下即可,业务代码不需要任何改动。
缺点是把jasypt的盐放到配置文件中,那实际上你的加密数据也跟裸奔一样了,别人一样可以用这个jasypt解密得到你的数据库密码等加密数据。
3. 使用自定义加解密算法并自动装配
3.1 第一步:确定加解密规则,编写工具类
我们可以自定义加解密算法来实现数据的加解密,这里采用AES算法。工具类的代码省略。
3.2 第二步:实现EnvironmentPostProcessor
Spring Boot没有为加密属性值提供任何内置支持。 EnvironmentPostProcessor 接口允许你在应用程序启动前操作 Environment,可以用来修改Spring Environment 中包含的值。实现接口,并在接口里遍历所有的配置项,将指定的配置项解密后重新写入Environment。
示例:
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 配置文件密文替换明文
使用自定义的工具类将密码加密,得到密文。用密文替换配置中的密文。
这里我依然使用ENC(密文)的格式去配置,这个规则可以自己定义,只要修改DecryptEnvironmentPostProcessor的方法中的匹配逻辑即可。
例如:
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. 总结
建议用第三种方式,因为这种加密算法可以自定义,并且不需要把加解密的秘钥放到配置文件里,即便有人拿到配置文件,也无法得到真实的密码,更加的安全。
而且第三种方式对业务代码没有侵入,也不需要特定引入第三方库和配置其他东西。
相关文章:
Springboot-配置文件中敏感信息的加密:三种加密保护方法比较
一. 背景 当我们将项目部署到服务器上时,一般会在jar包的同级目录下加上application.yml配置文件,这样可以在不重新换包的情况下修改配置。 一般会将数据库连接、Redis连接等放到配置文件中。 例如配置数据库连接: spring:servlet:multip…...
linux 性能监控命令之dstat
1. dstat 系统默认为安装,直接安装阿里源后,yum install -y dstat安装即可,该命令整合了 vmstat , iostat 和 ifstat,我们先看下效果: 我们先看看具体参数: [rootk8s-master ~]# dstat --help …...
花趣短视频源码淘宝客系统全开源版带直播带货带自营商城流量主小游戏功能介绍
1、首页仿抖音短视频 ,关注 ,我的 本地 直播 可发布短视频 可录制上传 2、商城页面 广告位、淘口令识别、微信登录、淘宝登录、淘宝返佣、拼多多返佣、京东返佣、唯品会返佣、热销榜、聚划算、天猫超市、9.9包邮、品牌特卖、新人攻略 、小米有品、优惠加…...
大模型管理工具:Ollama
目录 一、Ollama 介绍 二、Linux 安装 Ollama 2.1 一键安装 2.2 手动安装 三、使用Ollama 3.1 配置模型下载路径 3.2 运行模型 3.3 常用命令 四、模型管理 4.1 官方模型库 4.2 导入自定义模型 五、REST API 六、Web UI 一、Ollama 介绍 Ollama 是一个基于 Go 语言…...
recycleView的item,TV正确方式获取焦点,以及刷新界面
如果你正需要recycleView的焦点 GlobalScope.launch (Dispatchers.Main){ // layout.isVisible truesettingBinding.rootLayout.isVisible truesettingBinding.rvSettingTab.layoutManager?.scrollToPosition(itemPositionSelect)if(!GlobalVariable.isT…...
QT内存管理机制
1.父子关系管理:Qt 对象之间可以建立父子关系。当一个对象是另一个对象的子对象时,父对象负责管理子对象的生命周期。当父对象被销毁时,它所拥有的子对象也会被销毁,从而释放相关的内存。这种机制简化了内存管理,确保在…...
亚马逊卖家,如何打造爆款,如何提高产品权重、曝光、流量?
新老卖家们要知道,亚马逊A9算法影响产品排名的关键因素:产品相关性、销售排名、产品价格、点击率、转化率、产品图片、买家评论、买家满意度、QA的答复情况、搜索结果页详细信息级别。亚马逊A9算法,是根据卖家提供的listing文案信息进行收录、…...
处理HTTP请求的服务器
处理HTTP请求的服务器,通常被称为HTTP服务器或Web服务器。其主要功能包括接收、解析、处理和响应HTTP请求。 HTTP服务器处理HTTP请求的基本流程: 接收请求:服务器监听特定的网络端口,等待客户端(如Web浏览器…...
打造本地GPT专业领域知识库AnythingLLM+Ollama
如果你觉得openai的gpt没有隐私,或者需要离线使用gpt,还是打造专业领域知识,可以借用AnythingLLMOllama轻松实现本地GPT. AnythingLLMOllama 实现本地GPT步聚: 1 下载 AnythingLLM软件 AnythingLLM官网地址: Anythi…...
数据可视化训练第6天(美国人口调查获得关于收入与教育背景的数据,并且可视化)
数据来源 https://archive.ics.uci.edu/dataset/2/adult 过程 首先;关于教育背景的部分翻译有问题。 本次使用字典嵌套记录数据,并且通过lambda在sorted内部进行对某个字典的排序,最后用plotly进行绘图 本次提取数据的时候,用到…...
如何更换远程服务器的Python版本
目录 前言 正文 尾声 🔭 Hi,I’m Pleasure1234🌱 I’m currently learning Vue.js,SpringBoot,Computer Security and so on.👯 I’m studying in University of Nottingham Ningbo China📫 You can reach me by url below:My Blo…...
Python 运筹优化13 Thompson Sampling 解读
说明 这部分应该是Multi-Armed Bandit的最后一部分了。 内容 1 On Line Ads 这个实验,最初的目的就是为了选出最佳的广告。首先,通过伯努利分布,模拟了某个广告的有效率。在真实场景里,我们是无法知道那个广告更好的。可能在t…...
计算机毕业设计 | SpringBoot健身房管理系统(附源码)
1,项目背景 随着人们生活水平的提高和健康意识的增强,健身行业逐渐兴起并迅速发展。而现代化的健身房管理系统已经成为健身房发展的必备工具之一。传统的健身房管理方式已经无法满足现代化健身房的需求,需要一种更加高效、智能、安全的管理系…...
大模型LLM 结合联网搜索增强isou
参考: https://github.com/yokingma/search_with_ai 在线使用网址: https://isou.chat/ 安装github下载,运行docker compose 如果一直报下面错误: 解决方法https://github.com/yokingma/search_with_ai/pull/7 默认打开&a…...
软删除和硬删除的区别及实际应用
在处理数据存储时,删除操作是不可避免的一部分。然而,并非所有的删除都是相同的。在本篇博客中,我们将探讨软删除(Soft Delete)和硬删除(Hard Delete)的概念、它们之间的区别,以及如…...
算法加密-简介
前言 在遥远的古代,信息的传递至关重要。战争时期,将领们需要确保自己的作战计划不被敌人知晓。 有一次,一位聪明的将军想要给远方的盟友传递一份机密战略部署。他想到了一个办法,用一种特殊的符号来替代文字。他和盟友事先约定好…...
搞懂Docker(九)- 使用Docker Compose
获取示例程序 示例程序 或者 示例程序 获取示例程序程序结构如下├── getting-started-app/ │ ├── package.json │ ├── README.md │ ├── spec/ │ ├── src/ │ └── yarn.lock使用Docker Compose Docker Compose是一个帮助你定义和共享多容器应用程序的工具…...
EOCRSP-40NM7施耐德电机保护器EOCR-SP
韩国三和EOCRSP-40NM7 40A AC220V电动机保护器 密集型设计 ■ 电子式多保护功能 ■ 宽的电流调整范围(10:1) ■ 电流表功能 ■ LED跳闸指示 ■ 高精度 ■ 手动即时复位 ■ 电动远距离复位 ■ 自检功能 ■ 强的环境适应性 ■ 低能耗 ■ 失效-安全工作方式(无电压释放) 韩国三和…...
一文带你快速了解GPT-4o!内含免费使用指南!
一、GPT-4o简介 北京时间5月14日,OpenAI举行春季发布会。OpenAI在活动中发布了新旗舰模型“GPT-4o”!据OpenAI首席技术官穆里穆拉蒂(Muri Murati)介绍,GPT-4o在继承GPT-4强大智能的同时,进一步提升了文本、…...
react18【系列实用教程】useState (2024最新版)
类似 vue 的 data 选项 功能 向组件添加响应式变量,当响应式变量变化时,组件的视图UI也会跟着变化【数据驱动视图】 语法 参数为变量的初始值返回值为一个只有两个元素的数组,第一项元素为传入的参数,第二项元素是一个setter 函数…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
OPENCV图形计算面积、弧长API讲解(1)
一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的API…...
Shell 解释器 bash 和 dash 区别
bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: 1. 基本区别 特性bash (Bourne-Again SHell)dash (Debian Almquist SHell)来源G…...
