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

网络安全——SpringBoot配置文件明文加密

一、前言

在日常开发中,项目中会有很多配置文件。比如SpringBoot项目核心的数据库配置、Redis账号密码配置都在propertiesyml配置文件

中。 如果这些信息以明文的方式存储,你的电脑被拿去修理,就会容易泄露,一旦被其他人获取到……你懂得…… 那么如何将配置文件

中的明文信息加密存储就变得至关重要,让我们一起来看下吧。

二、加密方式介绍

你想给你的兄弟分享你的考验资料,为了保证安全性,你选择使用加密。

为了保证安全性不能让人随便看到,是首先使用对称加密。你给它设置一个了密码。但是你在发送过程中内容被隔壁张三截获,在你告知

你兄弟密码的过程,又被截获,然后……你的考验资料泄露…

你被你兄弟臭骂了一顿,你灵机一动使用了另外一种方式:非对称加密。首先你让兄弟准备两把钥匙,自己留一把,然后另一把传输给你

使用它内容加密,最后再把加密的内容传输给你兄弟。这过程无论是钥匙还是加密内容都不担心被截获,因为只有你兄弟手中的那把钥匙

才能解密。你兄弟安全的收到考验资料,并没有泄露。你以为这种方式却对的安全,可以高枕无忧了……

但是有天你的兄弟背叛了你,把你的考验资料公之于众!

此时你才恍然大悟,这世界上根本没有绝对安全的加密方式!再可靠的加密,也挡不住捉摸不透的人心! 所以你决定,将考验资料永久

封存!你选择了哈希加密这种方式,它只管加密,不管解密!

(1)对称加密:

对称加密就相当于一个带锁宝箱,这个钥匙就是密钥(或者被称为盐值)。如果你想让别人想看的话,必须把钥匙给对应的人。这是最常

见的、最方便的加密方式。常见的对称加密算法包括 DES3DESAES

优点:
  • 强度和速度: 对称加密的优点是速度快,适用于大量数据的加密和解密。
缺点:

  秘钥管理: 对称加密的关键在于密钥的管理。为了确保安全性,密钥必须在发送者和接收者之间安全地共享。但是,如果共享又是

一个问题,密钥一旦泄露,安全防线被攻陷,这又是个问题!。

(2)非对称加密:

你手中的钥匙被称为公钥,用来把宝箱锁上。你兄弟手中的钥匙被称为私钥,要想打开宝箱,必须要有对应的私钥才行!

优点:
  • 安全性: 非对称加密提供了更高的安全性,因为私钥是保密的,只有拥有私钥的人可以解密密文。
  • 密钥交换: 非对称加密可以用于安全地交换对称加密的密钥,从而解决了对称加密中秘钥分发的问题。
缺点:
  • 性能: 非对称加密通常比对称加密慢得多,因为涉及复杂的数学运算。
  • 复杂性: 使用非对称加密需要更多的计算资源和算法支持。

(3)哈希函数:

哈希函数主要用于数据完整性验证、密码存储、数字签名等。但是,由于哈希函数的单向性质,不能直接用于加密解密。

优点:
  • 不可逆性: 哈希函数是不可逆的,即无法从哈希值还原出原始数据,这增加了数据的安全性,特别适用于密码存储等场景。
  • 高效性: 哈希函数通常非常快速,对于大量数据的处理非常高效。
  • 固定长度输出: 无论输入数据的大小如何,哈希函数的输出长度是固定的,这使得处理结果更加一致。
  • 散列均匀性: 好的哈希函数应该将不同的输入映射到均匀分布的输出空间,避免冲突。
  • 数据完整性验证: 通过比较原始数据和哈希值,可以验证数据是否在传输或存储过程中被篡改。
缺点:

 不可恢复性: 由于哈希函数是不可逆的,一旦数据被哈希化,就无法从哈希值还原出原始数据。这在某些应用场景下可能是缺点,

比如需要解密数据的情况。

冲突可能性: 哈希函数的输出是有限的,因此不同的输入可能会产生相同的哈希值,这被称为冲突。虽然好的哈希函数会减小冲突

