Showing posts with label security. Show all posts
Showing posts with label security. Show all posts

Wednesday, June 15, 2016

Teori Implementasi JWT pada Spring Security

Bagaimana mengimplementasi JWT menggunakan Spring Security?


Setelah mempelajari JWT pada blog, saya mencoba untuk mengimplementasikan JWT menggunakan Spring Security. Google sana-sini, akhirnya berhasil juga. :)

Secara umum teori untuk dapat mengimplementasikan JWT pada Spring Security, kita memerlukan modul-modul :
  • spring-security-oauth2
  • <dependency>
       <groupId>org.springframework.security.oauth</groupId>
       <artifactId>spring-security-oauth2</artifactId>
       <version>2.0.9.RELEASE</version>
    </dependency>
  • spring-security-jwt
  • <dependency<
       <groupId>org.springframework.security</groupId>
       <artifactId>spring-security-jwt</artifactId>
       <version>1.0.4.RELEASE</version>
    </dependency>

Sedangkan untuk konfigurasi Authorization Server, minimal kita harus mengimplementasi interface berikut :
  • org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurer
  • Interface ini berguna untuk mengkonfigurasi dan mendefinisikan bean-bean yang dibutuhkan sebagai Authorization Server untuk meng-authentikasi Client Detail seperti :
    • AuthenticationManager
    • PasswordEncoder
    • ClientDetailsService
    • TokenStore
    • TokenEnhancer
    • AccessTokenConverter
    • dll
  • org.springframework.security.oauth2.provider.ClientDetailsService
  • Interface ini berguna untuk mendefinisikan Client Detail yang digunakan untuk Authorization Server.
  • org.springframework.security.core.userdetails.UserDetailsService
  • Interface ini berguna untuk mendefinisikan User yang digunakan untuk Authorization Server.
  • org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
  • Interface ini berguna untuk mengkonfigurasi dan mendefinisikan bean-bean yang dibutuhkan sebagai Authorization Server untuk meng-authentikasi User seperti :
    • AuthenticationManager
    • PasswordEncoder
    • UserDetailsService
    • HttpSecurity
    • dll

Apabila ingin menjadikan sebagai Resource Server, maka perlu mengimplementasi interface :
  • org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurer
  • Interface ini berguna untuk mengkonfigurasi dan mendefinisikan bean-bean yang dibutuhkan sebagai Resource Server untuk meng-authentikasi User seperti :
    • TokenStore
    • AccessTokenConverter
    • HttpSecurity
    • dll

Sekian sharing tentang JWT + Spring Security, pada blog selanjutnya saya akan share implementasi(source code) JWT pada Spring Security. Semoga bermanfaat. :)

JWT (JSON Web Token)

JSON Web Token atau lebih dikenal dengan JWT, merupakan sebuah token berbentuk JSON yang padat (ukurannya), informasi mandiri untuk ditransmisikan antar pihak yang terkait. Token tersebut ini dapat diverifikasi dan dipercaya karena sudah di-sign secara digital. Token JWT bisa di-sign dengan menggunakan secret (algoritma HMAC) atau pasangan public / private key (algoritma RSA).

Kenapa dibilang JSON yang padat ?, karena ukurannya yang kecil, token JWT dapat dikirim melalui URL, Parameter Http POST atau di dalam Header Http. Dan juga karena ukurannya yang kecil maka dapat ditransmisikan dengan lebih cepat.

Dan kenapa dibilang Informasi mandiri ?, karena isi dari tokennya mengandung informasi dari user yang dibutuhkan, sehingga tidak perlu query ke database lebih dari 1 kali.

Untuk lebih memperjelas mari kita lihat contoh tokennya :
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.EkN-DOsnsuRjRO6BxXemmJDm3HbxrbRzXglbN2S4sOkopdU4IsDxTI8jO19W_A4K8ZPJijNLis4EZsHeY559a4DFOd50_OqgHGuERTqYZyuhtF39yxJPAjUESwxk2J5k_4zM3O-vtd1Ghyo4IbqKKSy6J9mTniYJPenn5-HIirE
Pada contoh token tersebut terdapat 3 bagian yaitu :
  1. Header (Algoritma & Jenis Token)
  2. eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
  3. Payload (Data)
  4. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
  5. Signature (Verify Signature)
  6. EkN-DOsnsuRjRO6BxXemmJDm3HbxrbRzXglbN2S4sOkopdU4IsDxTI8jO19W_A4K8ZPJijNLis4EZsHeY559a4DFOd50_OqgHGuERTqYZyuhtF39yxJPAjUESwxk2J5k_4zM3O-vtd1Ghyo4IbqKKSy6J9mTniYJPenn5-HIirE
    Untuk lebih jelas, bisa cek ke https://jwt.io/#debugger dengan memasukan token seperti diatas.

Kapan sebaiknya kita menggunakan JWT ?


