Spring Boot-Konfiguration mit Jasypt

1. Einleitung

Jasypt (Java Simplified Encryption) Spring Boot bietet Dienstprogramme zum Verschlüsseln von Eigenschaftsquellen in Boot-Anwendungen.

In diesem Artikel werden wir diskutieren, wie wir die Unterstützung von jasypt-spring-boot hinzufügen und verwenden können.

Weitere Informationen zur Verwendung von Jasypt als Framework für die Verschlüsselung finden Sie in unserer Einführung in Jasypt hier.

2. Warum Jasypt?

Wann immer wir vertrauliche Informationen in der Konfigurationsdatei speichern müssen, bedeutet dies, dass wir diese Informationen im Wesentlichen anfällig machen. Dazu gehören alle Arten von vertraulichen Informationen, wie z. B. Anmeldeinformationen, aber sicherlich noch viel mehr.

Mit Jasypt können wir die Eigenschaften der Eigenschaftendatei verschlüsseln, und unsere Anwendung entschlüsselt sie und ruft den ursprünglichen Wert ab.

3. Möglichkeiten zur Verwendung von JASYPT mit Spring Boot

Lassen Sie uns die verschiedenen Möglichkeiten zur Verwendung von Jasypt mit Spring Boot diskutieren.

3.1. Verwenden von Jasypt -spring-boot-Starter

Wir müssen unserem Projekt eine einzige Abhängigkeit hinzufügen:

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

Maven Central hat die neueste Version des Jasypt-Spring-Boot-Starters.

Verschlüsseln wir nun den Text "[email protected]" mit dem geheimen Schlüssel "password" und fügen ihn den encrypted.properties hinzu:

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

Definieren wir eine Konfigurationsklasse AppConfigForJasyptStarter , um die Datei encrypted.properties als PropertySource anzugeben :

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

Jetzt schreiben wir eine Service-Bean PropertyServiceForJasyptStarter , um die Werte aus den encrypted.properties abzurufen . Der entschlüsselte Wert kann mit der Annotation @Value oder der Methode getProperty () der Umgebungsklasse abgerufen werden :

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

Schließlich die oben genannte Service - Klasse und den geheimen Schlüssels Einstellung , die wir für die Verschlüsselung verwendet, können wir das entschlüsselte Passwort und Verwendung in unserer Anwendung einfach abrufen :

@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. Mit Jasypt-Spring-Boot

Für Projekte, die @SpringBootApplication oder @EnableAutoConfiguration nicht verwenden , können wir die jasypt -spring-boot- Abhängigkeit direkt verwenden:

 com.github.ulisesbocchio jasypt-spring-boot 2.0.0 

In ähnlicher Weise verschlüsseln wir den Text "[email protected]" mit dem geheimen Schlüssel "password" und fügen ihn den Eigenschaften " encryptedv2.properties" hinzu :

encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)

Und lassen Sie uns eine neue Konfigurationsklasse für die Jasypt-Spring-Boot-Abhängigkeit haben.

Hier müssen wir die Anmerkung @EncryptablePropertySource hinzufügen :

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

Außerdem wird eine neue PropertyServiceForJasyptSimple- Bean definiert, die encryptedv2.properties zurückgibt:

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

Schließlich können wir mithilfe der oben genannten Serviceklasse und dem Festlegen des geheimen Schlüssels, den wir für die Verschlüsselung verwendet haben, die Eigenschaft encryptedv2.property problemlos abrufen :

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

3.3. Verwenden des benutzerdefinierten JASYPT-Verschlüsselers

Die in Abschnitt 3.1 definierten Verschlüsseler. und 3.2. werden mit den Standardkonfigurationswerten erstellt.

Lassen Sie uns jedoch unseren eigenen Jasypt-Verschlüsseler definieren und versuchen, ihn für unsere Anwendung zu verwenden.

S0, die benutzerdefinierte Verschlüsselungs-Bean sieht folgendermaßen aus:

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

Darüber hinaus können wir alle Eigenschaften für SimpleStringPBEConfig ändern.

Außerdem müssen wir unserer application.properties eine Eigenschaft "jasypt.encryptor.bean" hinzufügen , damit Spring Boot weiß, welchen benutzerdefinierten Verschlüsseler er verwenden soll .

Zum Beispiel fügen wir den benutzerdefinierten Text "[E-Mail geschützt]", verschlüsselt mit dem geheimen Schlüssel "Passwort", in die application.properties ein:

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

Sobald wir es festgelegt haben, können wir die Eigenschaft encryptedv3. einfach aus der Spring- Umgebung abrufen :

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

4. Fazit

Durch die Verwendung von Jasypt können wir zusätzliche Sicherheit für die Daten bieten, die von der Anwendung verarbeitet werden .

Dadurch können wir uns mehr auf den Kern unserer Anwendung konzentrieren und bei Bedarf auch eine benutzerdefinierte Verschlüsselung bereitstellen.

Wie immer ist der vollständige Code für dieses Beispiel auf Github verfügbar.