网络安全——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"

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

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

相关文章

Linux系统编程之进程基础知识

概述 在Linux系统中&#xff0c;进程是指一个正在运行的程序实例。每个进程都有一个唯一的进程标识符&#xff0c;即PID&#xff0c;操作系统通过这个PID来唯一识别和管理各个进程。进程不仅仅是程序代码的运行实例&#xff0c;它还包含了程序运行时所需的各种资源&#xff0c;…

docker离线安装linux部分问题整理

0:离线安装docker过程命令 echo $PATH tar -zxvf docker-26.1.4.tgz chmod 755 -R docker cp docker/* /usr/bin/ root 权限 vim /etc/systemd/system/docker.service --------- [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.do…

2024智能机器人与自动控制国际学术会议 (IRAC 2024)

主办&#xff0c;承办&#xff0c;支持单位 会议官网 www.icirac.org 大会时间&#xff1a;2024年11月29-12月1日 大会简介 2024智能机器人与自动控制国际学术会议 &#xff08;IRAC 2024&#xff09;由华南理工大学主办&#xff0c;会议将于2024年11月29日-12月1日在中国广…

【Pytest+Yaml+Allure】实现接口自动化测试框架

一、框架思想 requestsyamlpytestallure实现接口自动化框架。结合数据驱动和分层思想&#xff0c;将代码与数据分离&#xff0c;易维护&#xff0c;易上手。使用yaml编写编写测试用例&#xff0c;利用requests库发送请求&#xff0c;使用pytest管理用例&#xff0c;allure生成…

利用 Jsoup 进行高效 Web 抓取与 HTML 处理

Jsoup 是一款 Java 的 HTML 解析器&#xff0c;可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API&#xff0c;可通过 DOM&#xff0c;CSS 以及类似于 JQuery 的操作方法来取出和操作数据。 官网&#xff1a;https://jsoup.org/ 中文文档&#xff1a;Jsou…

蓝桥杯不知道叫什么题目

小蓝有一个整数&#xff0c;初始值为1&#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如&#xff0c;如果整…

【JavaEE初阶】枫叶经霜艳,梅花透雪香-计算机是如何运行的?

本篇博客给大家带来的是与计算机相关的知识点, 包括:计算机的组成, 指令, 进程(重点). 文章专栏: JavaEE初阶 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 1. 计算机的组成 1.1 计算机的发展史 计算…

SuperMap Objects组件式GIS开发技术浅析

引言 随着GIS应用领域的扩展&#xff0c;GIS开发工作日显重要。一般地&#xff0c;从平台和模式上划分&#xff0c;GIS二次开发主要有三种实现方式&#xff1a;独立开发、单纯二次开发和集成二次开发。上述的GIS应用开发方式各有利弊&#xff0c;其中集成二次开发既可以充分利…

Linux网络——NAT/代理服务器

一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题&#xff0c;NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…

前端安全和解决方案

提到这个我可能想到的就是不要暴露太多的账号密码信息。一些页面的请求和操作要加上权限。 然后下面就详细的介绍前端可能遇到的安全问题以及解决方法。 首先比较常见的前端的安全性问题就是跨站脚本攻击&#xff08;XSS&#xff09;。跨站请求伪造&#xff08;csrf&#xff…

使用八爪鱼爬虫抓取汽车网站数据,分析舆情数据

我是做汽车行业的&#xff0c;可以用八爪鱼爬虫抓取汽车之家和微博上的汽车文章内容&#xff0c;分析各种电动汽车口碑数据。 之前&#xff0c;我写过很多Python网络爬虫的案例&#xff0c;使用requests、selenium等技术采集数据&#xff0c;这次尝试去采集小米SU7在微博、汽车…

C语言笔记(自定义类型:结构体、枚举、联合体 )

前言 本文对自定义类型的结构体创建、使用、结构体的存储方式和对齐方式&#xff0c;枚举的定义、使用方式以及联合体的定义、使用和存储方式展开叙述&#xff0c;如有错误&#xff0c;请各位指正。 目录 前言 1 结构体 1.1 结构体的声明 1.2 结构体的自引用 1.3 结构体变…

网络安全问题与大忌

“老三样&#xff0c;堵漏洞、做高墙、防外攻&#xff0c;防不胜防。” 日前&#xff0c;中国工程院沈昌祥院士这样概括中国信息安全的基本状况。 信息安全提了这么些年&#xff0c;究竟国内的网络如何脆弱&#xff0c;如何不堪一击&#xff0c;恐怕常人是难以想象的。公安部计…

3.langchain中的prompt模板 (few shot examples in chat models)

本教程将介绍如何使用LangChain库和智谱清言的 GLM-4-Plus 模型来理解和推理一个自定义的运算符&#xff08;例如使用鹦鹉表情符号&#x1f99c;&#xff09;。我们将通过一系列示例来训练模型&#xff0c;使其能够理解和推断该运算符的含义。 环境准备 首先&#xff0c;确保…

【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制

目录 一、概述 1.1. 缓冲区管理的重要性 1.2. 实现方式 1.2.1. HCI_Read_Buffer_Size 命令 1.2.2. HCI_Number_Of_Completed_Packets 事件 1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令 1.2.4. HCI_Host_Buffer_Size 命令 1.2.5. HCI_Host_Number_Of_Complete…

如何使用OCR技术批量识别图片中的文字并重命名文件,OCR 技术批量识别图片中的文字可能出现的错误

字符识别错误 形近字混淆&#xff1a;例如 “已” 和 “己”、“未” 和 “末” 等&#xff0c;由于外形极为相似&#xff0c;OCR 软件在识别时可能出现误判&#xff0c;将原本正确的字识别成与之形近的另一个字。比如在识别一篇手写的文章中&#xff0c;手写体的 “已” 可能就…

Qt | 开发技能提升档次哈

点击上方"蓝字"关注我们 01、Creator常用快捷键 >>> F1 查看帮助 F2 跳转到函数定义 Shift+F2 声明和定义之间切换 F3 查找下一个 F4 头文件和源文件之间切换 Ctrl+1 欢迎模式 Ctrl+2 编辑模…

kafka消费者组和分区数之间的关系是怎样的?

消费者组和分区数之间的关系决定了Kafka中消息的消费方式和负载均衡。合理配置分区数和消费者数量对于优化Kafka的性能和资源利用率至关重要。以下是这种关系的几个关键点&#xff1a; 一个分区只能被同一组的一个消费者消费&#xff1a;这是为了保证消息的顺序性。在同一个消费…

Element Plus的快速入门

一、什么是Element Plus Element : 是饿了么团队研发的&#xff0c;基于Vue3&#xff0c;面向设计师和开发者的组件库。 组件&#xff1a;组成网页的部分&#xff0c;例如超链接&#xff0c;按钮&#xff0c;图片&#xff0c;表格&#xff0c;表单&#xff0c;分页条等等。 …

健身房小程序服务渠道开展

健身不单单是锻炼身体、保持身材&#xff0c;也是一种社交方式&#xff0c;城市里门店不少&#xff0c;每家都有一定流量和老客&#xff0c;但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户&#xff0c;而消费者也对门…