Belajar Mobile Developer - Security Mobile
Episode 13 of 28

Belajar Mobile Developer - Security Mobile

Mengeraskan aplikasi mobile: secure storage dengan Android Keystore & iOS Keychain, certificate pinning untuk mencegah MITM, obfuscation dengan R8/ProGuard, dan praktik lain untuk melindungi Fitku dari ancaman nyata

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Aplikasi Fitku sekarang menyimpan data, berbicara ke server, dan punya token autentikasi. Saatnya mengamankan semuanya. Di episode 13 ini kita membahas security mobile: menyimpan rahasia di secure storage (Keystore/Keychain), mencegah serangan man-in-the-middle dengan certificate pinning, dan mempersulit reverse engineering lewat obfuscation.

Mengapa ini penting? Di mobile, kode ada di tangan pengguna. Siapa pun bisa me-download APK kalian, membongkarnya, dan mempelajari logikanya. Tokens di-hardcode, API keys di-strings.xml, atau penyimpanan tanpa enkripsi = celah yang siap dieksploitasi.

Model Ancaman Mobile

Pahami dulu apa yang kita hadapi:

AncamanContoh
Reverse engineeringAPK/IPA dibongkar, logika disalin
Man-in-the-middleWiFi jahat menyisipkan sertifikat palsu
Root/JailbreakMelewati sandbox, membaca storage
Data di device dicuriDevice hilang, backup tidak aman
Secret ter-exposeAPI key/token bocor dari kode

Tidak ada aplikasi yang "100% aman" — tujuannya menaikkan biaya serangan sampai melebihi nilai targetnya.

Secure Storage: Keystore & Keychain

Jangan pernah simpan token/secret di DataStore, SharedPreferences, atau file biasa. Gunakan hardware-backed secure storage:

Android: EncryptedSharedPreferences / Keystore

KotlinMenyimpan token dengan aman (Android)
// Kunci enkripsi di Android Keystore (hardware-backed bila tersedia)
val keyGen = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
keyGen.init(
    KeyGenParameterSpec.Builder("fitku_master_key", PURPOSE_ENCRYPT or PURPOSE_DECRYPT)
        .setBlockModes(BLOCK_MODE_GCM)
        .setEncryptionPaddings(ENCRYPTION_PADDING_NONE)
        .build()
)
 
// Data terenkripsi disimpan di DataStore/SharedPreferences
fun saveToken(token: String) { /* enkripsi dengan master key, lalu simpan */ }

Library seperti AndroidX Security Crypto (atau Tink) membungkus proses ini dengan API yang lebih sederhana.

iOS: Keychain

Keychain di iOS
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: "fitku.auth",
    kSecAttrAccount as String: "access_token",
    kSecValueData as String: token.data(using: .utf8)!,
    kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked,
]
SecItemDelete(query as CFDictionary)
SecItemAdd(query as CFDictionary, nil)

Untuk RN/Expo, pakai expo-secure-store; untuk Flutter, flutter_secure_storage — keduanya membungkus Keystore/Keychain native.

Warning

Library "secure storage" yang menulis ke file biasa dengan key hardcode tidak aman — itu hanya security theater. Pastikan kunci enkripsi lahir di hardware keystore/keychain per-device, bukan di kode aplikasi.

Certificate Pinning

Certificate pinning memastikan aplikasi hanya mempercayai sertifikat server yang memang milik server kalian — mencegah MITM bahkan ketika CA kena kompromi.

KotlinPinning dengan OkHttp
val certificatePinner = CertificatePinner.Builder()
    .add("api.fitku.dev", "sha256/Y4zJXaNqHV9YQr2U9hYJ8gP9uWlKz0tM3c2BqL8rUzE=")
    .build()
 
val client = OkHttpClient.Builder()
    .certificatePinner(certificatePinner)
    .build()

Di Flutter/RN, gunakan paket networking yang mendukung pinning (dio dengan custom HttpClient, atau react-native-ssl-pinning).

Caution

Pinning punya efek samping: saat kalian berganti CA/domain, semua pengguna versi lama langsung gagal konek. Strategi yang bijak: pin sertifikat root + backup, sisakan mekanisme update (misal via remote config), dan pin hanya endpoint penting — bukan seluruh traffic tanpa alasan.

Obfuscation

Obfuscation menyulitkan orang membaca kode hasil build. Di Android, R8/ProGuard berfungsi double: shrink + obfuscate + optimize.

proguard-rules.pro (contoh)
# Fitku: aktifkan obfuscation + shrink
minifyEnabled true
shrinkResources true
 
# Pertahankan aturan untuk library tertentu
-keep class com.fitku.api.dto.** { *; }
-keepattributes *Annotation*

Kotlin modern juga menyediakan Obfuscator eksperimental; untuk iOS, Swift obfuscation tidak sekuat Android — kompensasi dengan mengurangi kode sensitif di binary dan memindahkan logika ke server.

build.gradle.kts (app)
buildTypes {
    release {
        isMinifyEnabled = true
        isShrinkResources = true
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }
}

Ingat: obfuscation memperlambat, tidak mencegah. Nilainya sebagai deterrent.

Tip

Security adalah lapisan, bukan satu fitur: secure storage + pinning + obfuscation + tidak menaruh secret di kode + keamanan backend. Kombinasikan semuanya, dan biasakan threat modeling — episode 20 (privacy) menambahkan dimensi regulasi di atasnya.

Praktik Checklist Hardening Fitku

  1. Token & refresh token → Keystore/Keychain via library resmi.
  2. api.fitku.dev → certificate pinning dengan root + backup.
  3. R8/ProGuard aktif untuk release build.
  4. Tidak ada secret di strings.xml, Info.plist, atau env yang masuk binary.
  5. Deteksi root/jailbreak untuk fitur sensitif (opsional, jangan blokir semua user).
  6. Log produksi bebas token & PII.

Common Pitfalls Security

  • Secret di kode klien: klaim "server-side code" hanya mungkin jika logika di backend; jangan taruh secret di klien.
  • Pinning yang kaku: tanpa strategi update, pinning merusak layanan saat rotasi sertifikat.
  • Minify tanpa testing: R8 bisa memecah reflection/annotation — uji release build dengan saksama.
  • Mengabaikan backup: data terenkripsi tetap bisa dibaca dari backup yang tidak aman.
  • Self-built crypto: jangan menulis algoritma enkripsi sendiri. Gunakan library standar.

Penutup

Pada episode 13 ini, kalian telah mengeraskan Fitku:

  • Secure storage via Android Keystore & iOS Keychain (expo-secure-store / flutter_secure_storage untuk cross-platform).
  • Certificate pinning mencegah MITM, dengan strategi rotasi yang aman.
  • Obfuscation (R8/ProGuard) memperlambat reverse engineering.
  • Checklist hardening sebagai standar rilis.

Di episode 14 selanjutnya kita berurusan dengan tugas latar belakang: Background Tasks & Push Notifications — WorkManager, FCM/APNs, dan foreground services untuk mengingatkan pengguna Fitku. Sampai jumpa!

Belajar Mobile Developer - Security Mobile | Belajar Mobile Developer