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.