Konfigurasi Spring Boot dengan Jasypt

1. Perkenalan

Jasypt (Java Simplified Encryption) Spring Boot menyediakan utilitas untuk mengenkripsi sumber properti dalam aplikasi Boot.

Pada artikel ini, kita akan membahas bagaimana kita dapat menambahkan dukungan jasypt-spring-boot dan menggunakannya.

Untuk informasi lebih lanjut tentang menggunakan Jasypt sebagai kerangka kerja untuk enkripsi, lihat Pengantar Jasypt kami di sini.

2. Mengapa Jasypt?

Kapanpun kita perlu menyimpan informasi sensitif dalam file konfigurasi - itu berarti kita pada dasarnya membuat informasi itu rentan; ini termasuk segala jenis informasi sensitif, seperti kredensial, tetapi tentu saja lebih dari itu.

Dengan menggunakan Jasypt, kami dapat menyediakan enkripsi untuk atribut file properti dan aplikasi kami akan melakukan tugas mendekripsi dan mengambil nilai aslinya.

3. Cara Menggunakan JASYPT Dengan Spring Boot

Mari kita bahas berbagai cara menggunakan Jasypt dengan Spring Boot.

3.1. Menggunakan jasypt -spring -boot-starter

Kita perlu menambahkan satu ketergantungan ke proyek kita:

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

Maven Central memiliki versi terbaru jasypt-spring-boot-starter.

Sekarang mari kita mengenkripsi teks "[email protected]" dengan "password" kunci rahasia dan menambahkannya ke encrypted.properties:

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

Dan mari kita definisikan kelas konfigurasi AppConfigForJasyptStarter - untuk menentukan file encrypted.properties sebagai PropertySource :

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

Sekarang, kita akan menulis kacang layanan PropertyServiceForJasyptStarter untuk mengambil nilai dari encrypted.properties . Nilai yang didekripsi bisa diambil menggunakan anotasi @Value atau metode getProperty () dari kelas 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"); } } 

Akhirnya, dengan menggunakan kelas layanan di atas dan menyetel kunci rahasia yang kami gunakan untuk enkripsi, kami dapat dengan mudah mengambil kata sandi yang telah didekripsi dan menggunakannya dalam aplikasi kami :

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

Untuk project yang tidak menggunakan @SpringBootApplication atau @EnableAutoConfiguration , kita dapat menggunakan dependensi jasypt -spring -boot secara langsung:

 com.github.ulisesbocchio jasypt-spring-boot 2.0.0 

Demikian pula, mari mengenkripsi teks "[email protected]" dengan kunci rahasia "sandi" dan menambahkannya ke properti encryptedv2.properties :

encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)

Dan mari kita memiliki kelas konfigurasi baru untuk dependensi jasypt-spring-boot.

Di sini, kita perlu menambahkan anotasi @EncryptablePropertySource :

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

Juga, bean PropertyServiceForJasyptSimple baru untuk mengembalikan encryptedv2.properties didefinisikan:

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

Terakhir, dengan menggunakan kelas layanan di atas dan menyetel kunci rahasia yang kami gunakan untuk enkripsi, kami dapat dengan mudah mengambil properti 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. Menggunakan Custom JASYPT Encryptor

Enkriptor didefinisikan di bagian 3.1. dan 3.2. dibangun dengan nilai konfigurasi default.

Namun, mari kita pergi dan tentukan encryptor Jasypt kita sendiri dan coba gunakan untuk aplikasi kita.

S0, kacang pengenkripsi kustom akan terlihat seperti:

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

Selanjutnya, kita dapat memodifikasi semua properti untuk SimpleStringPBEConfig.

Selain itu, kita perlu menambahkan properti “jasypt.encryptor.bean” ke application.properties kita , sehingga Spring Boot mengetahui Pengenkripsi Kustom mana yang harus digunakan .

Misalnya, kami menambahkan teks khusus "[email protected]" yang dienkripsi dengan "sandi" kunci rahasia di application.properties:

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

Setelah kami mengaturnya, kami dapat dengan mudah mendapatkan properti encryptedv3. dari Spring's Environment :

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

4. Kesimpulan

Dengan menggunakan Jasypt kami dapat memberikan keamanan tambahan untuk data yang ditangani aplikasi .

Ini memungkinkan kami untuk lebih fokus pada inti aplikasi kami dan juga dapat digunakan untuk menyediakan enkripsi khusus jika diperlukan.

Seperti biasa, kode lengkap untuk contoh ini tersedia di Github.