Spring Boot配置加密实践

news2024/9/25 5:23:40

Spring Boot配置加密实践

使用Java技术栈的时候,Spring Boot几乎已经成为了标配。Spring Boot帮助我们简化了各种技术的整合,我们只需要在application.yml配置文件中增加一点点的配置即可。

虽然Spring Boot简化了我们的工作,但是也隐藏了底层的整合实现。

现在有一个问题,我们的数据库密码、Redis密码、ES密码等等都设置在application.yml中,那岂不是有安全风险。能不能对这些敏感字段进行加密?

答案当然是可以的。

那么就开始这个文档的主题,加密Spring Boot配置中的敏感数据。

提前预告,内容过于简单,请不要太开心。

配置加密初体验

今天介绍的配置加密,使用了这个包jasypt-spring-boot-starter,废话不多说,开始整合。

  1. 这里假设你是使用Maven构建的项目(使用Gradle的话,自己对应变更就好了),在pom.xml文件中加入jasypt-spring-boot-starter的依赖。

             <!-- 属性加密工具 -->
                <dependency>
                    <groupId>com.github.ulisesbocchio</groupId>
                    <artifactId>jasypt-spring-boot-starter</artifactId>
                    <version>3.0.4</version>
                </dependency>
    
  2. 在pom.xml中加入对应的插件。

                    <!-- 配置加密插件 -->
                    <plugin>
                        <groupId>com.github.ulisesbocchio</groupId>
                        <artifactId>jasypt-maven-plugin</artifactId>
                        <version>3.0.4</version>
                    </plugin>
    
  3. 在你的启动参数中,加入如下参数jasypt.encryptor.password

    java -jar xxx.jar -Djasypt.encryptor.password="test"
    

    记住jasypt.encryptor.password表示的就是你的加密的密码,这个是必须要设置的。现在示例密码是test

    其实除了设置到启动参数中,也可以设置到application.yml中,虽然这样是不推荐的,毕竟这样的话,你的加密后的密码跟加密密码就放到一起了,容易被解密。

    jasypt:
      encryptor:
        password: test
    

现在加密使用的工具就整合结束了,是不是很简单。

使用配置加密

整合配置加密的工具后,如果你的配置中没有设置加密的密码,是不会影响使用的。

那要如何开启密码加密呢。

第一步 对密码进行加密

这就要使用到我们刚才设置的插件jasypt-maven-plugin

使用如下命令,即可对密码进行加密。

mvn jasypt:encrypt-value -Djasypt.encryptor.password="test" -Djasypt.plugin.value="xxx"

-Djasypt.encryptor.password我们之前也已经介绍了,表示的是加密的密码。

-Djasypt.plugin.value表示的是我要进行加密的内容,例如数据库的密码。

在命令行中执行之后,就得到了加密后的密码,如下图所示。

image-20230728112815211

我们得到的加密后的密码就是ENC(Zdy/wU1qeh9OHHtWGgQkZBxJ7ArACrdrkBrW9gVGltYenncnUzHi6WtRJuR9VS3y)

第二步 替换密码

我们需要使用第一步得到的加密密码来替换我们的原始密码。对应到配置上应该就是:

spring:
  datasource:
    password: ENC(Zdy/wU1qeh9OHHtWGgQkZBxJ7ArACrdrkBrW9gVGltYenncnUzHi6WtRJuR9VS3y)

好了,结束了,现在你就可以启动你的系统了,是不是发现,加密后的密码竟然也可以启动你的系统。

现在你的系统中任何系统属性、环境属性、命令行参数、application.properties、application-*.properties 、yaml属性和任何其他属性源都可以包含加密属性。

特殊的加密整合

虽然使用jasypt-spring-boot-starter来进行配置加密已经很简单了,但是奈何现实情况是多种多样的,总有可能出现问题。下面讲解下我遇到的各种问题,以及解决办法。

配置关键字被占用

