Cara Enkripsi Variabel Sensitif di Spring Boot Menggunakan Jasypt
Gambar diatas adalah contoh konfigurasi Spring Boot sederhana, dengan username, password, dan URL database yang dibutuhkan untuk menjalankan aplikasi Spring Boot yang sangat sederhana.
Namun apabila kita terlibat dalam suatu proses pembuatan aplikasi yang critical, terutama yang berkaitan dengan financial services atau keuangan, maka konfigurasi diatas tidaklah cukup. Karena ada beberapa variabel sensitif yang bisa dilihat langsung, seperti password database.
Untunglah ada library seperti Jasypt yang mempunyai kapabilitas untuk enkripsi variabel yang dianggap sensitif, cara penggunaannya pun cukup mudah karena sudah otomatis terintegrasi dengan Spring Boot.
Intro
Sebelum mulai, kita harus encrypt variabel kita menggunakan Jasypt. Saya menggunakan versi terbaru (saat ini) yaitu versi 1.9.3, dan bisa di-download dari url berikut ini, https://github.com/jasypt/jasypt/releases/tag/jasypt-1.9.3.
Extract dan kemudian jalankan command dibawah,
D:\jasypt-1.9.3\bin>encrypt.bat password=MY_SECRET algorithm=PBEWithMD5AndTripleDES input=admin123
Untuk contoh diatas, saya menggunakan algoritma PBEWithMD5 AndTripleDES dan salt MY_SECRET. Sedangkan admin123 adalah String yang ingin di-enkripsi.
Hasilnya kurang-lebih seperti dibawah ini,
D:\jasypt-1.9.3\bin>encrypt.bat password=MY_SECRET algorithm=PBEWithMD5AndTripleDES input=admin123----ENVIRONMENT-----------------Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 11.0.4+10-LTS----ARGUMENTS-------------------input: admin123
password: MY_SECRET
algorithm: PBEWithMD5AndTripleDES----OUTPUT----------------------6t6KjmMJx4tl8zoJl/8m05ujxBRq/88D
Kemudian kita include output dari command diatas kedalam application.properties, menggantikan variabel password database yang sebelumnya plain text.
Code
kita include Jasypt kedalam pom.xml,
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
Dan pastikan bahwa Spring Boot kita bisa membaca variabel yang sudah terenkripsi, dengan menambahkan annotation @EnableEncryptableProperties,
@SpringBootApplication
@EnableEncryptableProperties
public class StarterApplication {
public static void main(String[] args) {
SpringApplication.run(StarterApplication.class, args);
}
}
Dan menambahkan parameter berikut di dalam application.properties kita, pastikan kita menggunakan variabel yang sama seperti yang kita gunakan ketika menjalankan perintah encrypt.bat.
# jasypt encryption key
jasypt.encryptor.password=MY_SECRET
jasypt.encryptor.algorithm=PBEWithMD5AndTripleDES
jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator
Dibawah ini adalah tampilan application.properties setelah ditambahkan jasypt encryption.
Solusi Lain yang Lebih Secure
Solusi diatas bisa jalan, namun masih kurang secure karena variabel jasypt.encryptor.password masih bisa dilihat secara langsung. Untuk lebih amannya, kita bisa inject variabel jasypt.encryptor.password di runtime aplikasi kita menggunakan command berikut,
java -jar -Djasypt.encryptor.password=MY_SECRET aplikasi-saya.jar
Atau apabila menggunakan Openshift, cukup tambahkan variabel tersebut kedalam environment dari DeploymentConfig,
oc set env dc/nama-aplikasi-saya -n nama-project jasypt.encryptor.password=MY_SECRET
Cara Testing
Kita bisa evaluasi apakah code kita berjalan dengan semestinya atau tidak, dengan menggunakan Unit Testing sederhana seperti dibawah ini,