Spring Boot配置加密实践

这篇具有很好参考价值的文章主要介绍了Spring Boot配置加密实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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表示的是我要进行加密的内容,例如数据库的密码。

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

Spring Boot配置加密实践,spring boot,配置加密

我们得到的加密后的密码就是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作为加密字段的关键字。

Spring Boot配置加密实践,spring boot,配置加密

博主在使用过程中,发现了密码被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)

Spring Boot配置加密实践,spring boot,配置加密

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

Spring Boot配置加密实践,spring boot,配置加密

所以我们需要提供一个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版本以上。

    Spring Boot配置加密实践,spring boot,配置加密

链接

加密工具Github文章来源地址https://www.toymoban.com/news/detail-614907.html

到了这里,关于Spring Boot配置加密实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密

    springboot:2.1.4.RELEASE JDK:8 jasypt-spring-boot-starter:3.0.2 Jasypt默认算法为PBEWithMD5AndDES,该算法需要一个加密密钥,可以在应用启动时指定(环境变量)。也可以直接写入配置文件 3.1 application.properties配置文件版 加密后,可删除jasypt.encryptor.password配置;发版时可在命令行中配置 3.2 函数

    2024年02月15日
    浏览(39)
  • 【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析

    💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring Boot】深入解密Spring Boot日志:最佳实践与策略解析 🎉欢迎大家点赞👍评论📝收藏⭐文章 日志对我们来说并不陌⽣,通过打印日志来发现和定位问题,或者根据日志来分析程序的运行过程. 日志的用途 Spring Boot中的日

    2024年04月17日
    浏览(48)
  • Spring Boot 最佳实践

    本文翻译自国外论坛 medium,原文地址:https://medium.com/@raviyasas/spring-boot-best-practices-for-developers-3f3bdffa0090 Spring Boot 是一种广泛使用且非常流行的企业级高性能框架。以下是一些最佳实践和一些技巧,我们可以使用它们来改进 Spring Boot 应用程序并使其更加高效。这篇文章会有点

    2024年02月14日
    浏览(39)
  • Spring Boot 缓存应用实践

    缓存是最直接有效提升系统性能的手段之一。个人认为用好用对缓存是优秀程序员的必备基本素质。本文结合实际开发经验,从简单概念原理和代码入手,一步一步搭建一个简单的二级缓存系统。 1、缓存基础算法 FIFO(First In First Out) ,先进先出,和OS里的FIFO思路相同,如

    2024年02月13日
    浏览(54)
  • Spring Boot单点登录实践

    在现代的Web应用程序中,单点登录(Single Sign-On)已经变得越来越流行。单点登录使得用户只需要一次认证即可访问多个应用程序,同时也提高了应用程序的安全性。Spring Boot作为一种广泛使用的Web开发框架,在单点登录方面也提供了很好的支持。 在本文中,我们将使用Spri

    2024年02月07日
    浏览(34)
  • spring boot如何实现对应用系统进行请求加密、响应加密处理

    参考文档:https://blog.csdn.net/zhuocailing3390/article/details/125054315 通过实现 RequestBodyAdvice 接口,对前端请求的参数进行解密并且重新让真实结构的数据进入到Controller中; 通过实现 ResponseBodyAdvice 接口,将响应的参数进行加密,返回到前端; 扩展: 可以通过自定义注解,实现对指

    2024年02月07日
    浏览(40)
  • Spring Boot 安全性最佳实践

    1.实施 HTTPS HTTPS 在传输过程中对数据进行加密,防止未经授权的各方截获和破译敏感信息。这对于处理用户凭证、金融交易或任何其他机密数据的应用程序尤为重要。因此,安全通信是不容置疑的。您必须使用 HTTPS 来保护传输中的数据。 在应用程序属性中,确保启用 TLS/SS

    2024年04月27日
    浏览(43)
  • Spring Boot Starter 剖析与实践

    对于 Java 开发人员来说,Spring 框架几乎是必不可少的。它是一个广泛用于开发企业应用程序的开源轻量级框架。近几年,Spring Boot 在传统 Spring 框架的基础上应运而生,不仅提供了 Spring 的全部功能,还使开发人员更加便捷地使用。在使用 Spring Boot 时,我们经常会接触到各种

    2024年02月14日
    浏览(43)
  • Spring Boot日志系统大揭秘:从零开始学习Spring Boot日志:常见问题解答和最佳实践

    Spring Boot 日志机制和工具用于记录应用程序的日志信息和追踪应用程序的执行过程。它集成了常用的日志框架,如 Log4j、logback、Java Util Logging等,并提供简单易用的配置方式,让开发人员可以方便地监控应用程序的运行状态和性能。在项目启动时,日志已经开始输出,但尚未

    2024年02月08日
    浏览(60)
  • 【Spring Boot】Spring Boot的系统配置 — 日志配置

    日志对于系统监控、故障定位非常重要,比如当生产系统发生问题时,完整清晰的日志记录有助于快速定位问题。接下来介绍Spring Boot对日志的支持。 Spring Boot自带spring-boot-starter-logging库实现系统日志功能,spring-boot-starter-logging组件默认使用LogBack日志记录工具。系统运行日志

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包