通过之前的了解,我们也知道了,在配置中,加密后的敏感数据是这样的形式的:ENC(xxx)

xxx是加密后的内容,ENC()是帮助jasypt-spring-boot-starter识别那些是加密的数据,需要解密的。

但是,不是只有jasypt-spring-boot-starter会进行加密解密的,其他的工具也可能会有加密解密功能,也可能会使用ENC()作为识别加密属性的关键字。

假如跟其他的工具使用相同的关键字,那到底是谁来解密呢,解密的工具不对,那解密就会失败的呀。

很不巧,dynamic-datasource-spring-boot-starter就是这样的工具。

这个工具用来支持多数据源,也是很常见的一种工具。通过查看文档,发现他也是使用ENC作为加密字段的关键字。

image-20230728114131978

博主在使用过程中,发现了密码被dynamic-datasource-spring-boot-starter率先解密,导致解密失败。

如何解决?

那就给jasypt-spring-boot-starter换一个识别加密字段的关键字就好了。如下配置所示:

jasypt:
  encryptor:
    property:
      prefix: ENCRYPT(
      suffix: )

现在识别加密密码的关键字已经换成了ENCRYPT(),这个换成你喜欢的就行。

那么我现在的密码,应该是:

spring:
  datasource:
    password: ENCRYPT(Zdy/wU1qeh9OHHtWGgQkZBxJ7ArACrdrkBrW9gVGltYenncnUzHi6WtRJuR9VS3y)

Redisson配置没有加解密

在实践过程中,还发现了Redisson配置没有加解密成功。配置所下所示:

spring:
  redis:
    redisson:
      config: |
        sentinelServersConfig:
          password: ENCRYPT(Zdy/wU1qeh9OHHtWGgQkZBxJ7ArACrdrkBrW9gVGltYenncnUzHi6WtRJuR9VS3y)

这是因为jasypt-spring-boot-starter识别加密字段的逻辑是,以关键字ENC(开头,)结尾,中间的就是加密的内容。

我们查看上面的配置,发现了redisson的配置是一个多行文本,即不是一个以关键字ENC(开头,也不是)结尾。所以识别失败,不会进行解密。

通过断点查看类RedissonAutoConfiguration也发现了,redission的密码确实是没有加密的,依旧使用的是ENCRYPT(Zdy/wU1qeh9OHHtWGgQkZBxJ7ArACrdrkBrW9gVGltYenncnUzHi6WtRJuR9VS3y)

image-20230728115200993

不过,好在redission给我们提供了自定义配置的方式。源码中如下图表示:

image-20230728115250960

所以我们需要提供一个Bean,实现接口RedissonAutoConfigurationCustomizer,用于修改redisson的密码,使用spring.redis.password配置的密码即可。

/**
 * Redisson密码将使用spring.redis.password的密码,这是因为处理在Jasypt配置加密解密整合过程中,发现redisson的密码不被解析的问题。
 *
 * @author wanggt
 * @date 2023-07-26 17:29:31
 */
@Component
public class RedissonPasswordCustomizer implements RedissonAutoConfigurationCustomizer {

    @Autowired
    private RedisProperties redisProperties;

    @Override
    public void customize(Config configuration) {
        // spring.redis.password的密码是被解密过的,设置给redisson使用
        configuration.useSentinelServers().setPassword(redisProperties.getPassword());
    }
}

只需要设置spring.redis.password的密码为加密密码即可。

spring:
  redis:
    password: ENCRYPT(Zdy/wU1qeh9OHHtWGgQkZBxJ7ArACrdrkBrW9gVGltYenncnUzHi6WtRJuR9VS3y)

这样redisson的问题也解决了。

整合报错

Failed to bind properties under ‘spring.datasource.password’ to java.lang.String

部分人在整合之后,启动系统失败,出现了这样的报错。