的可能性,但仍然需要考虑。

彩虹表攻击: 针对较弱的哈希函数,攻击者可能使用预先计算的彩虹表来找到哈希值的原始数据。

哈希碰撞: 哈希碰撞指的是两个不同的输入产生相同的哈希值,攻击者可能利用这种情况来实现欺骗或篡改。

性能问题: 对于某些哈希函数,特别是在大规模数据上运行时,计算哈希值可能会影响性能。

三、SpringBoot项目配置文件加密

通过上面的加密方式介绍,我们使用对称加密,有人可能问这样不是不安全嘛?其实是安全的,得看你怎么用!

3.1 引入依赖(XTHS:第一步)

1

2

3

4

5

6

7

8

9

10

<dependency>

   <groupId>com.github.ulisesbocchio</groupId>

     <artifactId>jasypt-spring-boot-starter</artifactId>

     <version>2.1.2</version>

 </dependency>

<dependency>

     <groupId>org.jasypt</groupId>

     <artifactId>jasypt</artifactId>

     <version>1.9.2</version>

 </dependency>

  

3.2 编写加密工具(XTHS:第二步)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

package com.zd.channel.cs.utils;

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;

/**

 * alibaba druid加解密规则:

 * 明文密码+私钥(privateKey)加密=加密密码

 * 加密密码+公钥(publicKey)解密=明文密码

 */

public final class JasyptUtils {

    /**

     * 加密算法

     */

    private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES";

    /**

     * @param text  待加密原文

     * @param crack 盐值(密钥)

     * @return 加密后的字符串

     * @Description: Jasypt加密(PBEWithMD5AndDES)

     */

    public static String encryptWithMD5(String text, String crack) {

        //1.创建加解密工具实例

        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

        //2.加解密配置

        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();

        config.setAlgorithm(PBEWITHMD5ANDDES);

        config.setPassword(crack);

        encryptor.setConfig(config);

        //3.加密

        return encryptor.encrypt(text);

    }

    /**

     * @param text  待解密原文

     * @param crack 盐值(密钥)

     * @return 解密后的字符串

     * @Description: Jasypt解密(PBEWithMD5AndDES)

     */

    public static String decryptWithMD5(String text, String crack) {

        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();

        config.setAlgorithm(PBEWITHMD5ANDDES);

        config.setPassword(crack);

        encryptor.setConfig(config);

        return encryptor.decrypt(text);

    }

    public static void main(String[] args) {

        // String s = encryptWithMD5("明文", "密钥");

        // System.out.println(s);

        String channelcs1 = decryptWithMD5("密文""密钥");

        System.out.println(channelcs1);

    }

}

  

3.3 加密配置类(XTHS:第三步)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

import org.jasypt.encryption.StringEncryptor;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

public class CustomEncryptorConfig implements StringEncryptor {

    /**

     * 加密解密的 密钥

     */

    private String crack = "密钥";

    @Override

    public String encrypt(String s) {

        return JasyptUtils.encryptWithMD5(s,crack);

    }

    @Override

    public String decrypt(String s) {

        return JasyptUtils.decryptWithMD5(s,crack);

    }

}

  

3.4 配置文件(XTHS:第四步)

需要加密的内容使用:ENC(密码)格式书写。ENC 是一个特殊的前缀,用于标识被加密过的字符串。当你在配置文件中使用 ENC 前缀时,Jasypt 会自动识别这是一个被加密的属性,然后在应用启动时解密它并将解密后的值应用于相应的配置属性。这允许你在配置文件中以加密的方式存储敏感信息(如密码),同时在应用中解密并使用这些值。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

spring:

  datasource:

    dynamic:

      datasource:

        master:

          #type: com.zaxxer.hikari.HikariDataSource

          driver-class-name: com.mysql.jdbc.Driver

          url: ……

          username: root

          password: ENC(3hoLALpSHwctWRbBFJGy1x40gMv78JEG)

        slave:

          #type: com.zaxxer.hikari.HikariDataSource

          driver-class-name: com.mysql.jdbc.Driver

          url: ……

          username: root

          password: ENC(3hoLALpSHwctWRbBFJGy1x40gMv78JEG)

    hikari:

      minimum-idle: 5

      maximum-pool-size: 60

      connection-timeout: 30000

      idle-timeout: 600000

      max-lifetime: 1800000

  

