Esquema de cifrado y descifrado de información del archivo de configuración (jasypt)

Cifrado y descifrado jasypt

referencia:

descripción general

  • El nombre completo de Jasypt es Java Simplified Encryption, que es un proyecto de código abierto en Sourceforge.net.

  • Jasypt se puede utilizar para tareas y aplicaciones de cifrado, como el cifrado de contraseñas, información confidencial y comunicaciones de datos, incluida la criptografía basada en estándares de alta seguridad, el cifrado de contraseñas, texto, números y archivos binarios con cifrado simultáneo unidireccional y bidireccional.

  • Jasypt también cumple con el estándar RSA para el cifrado basado en contraseña y proporciona herramientas de cifrado sin configuración, así como nuevas herramientas de cifrado estándar altamente configurables, archivos de propiedades cifradas, integración Spring Work, configuración de fuente de datos cifrada de Hibernate, nuevas herramientas de línea de comandos, integración de wicket de Apache para cifrado de URL y documentación actualizada.

  • Jasypt también se puede integrar con Acegi Security, concretamente Spring Security. Jasypt también tiene la función de integración de la configuración de la aplicación de cifrado y proporciona una API abierta para que cualquier extensión de criptografía de Java pueda usar Jasypt.

  • Por razones de seguridad, la información confidencial en los archivos de configuración de arranque de Spring generalmente debe cifrarse/insensibilizarse, y no se debe usar texto sin formato tanto como sea posible.

    El marco de seguridad de código abierto Jasypt Spring Boot proporciona soporte de cifrado para la fuente de propiedad en la aplicación Spring Boot. Se usa especialmente para manejar el cifrado de propiedad de Spring Boot. Use un formato específico para configurar directamente el texto cifrado en el archivo de configuración, y luego, cuando se inicie la aplicación, Jasypt descifrará automáticamente la contraseña en texto sin formato para que la use el programa.

    • Formato de configuración del atributo de cifrado de Jasypt: secret.property=ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+), ENC() es su identificación, cuando se inicia el programa, automáticamente descifrará el contenido, si el descifrado falla, informará un error.
    • Por lo tanto, obtener estos valores de propiedad no es diferente de lo habitual, puede usar directamente @Value ("${secret.property}") para obtenerlos, y no se requiere ningún procesamiento especial para obtener los valores.
  • Jasypt cifra el mismo contenido con la misma clave (secretKey), y el texto cifrado generado cada vez es diferente, pero es posible descifrar el contenido original de acuerdo con estos textos cifrados.


método de integración jasypt (incluidas las dependencias)

Hay tres formas de integrar jasypt-spring-boot en el proyecto:

  • Método 1:

    Si es una aplicación Spring Boot, usando la anotación @SpringBootApplication o @EnableAutoConfiguration, simplemente agregue la dependencia jasypt-spring-boot-starter, y todo el entorno de Spring admitirá la configuración de propiedades cifradas (esto significa que cualquier propiedad del sistema, propiedad del entorno, parámetro de línea de comando, yaml, propiedades y cualquier otra fuente de propiedad personalizada puede contener propiedades cifradas)

    <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.3</version>
    </dependency>
    
  • Método 2:

    Si no usa @SpringBootApplication o @EnableAutoConfiguration, agregue jasypt-spring-boot al classpath

    1) depender de

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

    2) Agregue @EnableEncryptableProperties a la clase de configuración para habilitar las propiedades cifrables en todo el entorno de Spring:

    @Configuration
    @EnableEncryptableProperties
    public class MyApplication {
          
          
        ...
    }
    
  • Método 3:

    Si no usa las anotaciones de configuración automática @SpringBootApplication o @EnableAutoConfiguration, y no desea habilitar las propiedades cifrables en todo el entorno de Spring, puede usar este método

    1) Agregar dependencias al proyecto

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

    2) Agregue cualquier cantidad de anotaciones @EncryptablePropertySource al archivo de configuración (al igual que usar la anotación @PropertySource de Spring)

    @Configuration
    @EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
    public class MyApplication {
          
          
        ...
    }
    

    2) O también puede usar la anotación @EncryptablePropertySources para agrupar anotaciones del tipo @EncryptablePropertySource

    @Configuration
    @EncryptablePropertySources({
          
          @EncryptablePropertySource("classpath:encrypted.properties"),
                                 @EncryptablePropertySource("classpath:encrypted2.properties")})
    public class MyApplication {
          
          
        ...
    }
    

    Nota: @EncryptablePropertySource admite archivos YAML desde la versión 1.8


