Spring整合jasypt原理分析

前言

在我们系统中,有很多敏感数据,如 MySQL 及 Redis 的账号密码信息等,jasypt 可以帮我们加密这些信息,使系统更加的安全。

使用

添加 maven 依赖

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

添加配置

application.yml

jasypt:
  encryptor:
    password: pwd123

spring:
  rabbitmq:
    host: xxx # RabbitMQ 服务的地址
    port: 5672 # RabbitMQ 服务的端口
    username: admin # RabbitMQ 服务的账号
    password: ENC(TKt6b0Ll3t39h9upZ32ntw==) # RabbitMQ 服务的密码
    listener:
      simple:
        acknowledge-mode: manual
    publisher-returns: true
    publisher-confirm-type: correlated

手动创建加密信息

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;

public class TestJasypt {
    public static void main(String[] args) {
        testEncrypt();
    }

    private static void testEncrypt(){
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("pwd123");
        config.setPoolSize(1);
        encryptor.setConfig(config);
        String encryptStr = encryptor.encrypt("szz123");  // 对 RabbitMQ 密码加密
        System.out.println(encryptStr);
    }
}

原理分析

  1. JasyptSpringBootAutoConfiguration 配置类会导入 EnableEncryptablePropertiesConfiguration。
  2. EnableEncryptablePropertiesConfiguration 又会导入 EncryptablePropertyResolverConfiguration 及 EnableEncryptablePropertiesBeanFactoryPostProcessor。
  3. EncryptablePropertyResolverConfiguration 配置类中的 DefaultLazyPropertyDetector 用来判断一个属性值是否为加密字符串,默认为以 ENC( 开头,以 ) 结尾,DefaultLazyEncryptor 用来解密。
  4. EnableEncryptablePropertiesBeanFactoryPostProcessor 后置处理器用来将加密字符串解密为原来的信息,将原来的 PropertySource 转换为 EncryptablePropertySourceWrapper,在被调用 getProperty(name) 方法时才解密,延迟处理。
  5. 最终的解密处理类为 DefaultPropertyResolver,调用 DefaultPropertyDetector 来判断一个属性值是否需要解密,调用 DefaultLazyEncryptor 来解密。
  6. 底层使用 PooledPBEStringEncryptor 来加解密。

参考

【Springboot】Springboot整合Jasypt,让配置信息安全最优雅方便的方式
【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?

posted @ 2024-01-28 21:45  strongmore  阅读(141)  评论(0编辑  收藏  举报