详解如何保护SpringBoot配置文件中的敏感信息

 更新时间:2023年07月28日 09:26:39   作者:242030  
使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些,所以为了提高安全性,就需要对配置文件中的敏感信息进行保护,下面就为大家介绍一下实现方法吧

如何保护SpringBoot配置文件中的敏感信息

使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些。

打开application.propertiesapplication.yml,比如 MySql登陆密码,Redis登陆密码以及第三方的密钥

等等一览无余,这里介绍一个加解密组件,提高一些属性配置的安全性。

jasypt由一个国外大神写了一个springboot下的工具包,用来加密配置文件中的信息。

GitHub Demo地址:https://github.com/jeikerxiao/spring-boot2/tree/master/spring-boot-encrypt

下面以数据库用户名和数据库密码加密为例进行介绍。

1、pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
        <relativePath/>
    </parent>
    <groupId>com.jasypt</groupId>
    <artifactId>spring-boot-jasypt</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-jasypt</name>
    <description>如何保护 SpringBoot 配置文件中的敏感信息</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.4.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 加密包 -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

查看最新版本可以到:https://github.com/ulisesbocchio/jasypt-spring-boot

2、配置加/解的密码

# jasypt加密的密匙
jasypt:
  encryptor:
    password: Y6M9fAJQdU7jNp5MW

3、测试用例中生成加密后的秘钥

package com.jasypt;
import org.jasypt.encryption.StringEncryptor;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringBootJasyptApplicationTests {
    @Autowired
    private StringEncryptor encryptor;
    @Test
    public void getPass() {
        String url = encryptor.encrypt("jdbc:mysql://127.0.0.1:3306/test");
        String name = encryptor.encrypt("root");
        String password = encryptor.encrypt("root");
        System.out.println("database url: " + url);
        System.out.println("database name: " + name);
        System.out.println("database password: " + password);
        Assert.assertTrue(url.length() > 0);
        Assert.assertTrue(name.length() > 0);
        Assert.assertTrue(password.length() > 0);
    }
}

下面是输出加密字符串:

database url: CCGZpukXHOy7xPMVm6//IZi3kQxJQmZuFdrje1KtshlZD0IiwrHTQWcB4J4l1qKe
database name: +DcWhoH0RuZck93R2FSEEg==
database password: gTVoDqbBeaTe2+omIsoXIA==

4、将加密后的字符串替换原明文

server:
  port: 8080
spring:
  # 数据库相关配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: CCGZpukXHOy7xPMVm6//IZi3kQxJQmZuFdrje1KtshlZD0IiwrHTQWcB4J4l1qKe
    username: +DcWhoH0RuZck93R2FSEEg==
    password: gTVoDqbBeaTe2+omIsoXIA==
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  # 返回的api接口的配置,全局有效
  jackson:
   # 如果某一个字段为null,就不再返回这个字段
    default-property-inclusion: non_null
    date-format: yyyy-MM-dd HH:mm:ss
    serialization:
      write-dates-as-timestamps: false
    time-zone: GMT+8
# jasypt加密的密匙
jasypt:
  encryptor:
    password: Y6M9fAJQdU7jNp5MW

5、部署时配置salt(盐)值

为了防止salt(盐)泄露,反解出密码,可以在项目部署的时候使用命令传入salt(盐)值:

$ java -jar xxx.jar -Djasypt.encryptor.password=Y6M9fAJQdU7jNp5MW

或者在服务器的环境变量里配置,进一步提高安全性。

打开/etc/profile文件

$ vim /etc/profile

在profile文件末尾插入salt(盐)变量

$ export JASYPT_PASSWORD = Y6M9fAJQdU7jNp5MW

编译,使配置文件生效

$ source /etc/profile

运行

$ java -jar -Djasypt.encryptor.password=${JASYPT_PASSWORD} xxx.jar

到此这篇关于详解如何保护SpringBoot配置文件中的敏感信息的文章就介绍到这了,更多相关SpringBoot保护配置文件敏感信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ribbon负载均衡服务调用的示例详解

    Ribbon负载均衡服务调用的示例详解

    Rbbo其实就是一个软负载均衡的客户端组件,他可以和其他所需请求的客户端结合使用,这篇文章主要介绍了Ribbon负载均衡服务调用案例代码,需要的朋友可以参考下
    2023-01-01
  • JAVA读取PDF、WORD文档实例代码

    JAVA读取PDF、WORD文档实例代码

    本篇文章主要通过实例代码介绍了JAVA读取PDF、WORD文档,需要的朋友可以参考下
    2017-04-04
  • Spring.Net控制反转IoC入门使用

    Spring.Net控制反转IoC入门使用

    这篇文章主要为大家详细介绍了Spring.Net控制反转IoC入门使用的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Component-Scan 不扫描jar里面的类问题

    Component-Scan 不扫描jar里面的类问题

    这篇文章主要介绍了Component-Scan 不扫描jar里面的类问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • JAVA读取文本文件内容实例代码

    JAVA读取文本文件内容实例代码

    这篇文章主要给大家介绍了关于JAVA读取文本文件内容的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 关于Java HashMap自动排序的简单剖析

    关于Java HashMap自动排序的简单剖析

    这篇文章主要给大家介绍了关于Java HashMap自动排序的简单剖析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java实现邮件发送功能

    Java实现邮件发送功能

    这篇文章主要为大家详细介绍了Java实现邮件发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 全面解释Java中的serialVersionUID

    全面解释Java中的serialVersionUID

    以下是对Java中的serialVersionUID进行了全面的分析介绍。需要的朋友可以过来参考下
    2013-08-08
  • java的io操作(将字符串写入到txt文件中)

    java的io操作(将字符串写入到txt文件中)

    这篇文章主要介绍了java的io操作示例,将字符串写入到txt文件中,需要的朋友可以参考下
    2014-04-04
  • SpringBoot项目中HTTP请求体只能读一次的解决方案

    SpringBoot项目中HTTP请求体只能读一次的解决方案

    在基于Spring开发Java项目时,可能需要重复读取HTTP请求体中的数据,例如使用拦截器打印入参信息等,但当我们重复调用getInputStream()或者getReader()时,通常会遇到SpringBoot HTTP请求只读一次的问题,本文给出了几种解决方案,需要的朋友可以参考下
    2024-08-08

最新评论