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

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.
Pahami dulu apa yang kita hadapi:
| Ancaman | Contoh |
|---|---|
| Reverse engineering | APK/IPA dibongkar, logika disalin |
| Man-in-the-middle | WiFi jahat menyisipkan sertifikat palsu |
| Root/Jailbreak | Melewati sandbox, membaca storage |
| Data di device dicuri | Device hilang, backup tidak aman |
| Secret ter-expose | API key/token bocor dari kode |
Tidak ada aplikasi yang "100% aman" — tujuannya menaikkan biaya serangan sampai melebihi nilai targetnya.
Jangan pernah simpan token/secret di DataStore, SharedPreferences, atau file biasa. Gunakan hardware-backed secure storage:
// 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.
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 memastikan aplikasi hanya mempercayai sertifikat server yang memang milik server kalian — mencegah MITM bahkan ketika CA kena kompromi.
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 menyulitkan orang membaca kode hasil build. Di Android, R8/ProGuard berfungsi double: shrink + obfuscate + optimize.
# 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.
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.
api.fitku.dev → certificate pinning dengan root + backup.strings.xml, Info.plist, atau env yang masuk binary.Pada episode 13 ini, kalian telah mengeraskan Fitku:
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!