3.5 更安全一些

上面我们是把密钥写在了代码中,这样做也是有些不太安全的。我们可以使用命令行的方式将密钥传入。

在配置文件中加上如下的配置,用于接收启动项目时传入的配置参数:

1

2

3

my:

  encrypted:

    password: ${jasypt.encryptor.password}

  

1

java -jar your-application.jar -Djasypt.encryptor.password=你的密钥

  生成密文时,我们也可以不适用工具类,而是使用命令,步骤如下:

  1. 在此目录下,打开命令行(win + R -> 进入jar包所在目录)、或者git(在jar包所在目录->邮件打开Git Bash here),执行加密命令:

  2. 加密:

 java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="要加密的值" password="加密密码" algorithm="加密算法"

1

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="test" password="crack" algorithm="PBEWITHMD5ANDDES"

  

  • 解密:
    java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="加密后的值" password="加密密码" algorithm="加密算法"

1

java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="gSBst2q0Kp06AJ9ZpTkwNg==" password="crack" algorithm="PBEWITHMD5ANDDES"

相关文章:

网络安全——SpringBoot配置文件明文加密

一、前言 在日常开发中&#xff0c;项目中会有很多配置文件。比如SpringBoot项目核心的数据库配置、Redis账号密码配置都在properties、yml配置文件 中。 如果这些信息以明文的方式存储&#xff0c;你的电脑被拿去修理&#xff0c;就会容易泄露&#xff0c;一旦被其他人获取到…...

LightRAG开源了…结合本地ollama实现股票数据接口Akshare智能问答

LightRAG是由香港大学研究团队推出的一种检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统。该系统通过整合图结构索引和双层检索机制&#xff0c;显著提升了大型语言模型在信息检索中的准确性和效率。LightRAG 不仅能够捕捉实体间的复杂依赖关系…...

【PCB设计】AD16教程:分配位号

1、前提条件 确保已经基本画完原理图 2、点击【Tools-Annotate Schematics】 3、依次点击【Reset All】、【Update Changes Lise】、【Close】 最后位号就被自动分配好了...

ElasticSearch7.x入门教程之索引概念和基础操作(三)

文章目录 前言一、索引基本概念二、索引基本使用elasticsearch-head插件Kibana使用 总结 前言 要想熟悉使用ES的索引&#xff0c;则必须理解索引相关的概念&#xff0c;尤其是在工作当中。 在此记录&#xff0c;方便开展工作。 一、索引基本概念 尽量以通俗的话语。 1、集群…...

Python后端flask框架接收zip压缩包方法

一、用base64编码发送&#xff0c;以及接收 import base64 import io import zipfile from flask import request, jsonifydef unzip_and_find_png(zip_data):# 使用 BytesIO 在内存中处理 zip 数据with zipfile.ZipFile(io.BytesIO(zip_data), r) as zip_ref:extracted_paths…...

机器学习中数据集Upsampling和Downsampling是什么意思?中英文介绍

对GPT4o大模型的Prompt如下&#xff1a; Datasets marked with ↓ are downsampled from their original datasets, datasets marked with ↑ are upsampled.这里的上采样和下采样是什么意思 内容援引自&#xff1a;paper &#xff08;https://allenai.org/papers/tulu-3-repor…...

浏览器控制台中使用ajax下载文件(没有postman等情况下)

有时候&#xff0c;可能电脑里面没有postman&#xff08;比如内网&#xff09;&#xff0c;然后又需要导出一些文件&#xff0c;前端又没有提供相应的功能&#xff08;比如循环调用导出等&#xff09;&#xff0c;这时候我们就可以通过在控制台写代码的方式来实现了。这个还是在…...

完全二叉树的基本操作(顺序存储)