configuración yml y descripción de parámetros

configuración yml

# jasypt 配置加密
jasypt:
  encryptor:
    # 自定义加密盐值(密钥)
    password: jasypt
    # 加密算法设置
    algorithm: PBEWithMD5AndDES
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator
    salt-generator-classname: org.jasypt.salt.RandomSaltGenerator

Descripción de parámetros

Llave Requerido Valor por defecto ilustrar
jasypt.encryptor. contraseña Verdadero - Valor de sal cifrado personalizado (clave)
jasypt.encryptor. algoritmo FALSO PBECONHMACSHA512ANDAES_256 Algoritmo de cifrado, debe ser compatible con el proveedor de JCE
jasypt.encryptor. iteraciones de obtención de claves FALSO 1000 Obtenga el número de iteraciones de hash para la clave de cifrado
jasypt.encryptor. tamaño de la piscina FALSO 1 El tamaño del grupo de cifrado para crear
jasypt.encryptor. nombre del proveedor FALSO SolJCE El nombre del proveedor de seguridad que solicita el algoritmo de cifrado.
jasypt.encryptor. nombre-clase-proveedor FALSO nulo
jasypt.encryptor. iv-generator-classname FALSO org.jasypt.iv.RandomIvGenerator generador intravenoso
jasypt.encryptor. sal-generador-nombre de clase FALSO org.jasypt.salt.RandomSaltGenerator Generador de sal
jasypt.encryptor. tipo de salida de cadena FALSO base64
Los tipos de codificación disponibles para la forma de codificación de la salida de cadena son:
base64, hexadecimal (hexadecimal)
jasypt.encryptor. Proxy-property-sources FALSO FALSO
jasypt.encryptor. saltar-propiedad-fuentes FALSO lista vacía
jasypt.encryptor.propiedad. prefijo FALSO ENC( Establecer prefijo de texto cifrado
jasypt.encryptor.propiedad. sufijo FALSO ) Establecer sufijo de texto cifrado

