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,

--

--

Muhammad Edwin
Development using RedHat Product. (This is an Unofficial Blog)

A RedHatter and Digital Nomad, with Jeans, Sneakers, Laptop and Coffees, anytime — anywhere.