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.

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.
| Ancaman | Deskripsi | Dampak |
|---|---|---|
| Rooted/Jailbroken Device | Security controls di-bypass | Data exposure, tampering |
| MITM Attack | Komunikasi di-intercept | Token & data leakage |
| APK/IPA Tampering | Binary dimodifikasi | Malicious code injection |
| Insecure Storage | Data di SharedPreferences/SQLite tanpa enkripsi | Data theft |
| Reverse Engineering | Kode PHP/binary di-reverse | IP theft, vulnerability discovery |
SQLite default tidak terenkripsi. Gunakan SQLCipher untuk mengenkripsi seluruh database:
<?php
return [
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => database_path('database.sqlite'),
'prefix' => '',
// SQLCipher key
'encryption_key' => env('DB_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.
Untuk data sensitif spesifik, enkripsi per-field:
<?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 mencegah MITM attack dengan mem-verifikasi SSL certificate server:
<?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');<?php
return [
'pinning' => [
'certificates' => [
'sha256/PRIMARY_HASH==',
'sha256/BACKUP_HASH==', // Backup saat primary rotasi
],
'max_age' => 5184000, // 60 hari
],
];Obfuscation mempersulit reverse engineering kode PHP:
php artisan native:build ios --optimize --obfuscateandroid {
buildTypes {
release {
isMinifyEnabled = true // R8 obfuscation
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}composer audit untuk vulnerability di dependencies.composer audit
npm auditTip
Jalankan audit keamanan sebelum setiap major release. Buat security review sebagai bagian dari definition of done untuk setiap sprint.
Inti yang harus dibawa pulang:
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!