Konfigurasi Spring Boot dengan Jasypt

1. Pengenalan

Jasypt (Java Simplified Encryption) Spring Boot menyediakan utiliti untuk menyulitkan sumber harta tanah dalam aplikasi Boot.

Dalam artikel ini, kita akan membincangkan bagaimana kita dapat menambahkan sokongan jasypt-spring-boot dan menggunakannya.

Untuk maklumat lebih lanjut mengenai penggunaan Jasypt sebagai rangka kerja penyulitan, lihat Pengenalan Jasypt kami di sini.

2. Mengapa Jasypt?

Bila-bila masa kita perlu menyimpan maklumat sensitif dalam fail konfigurasi - itu bermaksud kita pada dasarnya menjadikan maklumat itu mudah terdedah; ini merangkumi segala jenis maklumat sensitif, seperti bukti kelayakan, tetapi pastinya lebih banyak daripada itu.

Dengan menggunakan Jasypt, kami dapat menyediakan enkripsi untuk atribut fail harta tanah dan aplikasi kami akan melakukan tugas menyahsulitnya dan mendapatkan kembali nilai asalnya.

3. Cara Menggunakan JASYPT Dengan Spring Boot

Mari kita bincangkan pelbagai cara untuk menggunakan Jasypt dengan Spring Boot.

3.1. Menggunakan jasypt -spring -boot-starter

Kita perlu menambahkan satu kebergantungan pada projek kita:

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

Maven Central mempunyai versi terbaru dari jasypt-spring-boot-starter.

Sekarang mari kita mengenkripsi teks "[dilindungi e-mel]" dengan kunci rahsia "kata laluan" dan menambahkannya ke enkripsi.properties:

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

Dan mari kita tentukan kelas konfigurasi AppConfigForJasyptStarter - untuk menentukan fail encrypted.properties sebagai PropertySource :

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

Sekarang, kami akan menulis bean perkhidmatan PropertyServiceForJasyptStarter untuk mendapatkan nilai dari enkripsi.properties . Nilai dibuka boleh diambil menggunakan @value anotasi atau getProperty () kaedah Alam Sekitar kelas:

@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 perkhidmatan di atas dan menetapkan kunci rahsia yang kami gunakan untuk penyulitan, kami dapat dengan mudah mendapatkan kata laluan yang didekripsi dan digunakan 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 projek yang tidak menggunakan @SpringBootApplication atau @EnableAutoConfiguration , kita boleh menggunakan pergantungan jasypt -spring -boot secara langsung:

 com.github.ulisesbocchio jasypt-spring-boot 2.0.0 

Begitu juga, mari kita mengenkripsi teks "[dilindungi e-mel]" dengan kunci rahsia "kata laluan" dan menambahkannya ke enkripsiv2.properties :

encryptedv2.property=ENC(dQWokHUXXFe+OqXRZYWu22BpXoRZ0Drt)

Dan mari kita mempunyai kelas konfigurasi baru untuk ketergantungan jasypt-spring-boot.

Di sini, kita perlu menambahkan anotasi @EncryptablePropertySource :

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

Juga, kacang PropertiServiceForJasyptSimple baru untuk mengembalikan enkripsiv2.properties ditakrifkan:

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

Akhirnya, dengan menggunakan kelas perkhidmatan di atas dan menetapkan kunci rahsia yang kami gunakan untuk penyulitan, kami dapat dengan mudah mendapatkan enkripsiv2.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 Encryptor JASYPT Custom

Enkripsi yang ditentukan dalam bahagian 3.1. dan 3.2. dibina dengan nilai konfigurasi lalai.

Walau bagaimanapun, mari pergi dan tentukan enkripsi Jasypt kita sendiri dan cuba gunakan untuk aplikasi kita.

S0, kacang enkripsi khas akan kelihatan 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 mengubahsuai semua sifat untuk SimpleStringPBEConfig.

Juga, kita perlu menambahkan harta "jasypt.encryptor.bean" ke application.properties kami , supaya Spring Boot tahu Encryptor Kustom mana yang harus digunakan .

Sebagai contoh, kami menambahkan teks khusus "[dilindungi e-mel]" yang disulitkan dengan "kata laluan" kunci rahsia dalam aplikasi.

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

Setelah kami menetapkannya, kami dapat dengan mudah mendapatkan enkripsi v3.property 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 kita dapat memberikan keselamatan tambahan untuk data yang dikendalikan aplikasi .

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

Seperti biasa, kod lengkap untuk contoh ini terdapat di Github.