Nota:

  • La única propiedad requerida es jasypt.encryptor.password, el resto puede usar valores predeterminados.

    Si bien todas estas propiedades se pueden declarar en un archivo de propiedades, por seguridad, no se recomienda oficialmente que la propiedad de la contraseña se almacene en un archivo de propiedades, sino que se debe pasar como una propiedad del sistema, un argumento de la línea de comandos o una variable de entorno.

  • El algoritmo de cifrado y descifrado predeterminado en el sitio web oficial es "PBEWITHHMACSHA512ANDAES_256", que es sha512 más cifrado avanzado AES, que requiere compatibilidad con Java JDK 1.9 y superior, o el archivo de política de permisos de fuerza ilimitada JCE; de lo contrario, se informará un error al ejecutar: "El cifrado provocó una excepción. Una posible razón es que está utilizando un algoritmo de cifrado fuerte y no ha instalado la Extensión de cifrado Java (JCE) archivo de política de permisos en esta máquina virtual Java".

  • De forma predeterminada, com.ulisesbocchio.jasyptspringboot.encryptor.DefaultLazyEncryptor se utiliza para el cifrado y descifrado.

  • Todas las propiedades del StringEncryptor estándar se pueden configurar en el archivo de configuración global. También es posible agregar un bean StringEncryptor en segundo plano, momento en el que se ignorará el procedimiento de cifrado predeterminado.

    import org.jasypt.encryption.StringEncryptor;
    import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
    import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class JasyptConfig {
          
          
        /**
         * 自定义 StringEncryptor,覆盖默认的 StringEncryptor
         * bean 名称是必需的,从 1.5 版开始按名称检测自定义字符串加密程序,默认 bean 名称为:jasyptStringEncryptor
         */
        @Bean("jasyptStringEncryptor")
        public StringEncryptor jasyptStringEncryptor() {
          
          
            PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
            SimpleStringPBEConfig config = new SimpleStringPBEConfig();
            config.setPassword("jasypt");
            config.setAlgorithm("PBEWithMD5AndDES");
            config.setKeyObtentionIterations("1000");
            config.setPoolSize("1");
            config.setProviderName("SunJCE");
            config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
            config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
            config.setStringOutputType("base64");
            encryptor.setConfig(config);
            return encryptor;
        }
    }
    

    Aviso:

    • Se requiere el nombre del bean porque jasypt spring boot detecta codificadores de cadenas personalizados por nombre desde la versión 1.5, el nombre predeterminado del bean es: jasyptStringEncryptor

    • Pero también se puede anular definiendo una propiedad, por ejemplo, jasypt.encryptor.bean=encryptorBean, y luego definir un cifrador personalizado con ese nombre:

      @Bean("encryptorBean") 
      public StringEncryptor stringEncryptor() {
              
               ... }
      

Herramientas de cifrado y descifrado

Para obtener el texto cifrado, debe cifrar los datos que deben cifrarse. Existen varios métodos. Puede usar la línea de comando para operar el paquete jar para obtenerlo, o puede usar directamente el código para cifrarlo.

Se recomienda utilizar el cifrado de código. A continuación, se proporciona una clase de herramienta para el cifrado. Nota:

  • Jasypt usa el atributo de descifrado StringEncryptor de forma predeterminada, por lo que también debe usar StringEncryptor para cifrar de forma predeterminada al cifrar, de lo contrario, el descifrado falla y se informa un error al inicio

    La interfaz StringEncryptor tiene muchas clases de implementación, comúnmente utilizadas PooledPBEStringEncryptor

  • El cifrado y el descifrado deben tener las mismas propiedades establecidas para StringEncryptor. Por ejemplo, el algoritmo utilizado para el cifrado debe ser el mismo para el descifrado. De lo contrario, se informará un error cuando el descifrado falle al iniciarse.

  • El algoritmo de cifrado comúnmente utilizado es "PBEWithMD5AndDES", el valor predeterminado en el sitio web oficial es "PBEWITHHMACSHA512ANDAES_256", el primero es md5 plus des estándar de cifrado, el último es sha512 más cifrado avanzado AES, pero se requiere compatibilidad con Java JDK 1.9 y superior, o se agregan archivos de política de permisos de fuerza ilimitada JCE.

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

public class JasyptUtils {
    
    

    /**
     * 加密
     * @param password 加密盐值
     * @param text    需要加密的字符串
     * @return 加密后的字符串
     */
    public static String encrypt(String password, String text) {
    
    
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(cryptor(password));
        return encryptor.encrypt(text);
    }

    /**
     * 解密
     * @param password 加密盐值
     * @param text    需要解密的字符串
     * @return 解密后的字符串
     */
    public static String decrypt(String password, String text) {
    
    
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(cryptor(password));
        return encryptor.decrypt(text);
    }

    /**
     * 配置(对应yml中的配置)
     * @param password 加密盐值
     * @return SimpleStringPBEConfig
     */
    public static SimpleStringPBEConfig cryptor(String password) {
    
    
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        //设置盐值
        config.setPassword(password);
        //设置算法配置信息
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setProviderName("SunJCE");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        config.setPoolSize("1");
        return config;
    }