#include<iostream> #include<math.h> using namespace std;#define MaxSize 100 struct TreeNode {int value;bool isEmpty;//判断该节点是否为空 }t[MaxSize];/** *定义一个长度位MaxSize的数组&#xff0c;按照从上到下&#xff0c; *从左到右的方式依次存储完全…...

【HTTP】http与https

http与https的关系 应用层协议&#xff1a; http&#xff08;HyperText Transfer Protocol&#xff09;超文本传输协议&#xff1b; https&#xff08;Hypertext Transfer Protocol Secure&#xff09;超文本传输安全协议&#xff1b; 传输层协议&#xff1a;TCP&#xff08;Tr…...

【Git多人开发与协作之团队的环境搭建】

Git多人开发与协作之团队的环境搭建 新的改变1. Git 的用途2. 分支的概念与类型3. HEAD 和分支指针如何查看 HEAD 指向的位置&#xff1a; 4. 常见的 Git 操作5. 常见问题与解决方法总结GitHub 项目获取实操在新电脑上运行 Git1. 安装 Git2. 配置用户名和邮箱3.配置 Git 和 SSH…...

java基础概念36:正则表达式1

一、正则表达式的作用 作用一&#xff1a;校验字符串是否满足规则&#xff1b;作用二&#xff1a;在一段文本中查找满足要求的内容。——爬虫 二、正则表达式 2-1、字符类 示例&#xff1a; public static void main(String[] args) {System.out.println("a".matc…...

java实现小程序接口返回Base64图片

文章目录 引言I java 接口返回Base64图片接口设计获取验证码图片-base64字符串获取验证码图片-二进制流arraybufferII 小程序端代码过期代码: 显示文件流图片(arraybuffer)知识扩展:微信小程序下载后端返回的文件流引言 场景: 图形验证码 背景: 接口返回arraybuffer的格式…...

网络编程并发服务器的应用

作业2&#xff1a;完成局域网CS模型&#xff0c;局域网内一个服务器&#xff0c;多个客户端连接一个服务器&#xff0c;完成局域网聊天&#xff08;select函数&#xff0c;poll函数&#xff0c;完成TCP并发服务器&#xff09;。 poll函数应用&#xff1a; 服务器部分代码&…...

数据结构——停车场管理问题

目录 1、问题描述2、逐步分析1&#xff09;涉及操作2&#xff09;代码实现 3、代码整合 1、问题描述 1、题目 设停车场内只有一个可停放n辆汽车的狭长通道&#xff0c;且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序&#xff0c;依次由北向南排列&#x…...

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中&#xff0c;科技的力量正日益凸显。其中&#xff0c;移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能&#xff0c;成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式&#xff0c;更为农业生产带来了高效、精…...

AI实习--常用的Linux命令

一、基础命令 1. 切换到根目录。 cd ~ 2. 返回上一级目录。 cd .. 3. 查看当前目录下包括哪些文件和文件夹。 ls 4. 查看当前路径。 pwd 5. 将文件或文件夹剪切到目标目录下。 mv 文件所在路径 目标路径 6. 查看文本文件内容。 cat 文本文件名 7. 创建文件或文件夹…...

Python学习指南 + 谷歌浏览器如何安装插件

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 前言 Python 官方文档的使用 谷歌浏览器中如何安装插件 前言 在学习Python时&#xff0c;我们可能会出现这样的困惑&#x…...

研0找实习【学nlp】15---我的后续,总结(暂时性完结)

当下进展成果&#xff1a; nlptransformerpytorchhuggingfacebert简历环境配置表情识别文本分类 断更了快1个月&#xff0c;2个礼拜找实习&#xff0c;1个礼拜伤心&#xff0c;1个礼拜想我要干什么…… 承认自己的才疏学浅&#xff0c;了解了leetcode&#xff0c;和老师商量了…...

kylin麒麟银河桌面版操作系统安装部署

本文主要描述kylin麒麟银河桌面版操作系统的安装&#xff0c;该操作系统的安装源文件可以从kylin麒麟银河官方网站上下载&#xff0c;商业版本需要申请试用&#xff0c;开源版本可以直接下载使用。 如上所示&#xff0c;x86芯片处理器架构的请下载INTEL版本&#xff0c;华为海思…...

