SpringBoot实现配置文件加密的方案分享

 更新时间:2023年11月23日 16:15:02   作者:Rise同志  
项目的数据库密码、redis 密码等明文展示在配置文件中会有潜在的风险,因此采用合适的安全防护措施是有必要的,下面小编就为大家介绍一下SpringBoot中配置文件加密的方法,希望对大家有所帮助

1.为什么要对配置文件关键信息进行加密

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false
    username: root
    password: root
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456

项目的数据库密码、redis 密码等明文展示在配置文件中会有潜在的风险,比如源码泄露,或者配置文件暴露,会导致相关密码泄露,造成安全风险,因此采用合适的安全防护措施是有必要的。

2.配置文件加密方案

方案1:jasypt

jasypt 是一个开源的工具类,可以方便的对 SpringBoot 配置文件中的配置项进行对称加密

集成步骤

1.1 引入Jar包

在maven中引入如下依赖

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

1.2 对敏感数据生成加密字符串

有以下三种加密方式,请根据自己需求和项目情况自行选择:

方式1: 通过加密工具类生成(以下为代码实例,可以直接使用)

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

/**
 * 使用Jasypt对配置文件进行加密
 */
public class JasyptUtil {

    /**
     * 加密算法 加密解密保证同一种算法
     * jasypt3.0后,默认支持的算法为 PBEWITHHMACSHA512ANDAES_256,这种算法安全性更高,但是需要 Java JDK 1.9+或添加JCE(Java Cryptography Extension 无限强度权限策略文件)
     * 使用PBEWithMD5AndDES算法即可
     */
    private static final String algorithm ="PBEWithMD5AndDES";
    //密钥,对称加密使用同一个密钥进行加解密,密钥自己定义,注意保管
    private static final String key ="test";

    public static void main(String[] args) {
        //加密方法示例
        String encryptInfo = encrypt("root");
        System.out.println(encryptInfo);
        //解密方法示例
        String decryptInfo = decrypt(encryptInfo);
        System.out.println(decryptInfo);
    }

    /**
     * 加密
     *
     * @param value 明文
     * @return
     */
    public static String encrypt(String value) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        // 指定算法
        config.setAlgorithm(algorithm);
        // 指定秘钥
        config.setPassword(key);
        encryptor.setConfig(config);
        // 加密数据
        return encryptor.encrypt(value);
    }

    /**
     * 解密
     *
     * @param value 密文
     * @return
     */
    public static String decrypt(String value) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm(algorithm);
        config.setPassword(key);
        encryptor.setConfig(config);
        // 解密数据
        return encryptor.decrypt(value);
    }
}

方式2: 执行 jar包,通过命令行的模式获取(不推荐,操作起来不够方便)

java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password="test" algorithm=PBEWithMD5AndDES input=root

输出结果:

Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.161-b12

----ARGUMENTS-------------------

input: root
algorithm: PBEWithMD5AndDES
password: ADUMDFUOV7834*

----OUTPUT----------------------

dXTlEeOApsY5oCeCQEo4Gg==

注:

  • password:用来加密的密钥
  • algorithm:加密算法 PBEWithMD5AndDES/PBEWITHHMACSHA512ANDAES_256。使用PBEWithMD5AndDES即可
  • input:后接的属性为需要加密的参数
  • OUTPUT输出的值即为加密后的值

方式三: 使用Maven插件(推荐,使用起来比较快捷)

Maven中引入jasypt插件

<plugin>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-maven-plugin</artifactId>
    <version>3.0.3</version>
    <configuration>
        <path>file:src/main/resources/application.yml</path>
    </configuration>
</plugin>

注:

path标签中的路径请根据自己配置文件路径配置

修改配置文件

server:
  port: 8030
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    username: DEC(root)
    password: DEC(root)
jasypt:
   encryptor:
     password: test
  • 需要加密的数据使用DEC()包起来
  • password为密钥自定义

Maven加密命令

mvn jasypt:encrypt -Djasypt.encryptor.password=test

执行完该命令之后,DEC中的内容会自动被替换为ENC(加密内容)

Maven解密命令

mvn jasypt:decrypt -Djasypt.encryptor.password=test

1.3 使用

配置文件中按下图添加密钥和需要加密的属性之后,启动时会自动对敏感数据进行解密

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false
    driver-class-name: com.mysql.jdbc.Driver
    username: ENC(加密之后的属性)
    password: ENC(加密之后的属性)
jasypt:
   encryptor:
     password: 自定义的密钥

1.4 安全事项

由于该方案采用的是对称加密,一旦泄露密钥,相关密码将暴露,将密钥配置在配置文件中,非常不安全,推荐将密钥添加到启动命令中,降低暴露风险

java -jar demo.jar --Djasypt.encryptor.password=test

以上就是SpringBoot实现配置文件加密的方案分享的详细内容,更多关于SpringBoot配置文件加密的资料请关注脚本之家其它相关文章!

相关文章

  • Java的方法详解

    Java的方法详解

    方法类似于C语言中的函数,是包含特定功能的代码块,必须定义在类中、main方法外部,本质上是一个造轮子的过程—— 将重复使用的逻辑包装成方法,需要时直接调用,无需重复编写,下面通过示例详解Java的方法,感兴趣的朋友一起看看吧
    2026-02-02
  • 详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案

    详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案

    本篇文章主要介绍了详解基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java 读写Properties配置文件详解

    Java 读写Properties配置文件详解

    这篇文章主要介绍了Java 读写Properties配置文件详解的相关资料,这里举例说明该如何实现,具有参考价值,需要的朋友可以参考下
    2016-11-11
  • Spring WebFlux使用深度实践指南

    Spring WebFlux使用深度实践指南

    本文详细介绍了SpringWebFlux的使用,包括构建ReactiveRESTAPI、响应式数据库访问(R2DBC)和WebSocket实时通信,通过这些功能,开发者可以构建高性能、可扩展的响应式Web应用,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • SpringBoot+Beetl实现动态数据库DDL的示例代码

    SpringBoot+Beetl实现动态数据库DDL的示例代码

    最近公司里有一个新的需求,需要导出数据库元数据表中存储的表的 DDL 语句,而在元数据表中数据源的类型庞大,少则十几种多则达到几十种,各种数据库类型都有,本篇文章就从这个模版引擎来入手介绍如何实现功能,需要的朋友可以参考下
    2025-06-06
  • Java几个重要的关键字详析

    Java几个重要的关键字详析

    这篇文章主要介绍了Java几个重要的关键字详析,文章围绕主题展开详细的内容介绍,具有一定的参考一下,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-07-07
  • Java实现利用广度优先遍历(BFS)计算最短路径的方法

    Java实现利用广度优先遍历(BFS)计算最短路径的方法

    这篇文章主要介绍了Java实现利用广度优先遍历(BFS)计算最短路径的方法,实例分析了广度优先遍历算法的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • Spring Boot使用yml格式进行配置的方法

    Spring Boot使用yml格式进行配置的方法

    很多springboot项目使用的是yml格式,主要目的是方便对读懂其他人的项目,下面小编通过本文给大家分享Spring Boot使用yml格式进行配置的方法,需要的朋友参考下吧
    2018-04-04
  • SSH框架网上商城项目第30战之项目总结(附源码下载地址)

    SSH框架网上商城项目第30战之项目总结(附源码下载地址)

    这篇文章主要介绍了SSH框架网上商城项目第30战之项目总结,并附源码下载地址,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java中isAssignableFrom的用法详解

    Java中isAssignableFrom的用法详解

    下面小编就为大家带来一篇Java中isAssignableFrom的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01

最新评论