Configuration de Spring Boot avec Jasypt

1. Introduction

Jasypt (Java Simplified Encryption) Spring Boot fournit des utilitaires pour chiffrer les sources de propriétés dans les applications de démarrage.

Dans cet article, nous verrons comment nous pouvons ajouter le support de jasypt-spring-boot et l'utiliser.

Pour plus d'informations sur l'utilisation de Jasypt comme cadre de chiffrement, consultez notre Introduction à Jasypt ici.

2. Pourquoi Jasypt?

Chaque fois que nous avons besoin de stocker des informations sensibles dans le fichier de configuration - cela signifie que nous rendons essentiellement ces informations vulnérables; cela inclut tout type d'informations sensibles, telles que les informations d'identification, mais certainement bien plus que cela.

En utilisant Jasypt, nous pouvons fournir un chiffrement pour les attributs du fichier de propriétés et notre application fera le travail de le déchiffrer et de récupérer la valeur d'origine.

3. Façons d'utiliser JASYPT avec Spring Boot

Discutons des différentes façons d'utiliser Jasypt avec Spring Boot.

3.1. Utilisation de jasypt -spring-boot-starter

Nous devons ajouter une seule dépendance à notre projet:

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

Maven Central a la dernière version du jasypt-spring-boot-starter.

Crypterons maintenant le texte «[email protected]» avec la clé secrète «password» et ajoutons-le au encrypted.properties:

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

Et définissons une classe de configuration AppConfigForJasyptStarter - pour spécifier le fichier encrypted.properties comme PropertySource :

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

Maintenant, nous allons écrire un bean service PropertyServiceForJasyptStarter pour récupérer les valeurs de encrypted.properties . La valeur déchiffrée peut être récupérée à l'aide de l' annotation @Value ou de la méthode getProperty () de la classe 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"); } } 

Enfin, en utilisant la classe de service ci-dessus et en définissant la clé secrète que nous avons utilisée pour le chiffrement, nous pouvons facilement récupérer le mot de passe déchiffré et l'utiliser dans notre application :

@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. Utilisation de jasypt-spring-boot

Pour les projets n'utilisant pas @SpringBootApplication ou @EnableAutoConfiguration , nous pouvons utiliser directement la dépendance jasypt -spring-boot :

 com.github.ulisesbocchio jasypt-spring-boot 2.0.0 

De même, chiffrons le texte «[email protected]» avec la clé secrète «password» et ajoutons-le à encryptedv2.properties :

encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)

Et nous allons avoir une nouvelle classe de configuration pour la dépendance jasypt-spring-boot.

Ici, nous devons ajouter l'annotation @EncryptablePropertySource :

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

En outre, un nouveau bean PropertyServiceForJasyptSimple pour renvoyer encryptedv2.properties est défini:

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

Enfin, en utilisant la classe de service ci-dessus et en définissant la clé secrète que nous avons utilisée pour le chiffrement, nous pouvons facilement récupérer la propriété 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. Utilisation du chiffrement JASYPT personnalisé

Les chiffreurs définis à la section 3.1. et 3.2. sont construits avec les valeurs de configuration par défaut.

Cependant, définissons notre propre crypteur Jasypt et essayons de l'utiliser pour notre application.

S0, le bean de chiffrement personnalisé ressemblera à:

@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; } 

De plus, nous pouvons modifier toutes les propriétés de SimpleStringPBEConfig.

De plus, nous devons ajouter une propriété «jasypt.encryptor.bean» à notre application.properties, afin que Spring Boot sache quel Custom Encryptor il doit utiliser .

Par exemple, nous ajoutons le texte personnalisé «[email protected]» chiffré avec la clé secrète «password» dans l' application.properties:

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

Une fois que nous l'avons défini, nous pouvons facilement obtenir la propriété encryptedv3.property à partir de Spring's Environment :

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

4. Conclusion

En utilisant Jasypt, nous pouvons fournir une sécurité supplémentaire pour les données traitées par l'application .

Cela nous permet de nous concentrer davantage sur le cœur de notre application et peut également être utilisé pour fournir un cryptage personnalisé si nécessaire.

Comme toujours, le code complet de cet exemple est disponible à l'adresse over sur Github.