Belajar NativePHP - Keamanan Data di Perangkat
Episode 22 of 28

Belajar NativePHP - Keamanan Data di Perangkat

Mengamankan aplikasi NativePHP dari ancaman di perangkat: threat model mobile (MITM, tampering, rooting), enkripsi SQLite, secure storage untuk secret, certificate pinning, code obfuscation, dan audit keamanan terukur.

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

Pendahuluan

Setelah di episode 21 kita mengotomasikan CI/CD, pada episode ini kita masuk ke keamanan data di perangkat. Aplikasi mobile menyimpan data sensitif di device — token, kredensial, data user, cache — dan ini menjadi target yang menarik untuk attacker. Memahami threat model dan mitigasi yang tepat adalah prasyarat sebelum release ke production.

Di NativePHP, PHP runtime berjalan di perangkat yang artinya kode PHP dan data berada di tangan user. Ini membutuhkan pendekatan keamanan yang berbeda dari aplikasi web di server.

Threat Model Mobile

Ancaman Utama

AncamanDeskripsiDampak
Rooted/Jailbroken DeviceSecurity controls di-bypassData exposure, tampering
MITM AttackKomunikasi di-interceptToken & data leakage
APK/IPA TamperingBinary dimodifikasiMalicious code injection
Insecure StorageData di SharedPreferences/SQLite tanpa enkripsiData theft
Reverse EngineeringKode PHP/binary di-reverseIP theft, vulnerability discovery

OWASP Mobile Top 10 (2024)

  1. Improper Credential Usage
  2. Inadequate Supply Chain Security
  3. Insecure Authentication/Authorization
  4. Insufficient Input/Output Validation
  5. Insecure Communication
  6. Inadequate Privacy Controls
  7. Insufficient Binary Protections
  8. Security Misconfiguration
  9. Insecure Data Storage
  10. Insufficient Cryptography

Enkripsi SQLite

SQLCipher

SQLite default tidak terenkripsi. Gunakan SQLCipher untuk mengenkripsi seluruh database:

Konfigurasi SQLCipher di NativePHP
<?php
 
return [
    'connections' => [
        'sqlite' => [
            'driver' => 'sqlite',
            'database' => database_path('database.sqlite'),
            'prefix' => '',
            // SQLCipher key
            'encryption_key' => env('DB_ENCRYPTION_KEY'),
        ],
    ],
];

Generate Encryption Key

Generate dan simpan encryption key
<?php
 
use Native\Laravel\Facades\SecureStorage;
use Illuminate\Support\Str;
 
// Generate key sekali saja
$key = Str::random(32); // 256-bit key
SecureStorage::put('db_encryption_key', $key);
 
// Baca key saat boot
$key = SecureStorage::get('db_encryption_key');

Warning

SQLCipher membutuhkan PHP extension khusus. Jika NativePHP tidak menyertakan SQLCipher secara default, pertimbangkan enkripsi field-level untuk data sensitif saja (name, email, token) daripada seluruh database.

Enkripsi Field-Level

Untuk data sensitif spesifik, enkripsi per-field:

Model dengan enkripsi field-level
<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Crypt;
 
class UserCredential extends Model
{
    protected $fillable = ['name', 'token_encrypted', 'secret_encrypted'];
 
    // Simpan dengan enkripsi
    public function setTokenAttribute($value)
    {
        $this->attributes['token_encrypted'] = Crypt::encryptString($value);
    }
 
    // Baca dengan dekripsi
    public function getTokenAttribute()
    {
        return Crypt::decryptString($this->attributes['token_encrypted']);
    }
}

Certificate Pinning

Certificate pinning mencegah MITM attack dengan mem-verifikasi SSL certificate server:

Certificate pinning di HTTP client
<?php
 
use Illuminate\Support\Facades\Http;
 
// Pin certificate (SHA-256 hash)
$pinnedCertificate = 'sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';
 
$response = Http::withHeaders([
    'X-Certificate-Pin' => $pinnedCertificate,
])->withOptions([
    'verify' => true,
    // curl SSL pinning options
])->get('https://api.myapp.com/data');

Backup Pinning

Backup certificate untuk rotasi
<?php
 
return [
    'pinning' => [
        'certificates' => [
            'sha256/PRIMARY_HASH==',
            'sha256/BACKUP_HASH==',  // Backup saat primary rotasi
        ],
        'max_age' => 5184000, // 60 hari
    ],
];

Code Obfuscation

Obfuscation mempersulit reverse engineering kode PHP:

PHP Obfuscation

Obfuscate PHP code untuk build
php artisan native:build ios --optimize --obfuscate

Android ProGuard/R8

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

Secure Storage Best Practices

Apa yang Harus di-Secure Storage

  • Auth tokens (JWT, session tokens)
  • API keys
  • Encryption keys
  • Kredensial biometric
  • Refresh tokens

Apa yang TIDAK di-Secure Storage

  • Data besar (gunakan encrypted SQLite)
  • Data yang sering diakses (performance overhead)
  • Data sementara (gunakan cache biasa)

Audit Keamanan

Checklist Audit

  1. Storage audit: pastikan tidak ada data sensitif di SharedPreferences/plaintext file.
  2. Network audit: pastikan semua komunikasi HTTPS, certificate pinning aktif.
  3. Code audit: pastikan ProGuard/R8 aktif, tidak ada credential hardcoded.
  4. Dependency audit: composer audit untuk vulnerability di dependencies.
  5. Permission audit: pastikan hanya permission yang benar-benar dibutuhkan yang dideklarasikan.
Audit dependencies
composer audit
npm audit

Tip

Jalankan audit keamanan sebelum setiap major release. Buat security review sebagai bagian dari definition of done untuk setiap sprint.

Penutup

Inti yang harus dibawa pulang:

  • Threat model: rooted device, MITM, tampering, insecure storage, reverse engineering.
  • SQLCipher atau field-level encryption untuk data sensitif di SQLite.
  • Certificate pinning mencegah MITM — gunakan primary + backup certificate.
  • ProGuard/R8 (Android) dan obfuscation (PHP) mempersulit reverse engineering.
  • Audit keamanan sebagai bagian dari release checklist.

Di episode 23 selanjutnya, kita akan membahas Performance Tuning — startup/boot time, memori runtime PHP, opcache mobile, baseline profile Android, dan optimasi render native components v4. Sampai jumpa di episode 23!

Belajar NativePHP - Keamanan Data di Perangkat | Belajar NativePHP