    public static void main(String[] args) {
    
    
        // 加密
        String encryptStr = encrypt("jasypt", "root");
        // 解密
        String decryptStr = decrypt("jasypt", encryptStr);
        System.out.println("加密后:" + encryptStr);
        System.out.println("解密后:" + decryptStr);
    }
}

uso básico

La configuración en el archivo de configuración global es la siguiente, se debe establecer la propiedad jasypt.encryptor.password y el algoritmo debe ser coherente con el algoritmo utilizado para el cifrado.

Si desea encriptar qué atributo, use ENC() para envolverlo y luego coloque el texto cifrado en él, y se descifrará automáticamente cuando se inicie la aplicación.

**El formato del texto cifrado en el archivo de configuración yml: **ENC (texto cifrado)

Ejemplo:

username: ENC(vyxdS47pJdWBF38TFdmjKmMm4zEO0FQP)
password: ENC(vyxdS47pJdWBF38TFdmjKmMm4zEO0FQP)

expandir:

  • En el proyecto SpringBoot (con uso normal @SpringBootApplicationo @EnableAutoConfigurationanotaciones), se pueden usar anotaciones en el código @Valuepara obtener directamente los valores de configuración descifrados

  • Jasypt usa StringEncryptor para descifrar atributos de manera predeterminada, por lo que se colocó en el contenedor de Spring de manera predeterminada y se puede usar directamente. Por ejemplo, además de cifrar y descifrar atributos en el archivo de configuración, también puede realizar cualquier otra operación de cifrado y descifrado, como proporcionar una interfaz de controlador para el cifrado y descifrado en línea.

    Debido a que la barra de direcciones del navegador es sensible a los caracteres especiales, no se usa el base64 predeterminado, sino una cadena hexadecimal en su lugar.

    jasypt:
      encryptor:
        password: wangmaox  # 加密的密钥,自定义即可,必填项
        algorithm: PBEWithMD5AndDES  # 指定解密算法
        string-output-type: hexadecimal # 设置加密内容输出的编码形式,可用的编码类型有 base64、hexadecimal(16进制)
    

    Donde quiera usar StringEncryptor, puede obtenerlo directamente y usarlo

        @Resource
        private StringEncryptor stringEncryptor;
     
        /**
         * http://localhost:8080/jasypt/encryptor?message=12日下午17点执行任务&isEncrypt=true
         * http://localhost:8080/jasypt/encryptor?message=702EAA3755766C567F62E83273681A90DC684B6AFADD5CD84691778DAF4A1466E13CE0720E8BABC06081A5D6DBD90EA1&isEncrypt=false
         * 在线使用 {@link StringEncryptor} 加解密消息。
         *
         * @param message   加/解密的内容
         * @param isEncrypt true 表示加密、false 表示解密
         */
        @GetMapping("jasypt/encryptor")
        public ObjectNode encrypt(@RequestParam String message, @RequestParam boolean isEncrypt) {
          
          
            JsonNodeFactory nodeFactory = JsonNodeFactory.instance;
            String encrypt = isEncrypt ? stringEncryptor.encrypt(message) : stringEncryptor.decrypt(message);
            ObjectNode objectNode = nodeFactory.objectNode();
            objectNode.put("code", 200);
            objectNode.put("data", encrypt);
            return objectNode;
        }
    

