Configuración de Spring Boot con Jasypt

1. Introducción

Jasypt (cifrado simplificado de Java) Spring Boot proporciona utilidades para cifrar fuentes de propiedades en aplicaciones de arranque.

En este artículo, discutiremos cómo podemos agregar el soporte de jasypt-spring-boot y usarlo.

Para obtener más información sobre el uso de Jasypt como marco para el cifrado, consulte nuestra Introducción a Jasypt aquí.

2. ¿Por qué Jasypt?

Siempre que necesitemos almacenar información confidencial en el archivo de configuración, eso significa que esencialmente estamos haciendo que esa información sea vulnerable; esto incluye cualquier tipo de información confidencial, como credenciales, pero ciertamente mucho más que eso.

Al usar Jasypt, podemos proporcionar cifrado para los atributos del archivo de propiedad y nuestra aplicación hará el trabajo de descifrarlo y recuperar el valor original.

3. Formas de utilizar JASYPT con Spring Boot

Analicemos las diferentes formas de usar Jasypt con Spring Boot.

3.1. Usando jasypt -spring -boot-starter

Necesitamos agregar una sola dependencia a nuestro proyecto:

 com.github.ulisesbocchio jasypt-spring-boot-starter 2.0.0 

Maven Central tiene la última versión de jasypt-spring-boot-starter.

Ahora cifremos el texto "[correo electrónico protegido]" con la clave secreta "contraseña" y agréguelo a las propiedades cifradas:

encrypted.property=ENC(uTSqb9grs1+vUv3iN8lItC0kl65lMG+8)

Y definamos una clase de configuración AppConfigForJasyptStarter - para especificar el archivo encrypted.properties como PropertySource :

@Configuration @PropertySource("encrypted.properties") public class AppConfigForJasyptStarter { } 

Ahora, escribiremos un bean de servicio PropertyServiceForJasyptStarter para recuperar los valores de encrypted.properties . El valor descifrado se puede recuperar usando la anotación @Value o el método getProperty () de la clase Environment :

@Service public class PropertyServiceForJasyptStarter { @Value("${encrypted.property}") private String property; public String getProperty() { return property; } public String getPasswordUsingEnvironment(Environment environment) { return environment.getProperty("encrypted.property"); } } 

Finalmente, usando la clase de servicio anterior y configurando la clave secreta que usamos para el cifrado, podemos recuperar fácilmente la contraseña descifrada y usarla en nuestra aplicación :

@Test public void whenDecryptedPasswordNeeded_GetFromService() { System.setProperty("jasypt.encryptor.password", "password"); PropertyServiceForJasyptStarter service = appCtx .getBean(PropertyServiceForJasyptStarter.class); assertEquals("[email protected]", service.getProperty()); Environment environment = appCtx.getBean(Environment.class); assertEquals( "[email protected]", service.getPasswordUsingEnvironment(environment)); } 

3.2. Usando jasypt-spring-boot

Para proyectos que no usan @SpringBootApplication o @EnableAutoConfiguration , podemos usar la dependencia jasypt -spring -boot directamente:

 com.github.ulisesbocchio jasypt-spring-boot 2.0.0 

Del mismo modo, cifremos el texto "[correo electrónico protegido]" con la clave secreta "contraseña" y agréguelo a encryptedv2.properties :

encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)

Y tengamos una nueva clase de configuración para la dependencia jasypt-spring-boot.

Aquí, necesitamos agregar la anotación @EncryptablePropertySource :

@Configuration @EncryptablePropertySource("encryptedv2.properties") public class AppConfigForJasyptSimple { }

Además, se define un nuevo bean PropertyServiceForJasyptSimple para devolver encryptedv2.properties :

@Service public class PropertyServiceForJasyptSimple { @Value("${encryptedv2.property}") private String property; public String getProperty() { return property; } } 

Finalmente, usando la clase de servicio anterior y configurando la clave secreta que usamos para el cifrado, podemos recuperar fácilmente la propiedad encryptedv2.property:

@Test public void whenDecryptedPasswordNeeded_GetFromService() { System.setProperty("jasypt.encryptor.password", "password"); PropertyServiceForJasyptSimple service = appCtx .getBean(PropertyServiceForJasyptSimple.class); assertEquals("[email protected]", service.getProperty()); } 

3.3. Uso de cifrador JASYPT personalizado

Los cifradores definidos en la sección 3.1. y 3.2. se construyen con los valores de configuración predeterminados.

Sin embargo, vamos a definir nuestro propio cifrador Jasypt e intentar usarlo para nuestra aplicación.

S0, el bean de cifrado personalizado se verá así:

@Bean(name = "encryptorBean") public StringEncryptor stringEncryptor() { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("password"); config.setAlgorithm("PBEWithMD5AndDES"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; } 

Además, podemos modificar todas las propiedades de SimpleStringPBEConfig.

Además, necesitamos agregar una propiedad "jasypt.encryptor.bean" a nuestra application.properties, para que Spring Boot sepa qué cifrador personalizado debe usar .

Por ejemplo, agregamos el texto personalizado "[correo electrónico protegido]" cifrado con la clave secreta "contraseña" en application.properties:

jasypt.encryptor.bean=encryptorBean encryptedv3.property=ENC(askygdq8PHapYFnlX6WsTwZZOxWInq+i)

Una vez que lo configuramos, podemos obtener fácilmente la propiedad encryptedv3.property del entorno de Spring :

@Test public void whenConfiguredExcryptorUsed_ReturnCustomEncryptor() { Environment environment = appCtx.getBean(Environment.class); assertEquals( "[email protected]", environment.getProperty("encryptedv3.property")); } 

4. Conclusión

Al usar Jasypt, podemos brindar seguridad adicional para los datos que maneja la aplicación .

Nos permite centrarnos más en el núcleo de nuestra aplicación y también se puede utilizar para proporcionar cifrado personalizado si es necesario.

Como siempre, el código completo de este ejemplo está disponible en Github.