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.