SpringBoot【集成 jasypt】实现配置信息自定义加解密(自定义的属性探测和密码解析器)

简介: SpringBoot【集成 jasypt】实现配置信息自定义加解密(自定义的属性探测和密码解析器)

1.Jasypt是什么

Jasypt是一个Java简易加密库,用于加密配置文件中的敏感信息,如数据库密码。它可以帮助开发人员在应用程序中加密密码、敏感信息和数据通信,还包括高安全性、基于标准的加密技术、可同时单向和双向加密的加密密码、文本、数字和二进制文件。如果您正在使用Spring Boot,Jasypt可以与Spring Boot集成,使加密和解密过程更加简单。

2.使用

2.1 依赖

<!-- SpringBoot 版本 -->
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.5.3</version>
  <relativePath/> 
</parent>
<!-- jasypt 加密 -->
<dependency>
  <groupId>com.github.ulisesbocchio</groupId>
  <artifactId>jasypt-spring-boot-starter</artifactId>
  <version>3.0.3</version>
</dependency>

2.2 实现类

  1. 自定义的属性探测器和密码解析器【作用是识别加密后的对象和解密】
/**
 * 自定义的属性探测器和密码解析器
 */
@Component
public class CustomEncryptableProperty {
    @Bean(name = "encryptablePropertyDetector")
    public EncryptablePropertyDetector encryptablePropertyDetector() {
        return new CustomEncryptablePropertyDetector();
    }
    @Bean("encryptablePropertyResolver")
    public EncryptablePropertyResolver encryptablePropertyResolver(EncryptablePropertyDetector encryptablePropertyDetector) {
        return new CustomEncryptablePropertyResolver(encryptablePropertyDetector);
    }
}
  1. 自定义的属性探测器实现【可以设置被加密对象】
/**
 * 自定义的属性探测器
 */
public class CustomEncryptablePropertyDetector implements EncryptablePropertyDetector {
    /**
     * 探测字符串
     */
    private final String flagStr = "ENC@";
    /**
     * 是否为可以解密的字符串【自定义规则为 flagStr 开头】
     *
     * @param value 全部的字符串
     * @return 是否是解密的字符串,true,是,false,否
     */
    @Override
    public boolean isEncrypted(String value) {
        if (value != null) {
            return value.startsWith(flagStr);
        }
        return false;
    }
    /**
     * 截取到除了标识之后的值【截取 flagStr 之后的字符串】
     *
     * @param value 带前缀
     * @return string 去掉标识符的字符串
     */
    @Override
    public String unwrapEncryptedValue(String value) {
        return value.substring(flagStr.length());
    }
}
  1. 自定义的密码解析器【解密自定义的加密对象】EncryptionUtil.toDecrypt()就是自定义的解密方法,与加密对象的加密方法相对应。
/**
 * 自定义的密码解析器
 */
public class CustomEncryptablePropertyResolver implements EncryptablePropertyResolver {
    /**
     * 属性探测器
     */
    private final EncryptablePropertyDetector detector;
    public CustomEncryptablePropertyResolver(EncryptablePropertyDetector detector) {
        this.detector = detector;
    }
    /**
     * 处理真正的解密逻辑
     *
     * @param value 原始值
     * @return 如果值未加密,返回原值,如果加密,返回解密之后的值
     */
    @Override
    public String resolvePropertyValue(String value) {
        return Optional.ofNullable(value)
                .filter(detector::isEncrypted)
                .map(resolvedValue -> {
                    try {
                        // 1.过滤加密规则后的字符串
                        String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());
                        // 2.解密
                        return EncryptionUtil.toDecrypt(unwrappedProperty);
                    } catch (EncryptionOperationNotPossibleException e) {
                        throw new DecryptionException("Unable to decrypt: " + value + ". Decryption of Properties failed,  make sure encryption/decryption " +
                                "passwords match", e);
                    }
                })
                .orElse(value);
    }
}

2.3 加密配置

spring:
  datasource:
    dynamic:
      datasource:
        # 主库数据源
        master:
          driver-class-name: org.postgresql.Driver
          url: ENC@URLENCStr
          username: ENC@UsernameENCStr
          password: ENC@PasswordENCStr

3.总结

用户名及密码甚至是URL使用密文的安全性是很高的,本文参考知乎软件架构师:代码小咖SpringBoot 配置文件这样加密,才足够安全!,感谢大佬的分享,Jasypt 的使用还有很多自定义的方式,可查看原文学习。

目录
相关文章
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
1167 0
|
Java Maven 开发者
编写SpringBoot的自定义starter包
通过本文的介绍,我们详细讲解了如何创建一个Spring Boot自定义Starter包,包括自动配置类、配置属性类、`spring.factories`文件的创建和配置。通过自定义Starter,可以有效地复用公共配置和组件,提高开发效率。希望本文能帮助您更好地理解和应用Spring Boot自定义Starter,在实际项目中灵活使用这一强大的功能。
1193 17
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——拦截自定义异常
本文介绍了在实际项目中如何拦截自定义异常。首先,通过定义异常信息枚举类 `BusinessMsgEnum`,统一管理业务异常的代码和消息。接着,创建自定义业务异常类 `BusinessErrorException`,并在其构造方法中传入枚举类以实现异常信息的封装。最后,利用 `GlobalExceptionHandler` 拦截并处理自定义异常,返回标准的 JSON 响应格式。文章还提供了示例代码和测试方法,展示了全局异常处理在 Spring Boot 项目中的应用价值。
641 0
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
2475 15
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。
711 1
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
541 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
575 0
|
安全 Java 应用服务中间件
如何将Spring Boot应用程序运行到自定义端口
如何将Spring Boot应用程序运行到自定义端口
1663 0
|
8月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。

热门文章

最新文章