出现这样的报错通常都是解密失败,需要排查:

  1. yaml文件格式是否正确,是否缺少了属性冒号后的空格

  2. 是否缺少了JCE的包。

    可以在命令行执行命令mvn jasypt:decrypt-value -Djasypt.encryptor.password="test" -Djasypt.plugin.value="xxx",查看是否可以解密。-Djasypt.plugin.value设置的是加密后的密码,如果出现下图提示,可能就是缺少的JCE。可以考虑更换JDK版本,如果是JDK8,需要是JDK8u161版本以上。

    image-20230728120056332

链接

加密工具Github

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

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

相关文章

draw up a plan

爱情是美好的&#xff0c;却不是唯一的。爱情只是属于个人化的感情。 推荐一篇关于爱情的美文&#xff1a; 在一个小镇上&#xff0c;有一家以制作精美巧克力而闻名的手工巧克力店&#xff0c;名叫“甜蜜之爱”。这家巧克力店是由一位名叫艾玛的年轻女性经营的&#xff0c;她对…

【Git】版本回退与撤销修改案例

目录 一、版本回退 二、撤销修改案例 案例1&#xff1a;仅在工作区进行了修改还未进行add操作 案例2&#xff1a;仅进行了add 操作还未进行commit操作 案例3&#xff1a;进行了add与commit操作无其他操作 三、版本库中删除文件 一、版本回退 在进行版本回退之前我们需要…

类加载机制与类加载器

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ Java 源码是如何形成类文件的&#xff0c;类文件又是如何加载到虚拟机的&#xff0c;类加载有哪些机制和原则呢&#xff1f;本文将为大家一一介绍。 1 Java 源码形成类文件…

音乐编曲软件FL Studio21中文免费版新功能及下载

FL Studio21是一款数字音频工作站软件&#xff0c;用于音乐制作和混音。它具有广泛的音频编辑和处理功能&#xff0c;可以帮助你创建出专业的音乐和音频内容。它还支持多个音频和效果轨道&#xff0c;可以帮助你创建更加复杂和高质量的音频内容。FL Studio是一款著名的DAW音频制…

1300*C. A Cookie for You

Example input 6 2 2 1 2 0 100 0 1 12 13 25 1 27 83 14 25 0 0 1 0 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 output Copy Yes No No Yes No Yes 解析&#xff1a; 因为第二种人只能吃少的那种蛋糕&#xff0c;所以优先满足他…

Flutter 开发者工具 Android Studio 开发Flutter应用

Flutter 开发者工具 在 Android Studio 开发Flutter应用 &#x1f525; Android Studio 版本更新 &#x1f525; Android Studio Check for Update Connection failed ​ 解决方案 如果是运行的是32位的android studio需要在andriod studio的启动目录下找到studio.exe.vmoptio…

spring boot 2 配置上传文件大小限制

一、起因&#xff1a;系统页面上传一个文件超过日志提示的文件最大100M的限制&#xff0c;需要更改配置文件 二、经过&#xff1a; 1、在本地代码中找到配置文件&#xff0c;修改相应数值后交给运维更新生产环境配置&#xff0c;但是运维说生产环境没有这行配置&#xff0c;遂…

Java那些“锁”事 - 死锁及排查

死锁是两个或者两个以上的线程在执行过程中&#xff0c;因争夺资源而造成的一种互斥等待现象&#xff0c;若没有外界干涉那么它们将无法推进下去。如果系统资源不足&#xff0c;进程的资源请求都得到满足&#xff0c;死锁出现的可能性就很低&#xff0c;否则就会因为争夺有限的…

kali安装Docker的方法+一次错误体验(第一行错误)

一.kali安装docker #添加docker的gpg密钥&#xff0c;签名用的 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -#添加docker的apt源 echo deb https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/ buster sta…

使用Jetpack Compose和Motion Layout创建交互式UI

使用Jetpack Compose和Motion Layout创建交互式UI 通过阅读本博客&#xff0c;您将学会使用Motion Layout实现这种精致的动画效果&#xff1a; 让我们从简单的介绍开始。 介绍 作为Android开发者&#xff0c;您可能会遇到需要布局动画的情况&#xff0c;有时甚至需要变形样…