MyBatis插件原理及应用

&#x1f3ae; 作者主页&#xff1a;点击 &#x1f381; 完整专栏和代码&#xff1a;点击 &#x1f3e1; 博客主页&#xff1a;点击 文章目录 介绍<plugins>标签解析拦截器链的工作原理插件的应用场景MyBatis插件应用的四个组件InterceptorChain和Interceptor MyBatis框架…...

[M最短路] lc743. 网络延迟时间(spfa最短路+单源最短路)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;743. 网络延迟时间 相关链接&#xff1a; [图最短路模板] 五大最短路常用模板) 2. 题目解析 怎么讲呢&#xff0c;挺抽象的…很久没写最短路算法了。反正也是写出来了&#xff0c;但脱离了模板&#xff0c;把…...

MySQL 中的锁

MySQL 中的锁&#xff1a;全面解析与应用指南 在 MySQL 数据库的复杂世界里&#xff0c;锁是确保数据一致性、完整性以及并发控制的关键机制。无论是简单的小型应用还是复杂的企业级系统&#xff0c;深入理解 MySQL 中的锁对于优化数据库性能、避免数据冲突和错误都具有至关重要…...

【动手学电机驱动】STM32-FOC(8)MCSDK Profiler 电机参数辨识

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…...

【C++11】尽显锋芒

(续) 一、可变参数模板 C11支持可变参数模板&#xff0c;也就是说支持可变数量参数的函数模板和类模板&#xff0c;可变数目的参数被称 为参数包&#xff0c;存在两种参数包&#xff1a;模板参数包&#xff0c;表示零或多个模板参数&#xff1b;函数参数包&#xff1a;表示零…...

掌握控制流的艺术:Go语言中的if、for和switch语句

标题:掌握控制流的艺术:Go语言中的if、for和switch语句 在Go语言的编程世界中,控制流语句是构建程序逻辑的基石。if语句、for循环和switch语句是我们最常用的控制流工具,它们让我们能够根据不同的条件执行不同的代码块。本文将深入探讨这些语句的使用方法、技术细节和实际…...

飞书会话消息左右排列

飞书会话消息左右排列 1. 飞书登录后&#xff0c;点击头像&#xff0c;弹出菜单有个按钮设置 2. 3....

.net 支持跨平台(桌面)系列技术汇总

1. 首先微软老大哥的.net core 。 .NET Core 是微软开发的一个跨平台、高性能的开源框架&#xff0c;用于构建云和互联网连接的新型应用。 它允许开发者在 Windows、macOS 和 Linux 上使用喜爱的开发工具进行开发&#xff0c;并支持部署到云或本地环境。 .NET Core 是对 .NET …...

springboot 静态资源访问

最近在学习springboot&#xff0c;在学习中一个静态资源访问&#xff0c;难道了我三天&#xff0c;在网上找了很多的资料&#xff0c;又是配置&#xff0c;又是重写WebMvcConfigurationSupport&#xff0c;因为以前没有接触&#xff0c;本来很简单的事情走了很多弯路&#xff0…...

【linux学习指南】初识Linux进程信号与使用

文章目录 &#x1f4dd;信号快速认识&#x1f4f6;⽣活⻆度的信号&#x1f4f6; 技术应⽤⻆度的信号&#x1f309; 前台进程&#xff08;键盘&#xff09;&#x1f309;⼀个系统函数 &#x1f4f6;信号概念&#x1f4f6;查看信号 &#x1f320; 信号处理&#x1f309; 忽略此信…...

L1G1000 书生大模型全链路开源开放体系笔记

关卡任务 观看本关卡视频后&#xff0c;写一篇关于书生大模型全链路开源开放体系的笔记。 视频链接&#xff1a;【书生浦语大模型全链路开源体系】 : 书生浦语大模型开源开放体系_哔哩哔哩_bilibili 书生大模型全链路开源开放体系笔记 在人工智能领域&#xff0c;大模型的…...