JWT umumnya digunakan untuk :
  • Autentikasi
  • Ketika user/client melakukan autentikasi dan mendapatkan token, maka untuk seterusnya setiap request harus menyertakan token tersebut.
  • Pertukaran Informasi
  • Dengan token yang sudah di-sign misal dengan algoritma RSA, kita dapat mengetahui dan yakin siapa yang melakukan request tersebut. Terlebih dengan isi pada bagian Signature merupakan gabungan dari isi Header dan Payload, jadi jika isi Header/Payload dirubah maka isi Signature menjadi tidak valid.

Bagaimana JWT bekerja ?


Umumnya ketika user berhasil melakukan login, maka server akan mengembalikan token JWT dan akan disimpan pada Local Storage / Cookies Browser. Selanjutnya untuk setiap request yang akan mengakses API yang terproteksi harus menyertakan token tersebut.

Umumnya token tersebut akan disertakan pada Authorization Header dengan Bearer schema, contohnya seperti ini :
Authorization: Bearer <token>

Ini merupakan mekanisme autentikasi yang stateless, karena state user yang login tidak disimpan pada memory server. Jadi setiap request kepada API yang terproteksi akan dicek apakah token JWT yang ada di Authorization header valid atau tidak, bila valid maka request akan diijinkan dan diproses.

Dan karena semua informasi yang dibutuhkan pada JWT sudah lengkap, maka setiap proses pengecekan tersebut sudah tidak perlu lagi melakukan query ke database.

Sekian sharing kali ini, semoga menambah wawasan kita semua. :)

Monday, December 14, 2015

Android Proguard

