Episode ini membahas keamanan dan penanganan data di Dart: validasi input yang aman, enkripsi dan secure storage, pengelolaan secrets, panggilan jaringan dengan HTTPS dan sertifikat, serta praktik secure coding di Dart.

Aplikasi yang tidak aman tidak layak disebut selesai. Episode 13 membahas security dan data handling di Dart dari sisi praktis: memvalidasi input yang masuk, mengenkripsi data sensitif, menyimpan secrets dengan benar, memanggil jaringan hanya lewat HTTPS, dan membangun kebiasaan secure coding.
Keamanan bukan fitur yang ditambahkan di akhir — ia adalah keputusan yang dibuat di setiap lapisan: dari parse input, penyimpanan, hingga komunikasi jaringan. Kali ini kalian akan mempraktikkannya langsung.
Input dari pengguna adalah vektor serangan utama. Jangan pernah mempercayai input tanpa validasi:
bool emailValid(String email) {
final pola = RegExp(r'^[^@]+@[^@]+\.[^@]+$');
return pola.hasMatch(email);
}
void main() {
print(emailValid('arman@example.com'));
print(emailValid('bukan-email'));
}RegExp(r'^[^@]+@[^@]+\.[^@]+$') memeriksa format email sebelum data diproses lebih jauh. Validasi mencegah injeksi dan serangan berbasis input di semua lapisan aplikasi.
Saat berinteraksi dengan database, jangan pernah menyusun query dengan penggabungan string langsung. Selalu pakai parameter binding yang disediakan driver database. Prinsip yang sama berlaku untuk perintah shell dan HTML — pisahkan data dari kode yang dieksekusi.
Data sensitif seperti token dan kunci harus dienkripsi saat disimpan atau dikirim:
import 'package:cryptography/cryptography.dart';
Future<void> main() async {
final algoritma = AesGcm.with256bits();
final kunci = await algoritma.newSecretKey();
final cipher = await algoritma.encrypt(
const utf8.encode('data rahasia'),
secretKey: kunci,
);
print(cipher.cipherText.length);
}AesGcm.with256bits() adalah mode enkripsi AES-GCM yang aman dan terautentikasi. Simpan kunci di tempat yang tepat — lihat bagian berikutnya — dan jangan pernah menaruh kunci dalam kode.
Untuk Flutter, jangan simpan data sensitif di SharedPreferences. Pakai flutter_secure_storage yang memanfaatkan keystore Android dan Keychain iOS:
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
final storage = const FlutterSecureStorage();
Future<void> simpanToken(String token) async {
await storage.write(key: 'access_token', value: token);
}storage.write(key: 'access_token', value: token) menyimpan token di secure storage platform. Untuk backend, simpan data sensitif di environment variable yang diproteksi, bukan di file konfigurasi yang ikut di-commit.
API key, password database, dan token bukan untuk source control. Gunakan environment variable:
export DB_PASSWORD='hanya-di-environment'
dart run bin/server.dartexport DB_PASSWORD='...' menyuplai nilai rahasia lewat environment process. Di CI/CD, isi secrets lewat store rahasia platform (misalnya GitHub Secrets) dan di-inject saat build.
Untuk development lokal, baca .env yang tidak di-commit:
dart run --define=from-file=.env bin/app.dartdart run --define=from-file=.env memuat definisi dari .env tanpa mencetaknya ke log. Pastikan .env masuk ke .gitignore agar secret tidak pernah ter-commit.
Semua komunikasi jaringan wajib lewat HTTPS dengan verifikasi sertifikat aktif. Jangan menonaktifkan verifikasi:
import 'package:http/http.dart' as http;
Future<void> main() async {
var resp = await http.get(Uri.parse('https://api.example.com/data'));
print(resp.statusCode);
}http.get(Uri.parse('https://api.example.com/data')) menggunakan TLS default dengan verifikasi sertifikat penuh. Menonaktifkan verifikasi lewat badCertificateCallback membuka celah man-in-the-middle — hanya lakukan pada pengujian lokal yang disengaja.
Untuk server, sediakan sertifikat dari CA terpercaya, bukan self-signed di produksi. Tools seperti Let's Encrypt memberikan sertifikat gratis dan otomatis. Jangan pernah meng-hardcode certificate pinning yang sulit dipelihara tanpa kebutuhan keamanan yang jelas.
Beberapa kebiasaan yang menjaga aplikasi tetap aman:
dart pub outdated rutin menangkap package dengan CVE.analysis_options.yaml.Aktifkan lint yang relevan dengan menambahkan package lints atau pedantic di dev_dependencies, lalu jalankan dart analyze secara rutin untuk mendeteksi pola berisiko.
Inti yang harus dibawa pulang:
flutter_secure_storage untuk token di Flutter.dart pub outdated dan dart analyze secara rutin.Di episode 14 selanjutnya kita akan membahas tooling dan build configuration — build_runner dan code generation, static analysis dengan dart analyze, formatting dengan dart format, serta membangun pipeline CI/CD untuk project Dart.