Descripción de almacenamiento clave (valor de sal)

  • El proceso de cifrado y descifrado en sí se procesa a través del valor salt, por lo que, en circunstancias normales, el valor salt y la cadena cifrada se almacenan por separado.

  • Los valores salt deben usarse en las propiedades del sistema, la línea de comandos o las variables de entorno, no en los archivos de configuración.

    Método de entrega de llaves :

    # 方式1:启动参数
    java -jar jasypt-spring-boot-demo.jar --jasypt.encryptor.password=password
    
    # 方式2:系统属性
    java -Djasypt.encryptor.password=password -jar jasypt-spring-boot-demo.jar
    
    # 方式3:环境变量
    jasypt:
        encryptor:
            password: ${JASYPT_ENCRYPTOR_PASSWORD:password}
    # 也可以先设置环境变量
    export JASYPT_ENCRYPTOR_PASSWORD=password
    java -jar jasypt-spring-boot-demo.jar
    

    Después de eliminar el valor salt establecido en el archivo de configuración:

    • Agregue el elemento de configuración de inicio "Opciones de VM" de idea: Djasypt.encryptor.password=salt value.
    • Método de inicio después del empaquetado: java -jar -Djasypt.encryptor.password=salt value xxx.jar

Usar el método del paquete jar: cifrado

 @echo off
 set/p input=待加密的明文字符串:
 set/p password=加密密钥(盐值)echo 加密中......
 java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI  input=%input% password=%password% algorithm=PBEWithMD5AndDES
 pause

Use el método del paquete jar - descifrar

java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI password=123456 algorithm=PBEWithMD5AndDES ivGeneratorClassName=org.jasypt.iv.RandomIvGenerator input=BwNPdUi+syCTKFj/nlbI5fAtGUKuhN8r

buscador, analizador

EncryptablePropertyDetector: buscador

Esta interfaz proporciona dos métodos:

  • Método isEncrypted: determine si es un atributo cifrado por las reglas de la convención jasypt
  • Método unwrapEncryptedValue: preprocesamiento de texto cifrado. Puede personalizar la devolución del valor cifrado real con el prefijo y el sufijo eliminados

La implementación predeterminada de esta interfaz es DefaultPropertyDetector


EncryptablePropertyResolver: Solucionador

Solo se proporciona un método en esta interfaz:

  • Método resolvePropertyValue: recorra las propiedades del archivo de configuración, determine si son propiedades cifradas y, a continuación, descifre y devuelva texto sin formato.

    En la implementación predeterminada de DefaultPropertyResolver, que se basa en EncryptablePropertyDetector y StringEncryptor, el método de descifrado real está escrito en StringEncryptor.

La implementación predeterminada de esta interfaz es DefaultPropertyResolver

Descomponedor personalizado (generalmente no personalizado, aquí hay solo un ejemplo)

public class JasyptEncryptablePropertyResolver implements EncryptablePropertyResolver {
    
    
    //自定义解密方法
    @Override
    public String resolvePropertyValue(String s) {
    
    
        if (null != s && s.startsWith(MyEncryptablePropertyDetector.ENCODED_PASSWORD_HINT)) {
    
    
            return PasswordUtil.decode(s.substring(MyEncryptablePropertyDetector.ENCODED_PASSWORD_HINT.length()));
        }
        return s;
    }
}

algoritmo de cifrado personalizado

Si no desea utilizar el algoritmo de cifrado en la herramienta jasypt, o necesita un algoritmo de cifrado específico internamente, el componente jasypt-spring-boot proporciona una forma de implementar el cifrado y descifrado personalizado.

Puede implementar las interfaces EncryptablePropertyDetector y EncryptablePropertyResolver usted mismo y entregarlas a Spring para su administración, configurar los nombres de bean como encryptablePropertyDetector y encryptablePropertyResolver para anular la implementación predeterminada proporcionada por el marco y completar la personalización de los algoritmos de cifrado y los prefijos y sufijos.

Especifique la clase de implementación de cifrado y descifrado personalizada en el archivo yml para inyectar el nombre del bean en el contenedor Spring

#数据库配置文件加密
jasypt:
  encryptor:
    ## 实现jasypt加密解密的类
    bean: customJasyptStringEncryptor

Clase de implementación de cifrado y descifrado personalizado

import com.test.ssmtest.encryption.utils.AESUtils;
import com.test.ssmtest.encryption.utils.Sm4Utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

/**
 * 自定义 jasypt 加解密实现类
 */