Linux安装kafka3.5.1

要在Ubuntu上安装Apache Kafka&#xff0c;请按照以下步骤操作&#xff1a; 1、安装Java运行时环境(Ubuntu)&#xff1a; 如果已经安装jdk不用执行 sudo apt update sudo apt install default-jre2、下载Kafka&#xff1a; wget https://downloads.apache.org/kafka/3.5.1/…

Docker容器基本操作之启动-停止-重启

一、安装启动RabbitMQ容器 此处以rabbitmq容器为例 前提&#xff1a;需要安装配置好docker(设置镜像源、配置阿里云加速)、开启docker&#xff0c;停止(stop)或者禁用(disable)手动解压缩安装的rabbitmq,以防与docker中安装的rabbitmq冲突。 //查看docker状态 systemctl stat…

android Glide加载gif动图和本地视频,Java

droid Glide加载gif动图和本地视频&#xff0c;Java //从手机存储本地加载视频 String filePath "/storage/emulated/0/Pictures/my_video.mp4"; Glide .with( context ).load( Uri.fromFile( new File( filePath ) ) ).into( imageView );//加载gif Glide .with(…

用群晖NAS搭建个人音乐库

安装教程 勾选启动NTP服务 1. 群晖安装Audio Station 2. filestation会生成一个music文件夹&#xff0c;把下载好的音乐丢进music即可&#xff08;音乐平台听不到的歌也顺带通过下载解决了&#xff09;这时候你就可以在audio station直接听歌了不过咱们大部分时候听歌是在手机…

恒运资本:深市半年报预告规定?

依据深圳证券交易所等法律法规和业务规范的要求&#xff0c;应当及时、公平、精确发表成绩预告、成绩快报、中报、年度报告等信息。涉及中长期成绩情况的&#xff0c;还应当发表未来发展计划、运营战略、面对的风险与应战以及处理措施等中长期内容。 半年报成绩预告发表规则&am…

【PGMPY】 1. DAG基础结构

pgmpy 贝叶斯网络的纯python实现&#xff0c; 用途&#xff1a; 结构学习、 参数估计、 近似&#xff08;基于采样&#xff09; 精确推理 因果推理 安装 pip install pgmpyconda install -c ankurankan pgmpyconda install -c ankurankan pgmpy文档 https://pgmpy.org/index…

C++多线程编程(包含c++20内容)

C多线程编程(包含c20内容) 文章目录 C多线程编程(包含c20内容)线程通过函数指针创建线程通过函数对象创建线程通过lambda创建线程通过成员函数创建线程线程本地存储取消线程自动join线程从线程获得结果 原子操作库原子操作原子智能指针原子引用使用原子类型等待原子变量 互斥互…

Java【Spring】项目创建、存储和获取 Bean 的基本方式

文章目录 前言一、创建 Spring 项目1, 创建 Maven 项目2, 添加 Spring 依赖3, 创建启动类 二、存储 Bean 的基本方式1, 创建 Bean2, 存储 Bean 三、获取 Bean 的基本方式1, 获取上下文对象2, 获取 Bean3, 使用 Bean 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的…

tinkerCAD案例:18. Glow Circuit Assembly 发光电路组件

tinkerCAD案例&#xff1a;18. Glow Circuit Assembly 发光电路组件 In this tutorial, we’ll walk through how to use the Glow circuit assembly. 在本教程中&#xff0c;我们将演练如何使用 Glow 电路程序集。 Using the Glow circuit assembly, you’ll build a pengui…

使用Jetpack Glance创建Android Widget

使用Jetpack Glance创建Android Widget Jetpack Glance发布&#xff0c;让我们使用Google提供的Jetpack Glance创建一个联系人列表小部件。 https://developer.android.com/jetpack/compose/glance 什么是Glance&#xff1f; Jetpack Glance是一个使用Kotlin API创建小型、轻…