首页 > 其他分享 >网络安全——SpringBoot配置文件明文加密

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

时间:2023-12-29 17:44:06浏览次数:35  
标签:加密 SpringBoot 配置文件 jasypt 明文 密钥 哈希 String

信铁寒胜:这边文章真的说得挺好的。

XTHS:第一步、XTHS:第二步、XTHS:第三步、XTHS:第四步 !就可以实现了。(但是前提,你要先对你的文本进行加密,然后按照ENC(加密文本),放到配置文件中)

 

一、前言

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

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

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

二、加密方式介绍

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

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

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

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

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

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

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

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

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

 

(1)对称加密:

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

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

优点:

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

缺点:

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

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

(2)非对称加密:

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

优点:

  • 安全性: 非对称加密提供了更高的安全性,因为私钥是保密的,只有拥有私钥的人可以解密密文。
  • 密钥交换: 非对称加密可以用于安全地交换对称加密的密钥,从而解决了对称加密中秘钥分发的问题。

缺点:

  • 性能: 非对称加密通常比对称加密慢得多,因为涉及复杂的数学运算。
  • 复杂性: 使用非对称加密需要更多的计算资源和算法支持。

(3)哈希函数:

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

 

优点:

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

缺点:

 不可恢复性: 由于哈希函数是不可逆的,一旦数据被哈希化,就无法从哈希值还原出原始数据。这在某些应用场景下可能是缺点, 比如需要解密数据的情况。 冲突可能性: 哈希函数的输出是有限的,因此不同的输入可能会产生相同的哈希值,这被称为冲突。虽然好的哈希函数会减小冲突 的可能性,但仍然需要考虑。 彩虹表攻击: 针对较弱的哈希函数,攻击者可能使用预先计算的彩虹表来找到哈希值的原始数据。

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

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

 

三、SpringBoot项目配置文件加密

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

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

<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:第二步)

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:第三步)

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 会自动识别这是一个被加密的属性,然后在应用启动时解密它并将解密后的值应用于相应的配置属性。这允许你在配置文件中以加密的方式存储敏感信息(如密码),同时在应用中解密并使用这些值。

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 更安全一些

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

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

my:
  encrypted:
    password: ${jasypt.encryptor.password}

  

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="加密算法"

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="加密算法"

 

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

 

转自:网络安全——SpringBoot配置文件明文加密_springboot 配置文件加密-CSDN博客

 

标签:加密,SpringBoot,配置文件,jasypt,明文,密钥,哈希,String
From: https://www.cnblogs.com/wwssgg/p/17935357.html

相关文章

  • Springboot集成Nacos
    1.添加依赖com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery2.2.9.RELEASEcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-config2.2.9.RELEASE2.注册中心1、把Nacos的Ip和端口配置配置文件中2、在启动类上加上@EnableDiscoveryClient注解3、同一类的服务可......
  • Springboot集成Nacos
    1.添加依赖com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery2.2.9.RELEASEcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-config2.2.9.RELEASE2.注册中心1、把Nacos的Ip和端口配置配置文件中2、在启动类上加上@EnableDiscoveryClient注解3、同一类的服务可......
  • 在SpringBoot中自定义指标并使用Prometheus监控报警
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享在10分钟教你使用Prometheus监控SpringBoot工程中介绍了如何使用Prometheus监控SpringBoot提供的默认指标,这篇介绍如何自定义业务指标,并使用Prometheus进行监控并报警,同时在Grafana进行展现示例......
  • SpringBoot+modbus4j实现ModebusTCP通讯读取数据
    场景Windows上ModbusTCP模拟Master与Slave工具的使用:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135290463ModebusTCPModbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。Modbus协......
  • springboot(功能权限分配和脚本实现功能分配)
    一、功能权限分配添加菜单按钮:这时的按钮菜单是手动添加,后面可以自动生成 进入到角色管理,修改普通角色,添加权限之后,登录普通角色,在这之前需要先重置一下普通角色的密码 登录普通角色,普通角色就可以拥有权限,进行一系列操作: 二、脚本功能权限分配运行代码生成器的facor......
  • 基于SpringBoot的宠物管理系统的设计与实现(可做毕业设计参考)
    关键词:SpringBoot;宠物管理;宠物医院;宠物店管理;毕业;我们专注于软件开发工程领域,熟练掌握多种开发技术,包括基于SpringBoot、Vue.js、SSM框架的应用开发,以及针对AndroidAPP和微信小程序的开发。需要程序可以ADDME添+my企鹅numberisonezerothreetwothreesevenonetwoone回头......
  • Nginx reload重新加载配置文件的异常情况
    Nginxreload重新加载配置文件的异常情况背景临近年底,很多业务工作量都上来了.今天同事告知,nginx的log里面出现了大量的toomanyopenfiles的提示信息.并且同事明确说明,已经修改了/etc/secuirty/limits.conf以及worker_connections这两个参数.并且已经第一时......
  • SpringBoot中读取yml中配置的list对象的配置项
    场景SpringBoot中通过ConfigurationProperties注解的方式读取application.yml中配置的属性值:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108385148参考上面获取yml配置文件中简单的配置项的方式。如果需要获取application.yml中配置的list数据,且每个list有多......
  • .NET 6 控制台程序(Console)读取配置appsettings.json配置文件
    ​ 1、添加引用Microsoft.Extensions.Configuration.Json添加引用 Microsoft.Extensions.Configuration.Json,引用方法可以参考:1)使用Nuget界面管理器搜索"Microsoft.Extensions.Configuration.Json"在列表中分别找到它,点击"安装"相关文档:VS(VisualStudio)中Nuget的使用......
  • 【SpringBoot零基础入门到项目实战②】安装Java和Maven,创建你的第一个项目
    文章目录导言安装JavaWindows系统macOS系统Linux系统安装和配置MavenWindows系统macOS系统Linux系统配置Maven本地仓库使用阿里镜像加速创建第一个SpringBoot项目拓展学习(提前了解后面会讲到)1.深入理解SpringBoot的项目结构2.学习SpringBoot的自动配置3.掌握SpringBoot......