Pada sesi kali ini kita akan sharing tentang android proguard. Apa itu Proguard ?.
Proguard adalaha tool proteksi yang diperuntukkan untuk java class digunakan untuk shrink (memperkecil ukuran), optimasi dan obfuscate code (menyembunyikan class).
Biasanya digunakan untuk mencegah decompile java class (mengubah *.class kembali menjadi *.java). Dengan proguard class name, variable dan method name bisa disamarkan.
Pada kasus ini akan dicoba untuk aplikasi android. Jika suatu aplikasi sudah beredar ke public (sudah masuk di google play) maka orang akan dengan mudah mendapatkan file APK dari aplikasi itu.
File apk sebenarnya sama seperti file zip yang berisi file *.class dan file resourse android lain (image, xml layout). Karena itu file class akan mudah di decompile dan orang akan mudah melakukan reverse-engineering.
Sekarang akan kita coba di android. Buat satu android project dan jalankan sampai terbentuk file apk.
Kemudian coba kita decompile apk itu menggunakan online decompiler ini (http://www.decompileandroid.com). download hasil decompilernya (berupa zip file kemudian extact). Di folder src package akan muncul file-file class.


Kalau classnya dibuka pun isinya akan sama seperti yang kita coding.


Tentu hal ini akan berbahaya karena code kita bisa dicuri orang.
Untuk mengaktifkan proguard di android studio ->  di build.gradle minifyEnabled di set true.

 ......................... 
 buildTypes {  
     debug {  
       minifyEnabled true  
       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
     }  
     release {  
       minifyEnabled true  
       proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
     }  
   }  
 ...........................

Kemudian kita coba decompile lagi file apk nya.



Class name sudah berubah menjadi acak (termasuk nama method dan variable), untuk class activity yang merefer ke androidManifest name nya tidak diacak. tapi method name dan varible name di dalamnya sudah diacak.

 // Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.  
 // Jad home page: http://www.geocities.com/kpdus/jad.html  
 // Decompiler options: braces fieldsfirst space lnc   
 package characters.gameofcharacters;  
 import android.view.View;  
 import android.widget.EditText;  
 import android.widget.ImageView;  
 import android.widget.RadioButton;  
 import android.widget.RadioGroup;  
 // Referenced classes of package characters.gameofcharacters:  
 //      AddCharacterActivity  
 class b  
   implements android.view.View.OnClickListener  
 {  
   final AddCharacterActivity a;  
   b(AddCharacterActivity addcharacteractivity)  
   {  
     a = addcharacteractivity;  
     super();  
   }  
   public void onClick(View view)  
   {  
     view = (RadioButton)a.findViewById(a.m.getCheckedRadioButtonId());  
     if (a.i.getTag() == null)  
     {  
       AddCharacterActivity.a(a, a.getString(0x7f060018));  
       return;  
     }  
     if (a.j.getText().toString().trim().isEmpty())  
     {  
       a.j.setError("Cannot be empty");  
       return;  
     }  
     if (view == null)  
     {  
       AddCharacterActivity.a(a, a.getString(0x7f060017));  
       return;  
     } else  
     {  
       a.a(view);  
       return;  
     }  
   }  
 }  

Kalau name nya sudah diacak tentu kan sedikit menyulitkan orang lain saat membacanya dan mentrace nya.
Kadang ada beberapa class yang tidak boleh di obfuscated, tinggal tambahkan konfigurasi di file proguard-rule.pro.
-keep <class> : class name
-keepclassmember <class> : varible dan method name
-keepclasseswithmember <class> : class beserta variable, method name

Contoh :

 -keep class * extends android.app.Application{  
   *;  
 }  
 -keep class characters.gameofcharacters.model.** {  
   *;  
 }  
 -keepclassmembers class characters.gameofcharacters.DBHelper {  
   *;  
 }  

Ulangi proses decompiler lagi. maka class yang didefinisikan di proguard-rule akan diskip

Kelemahan

Proguard ini hanya bisa menyamarkan name nya saja tidak bisa obfuscate isi code atau algoritma kita secara utuh. Dan juga tidak bisa obfuscate untuk file file resources seperti layout xml, values xml, image, dan file assets lainnya

Sebenarnya untuk melakukan full obfuscate (full protection) kita bisa menggunakan Dex-Guard. Tapi feature ini sayangnya tidak gratis alias berbayar. Biasanya dipakai untuk aplikasi yang enterprice kelasnya. Berikut ini perbandingan antara ProGuard dan Dex-Guard.

Alternatif yang lain adalah coding menggunakan android NDK (berbasis C++) untuk beberapa code logic yang dirasa rahasia. Code yang ditulis dengan C++ akan lebih sulit didecompiler dibandingkan java.



Selamat mencoba dan semoga bermanfaat.

Terima kasih

Referensi :
1. http://developer.android.com/tools/help/proguard.html
2. https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/usage.html

Sunday, September 15, 2013

Web Service Security dengan OWSM

Kerahasian suatu informasi harus kita jaga. Untuk itu perlu adanya security. Dengan adanya security, hanya orang-orang yang berhak yang bisa mengakses resource (dalam hal ini web service) yang kita miliki. Untuk web service, security yang di sediakan oleh Oracle adalah OWSM.

Apa itu OWSM ?

OWSM adalah Oracle Web Service Manager. OWSM merupakan solusi yang di tawarkan Oracle untuk kebijakan manajemen dan keamanan di dalam infrastruktur. Cara pemakaiannya sangat mudah, karena di kontrol dengan User Interface yang apik di aplikasi Oracle Enterprise Manager (Oracle EM).

OWSM menggunakan username dan password yang ada di Oracle Weblogic sebagai otentikasinya. Semua user diatur oleh Security Realm di Oracle Weblogic Console.

Bagaimana cara menggunakannya ?

Ada prasyarat yang harus dipenuhi, yaitu :

  • Web Service yang telah di deploy di Weblogic. Dalam hal ini saya menggunakan contoh ini.
  • User selain weblogic di Security Realm. Tidak dianjurkan menggunakan user weblogic, karena user weblogic memiliki otoritas yang luas.

Setelah prasyarat dipenuhi, langkah-langkah menggunakan OWSM di Web Service kita adalah :

  • Login ke EM (http://hostname:port/em) dengan username weblogic.
  • Pilih Web Service yang akan di pasang OWSM. Dalam hal ini HelloWorld Web Service.
  • Klik Policies
  • Klik Attach To/Deatach Form 
  • Pilih nama servicenya. Dalam hal ini hi_client_ep.
  • Pilih oracle/wss_username_token_service_policy
  • Klik OK untuk simpan.
  • Selesai
Bagaimana cara testingnya ?

Ada 2 cara, yaitu :
  1. Test melalui Enterprise Manager
  2. Test melalui SOAP-UI
Menggunakan EM
Cara testing dengan EM sangatlah mudah, yaitu :
  • Login ke EM (http://hostname:port/em) dengan username weblogic.
  • Pilih Web Service yang akan kita test. Dalam hal ini HelloWorld Web Service.
  • Expand bagian Security.
  • Pilih OWSM Security Policies.
  • Masukkan username dan password yang ada di Security Realm.
  • Isi parameter input-nya.
  • Tunggu nilai baliknya dan selesai.

Menggunakan SOAP-UI
Untuk penggunaan SOAP-UI sedikit lebih rumit, karena ada username dan password yang harus kita atur terlebih dahulu. Berikut langkah-langkahnya :
  • Buka aplikasi SOAP-UI
  • Bikin project dengan WSDL dari HelloWorld Web Service.
  • Klik dua kali pada bagian project properties.
  • Pilih WS-Security Configurations.
  • Pilih Outgoing WS-Security Configurations.
  • Pilih Add a New Outgoing WS-Security Configurations.
  • Masukkan yang unik untuk configuration. Dalam hal ini HelloWorld.
  • Pilih Add a New WSS Entry pada bagian bawah.
  • Pilih username.
  • Isikan username dan password.
  • Pilih PasswordTest pada bagian Password Type.
  • Klik dua kali pada bagian HiBinding.
  • Pilih Service Endpoints.
  • Pada bagian Outgoing WS pilih HelloWorld.

  • Klik dua kali pada bagian request.
  • Isikan parameter input-nya.
  • Tunggu nilai baliknya dan selesai.
Apa yang terjadi jika kita mengisikan username dan password ?

Akan terjadi error seperti berikut :