Configurazione Spring Boot con Jasypt

1. Introduzione

Jasypt (Java Simplified Encryption) Spring Boot fornisce utilità per crittografare le origini delle proprietà nelle applicazioni di avvio.

In questo articolo, discuteremo di come aggiungere il supporto di jasypt-spring-boot e usarlo.

Per ulteriori informazioni sull'utilizzo di Jasypt come framework per la crittografia, dai un'occhiata alla nostra Introduzione a Jasypt qui.

2. Perché Jasypt?

Ogni volta che abbiamo bisogno di memorizzare informazioni sensibili nel file di configurazione, ciò significa che essenzialmente rendiamo quelle informazioni vulnerabili; questo include qualsiasi tipo di informazione sensibile, come le credenziali, ma sicuramente molto di più.

Utilizzando Jasypt, possiamo fornire la crittografia per gli attributi del file delle proprietà e la nostra applicazione farà il lavoro di decrittografarlo e recuperare il valore originale.

3. Modi per utilizzare JASYPT con Spring Boot

Parliamo dei diversi modi per utilizzare Jasypt con Spring Boot.

3.1. Utilizzando jasypt -spring -boot-starter

Dobbiamo aggiungere una singola dipendenza al nostro progetto:

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

Maven Central ha l'ultima versione del jasypt-spring-boot-starter.

Crittografiamo ora il testo "[email protected]" con la chiave segreta "password" e aggiungiamolo a encrypted.properties:

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

E definiamo una classe di configurazione AppConfigForJasyptStarter - per specificare il file encrypted.properties come PropertySource :

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

Ora scriveremo un bean di servizio PropertyServiceForJasyptStarter per recuperare i valori da encrypted.properties . Il valore decrittografato può essere recuperato utilizzando l' annotazione @Value o il metodo getProperty () della 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"); } } 

Infine, utilizzando la classe di servizio sopra e impostando la chiave segreta che abbiamo usato per la crittografia, possiamo facilmente recuperare la password decrittografata e utilizzarla nella nostra applicazione :

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

Per i progetti che non utilizzano @SpringBootApplication o @EnableAutoConfiguration , possiamo usare direttamente la dipendenza jasypt -spring -boot :

 com.github.ulisesbocchio jasypt-spring-boot 2.0.0 

Allo stesso modo, crittografiamo il testo "[email protected]" con la chiave segreta "password" e aggiungiamolo a encryptedv2.properties :

encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)

E diamo una nuova classe di configurazione per la dipendenza jasypt-spring-boot.

Qui, dobbiamo aggiungere l'annotazione @EncryptablePropertySource :

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

Inoltre, viene definito un nuovo bean PropertyServiceForJasyptSimple per restituire encryptedv2.properties :

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

Infine, utilizzando la classe di servizio sopra e impostando la chiave segreta che abbiamo usato per la crittografia, possiamo facilmente recuperare il file 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. Utilizzo di JASYPT Encryptor personalizzato

I codificatori definiti nella sezione 3.1. e 3.2. sono costruiti con i valori di configurazione predefiniti.

Tuttavia, andiamo a definire il nostro crittografo Jasypt e proviamo a usarlo per la nostra applicazione.

S0, il bean di crittografia personalizzato avrà il seguente aspetto:

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

Inoltre, possiamo modificare tutte le proprietà per SimpleStringPBEConfig.

Inoltre, dobbiamo aggiungere una proprietà "jasypt.encryptor.bean" al nostro application.properties, in modo che Spring Boot sappia quale Custom Encryptor deve utilizzare .

Ad esempio, aggiungiamo il testo personalizzato "[email protected]" crittografato con chiave segreta "password" in application.properties:

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

Una volta che abbiamo impostato, si può facilmente ottenere l'encryptedv3.property dal Spring Ambiente :

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

4. Conclusione

Utilizzando Jasypt possiamo fornire ulteriore sicurezza per i dati gestiti dall'applicazione .

Ci consente di concentrarci maggiormente sul nucleo della nostra applicazione e può anche essere utilizzato per fornire la crittografia personalizzata, se necessario.

Come sempre, il codice completo per questo esempio è disponibile su Github.