SpringBoot【集成 jasypt】实现配置信息自定义加解密(自定义的属性探测和密码解析器)
作者:mmseoamin日期:2023-12-05

集成jasypt实现配置信息自定义加解密

  • 1.Jasypt是什么
  • 2.使用
    • 2.1 依赖
    • 2.2 实现类
    • 2.3 加密配置
    • 3.总结

      1.Jasypt是什么

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

      2.使用

      2.1 依赖

      
      
      	org.springframework.boot
      	spring-boot-starter-parent
      	2.5.3
      	 
      
      
      
      	com.github.ulisesbocchio
      	jasypt-spring-boot-starter
      	3.0.3
      
      

      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 的使用还有很多自定义的方式,可查看原文学习。