@Slf4j
public class JasyptCustomStringEncryptor implements StringEncryptor {
    
    

    @Autowired
    private AESUtils aesUtils;
    @Autowired
    private Sm4Utils sm4Utils;

    @Value("${jasypt.encryption.encryptedMethod:aes}")
    private String encryptedMethod;

    @Override
    public String encrypt(String s) {
    
    
        return s;
    }

    @Override
    public String decrypt(String s) {
    
    
        log.info("get encrypted text:" + s);
        String encryptedText = null;
        if (StringUtils.isNotBlank(s)){
    
    
            try {
    
    
                String encodedPrefix = s.substring(0, s.indexOf("("));
                if (JasyptEncryptableDetector.ENCODED_HINT_ENC.equalsIgnoreCase(encodedPrefix)){
    
    
                    encodedPrefix = encryptedMethod;
                }

                String ciphertext = s.substring(s.indexOf("(") + 1, s.lastIndexOf(")"));
                if (AESUtils.AES.equalsIgnoreCase(encodedPrefix)){
    
    
                    encryptedText = aesUtils.decryptAESAndDecode(ciphertext);
                } else if (Sm4Utils.SM4.equalsIgnoreCase(encodedPrefix)){
    
    
                    encryptedText = sm4Utils.decryptSM4AndDecode(ciphertext);
                }

                log.info("generate decrypted text:"+ encryptedText);
                if (StringUtils.isNotBlank(encryptedText)){
    
    
                    log.info("decrypt text success!");
                } else {
    
    
                    log.error("decrypt text failed!");
                }
            } catch (Exception e) {
    
    
                log.error("decrypt text error!", e);
            }
        }
        return encryptedText;
    }
}

buscador personalizado

Para admitir prefijos de propiedades cifradas personalizadas, debe implementar la interfaz EncryptablePropertyDetector usted mismo.

import com.ulisesbocchio.jasyptspringboot.EncryptablePropertyDetector;
import java.util.Arrays;

/**
 * 自定义 jasypt 发现器实现类
 */
public class JasyptEncryptableDetector implements EncryptablePropertyDetector {
    
    

    private static final String[] ENCODED_HINTS = {
    
    "ENC", "AES", "SM4"};
    public static final String ENCODED_HINT_ENC = "ENC";

   // 判断是否是 jasypt 约定规则加密的属性
    @Override
    public boolean isEncrypted(String s) {
    
    
        if (null != s && s.contains("(") && s.contains(")")) {
    
    
            s = s.trim().toUpperCase();
            return Arrays.asList(ENCODED_HINTS).contains(s.substring(0, s.indexOf("(")));
        }
        return false;
    }
    // 密文预处理。可以自定义返回去除掉前缀和后缀的真正加密的值。
    // 因解密方法需要加密提示判断加密的算法,此处不去除前缀和后缀
    @Override
    public String unwrapEncryptedValue(String s) {
    
    
        return s.trim();
    }
}

registro de frijol

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
// 配置添加该注解,开启属性自动解密功能。若用jasypt-spring-boot-starter依赖包,可以不用配置该注解
// @EnableEncryptableProperties
public class JasyptConfig {
    
    

    @Bean
    @ConditionalOnProperty(name = "jasypt.encryptor.bean", havingValue = "jasyptCustomStringEncryptor")
    public JasyptCustomStringEncryptor jasyptCustomStringEncryptor(){
    
    
        return new JasyptCustomStringEncryptor();
    }

    @Bean("encryptablePropertyDetector")
    @ConditionalOnProperty(name = "jasypt.encryptor.bean", havingValue = "jasyptCustomStringEncryptor")
    public JasyptEncryptableDetector jasyptEncryptableDetector(){
    
    
        return new JasyptEncryptableDetector();
}

Supongo que te gusta

Origin blog.csdn.net/footless_bird/article/details/128287795
Recomendado
Clasificación