Tiga Konsep yang Sering Tertukar
Developer sering mencampuradukkan encryption, hashing, dan encoding. Ketiganya mengubah data ke bentuk lain, tapi tujuan dan sifatnya sangat berbeda.
1. Encoding
Mengubah format data agar bisa ditransfer atau disimpan. Bukan untuk keamanan — siapa pun bisa decode.
// Base64 Encoding — bukan keamanan!
const encoded = btoa("Hello World"); // "SGVsbG8gV29ybGQ="
const decoded = atob("SGVsbG8gV29ybGQ="); // "Hello World"
// URL Encoding
encodeURIComponent("hello world"); // "hello%20world"
// Kapan pakai: mengirim binary data lewat JSON, URL parameter
2. Hashing
Mengubah data menjadi fixed-size string yang tidak bisa dikembalikan ke bentuk asli (one-way). Hasil yang sama untuk input yang sama.
// SHA-256 hashing
const crypto = require("crypto");
const hash = crypto.createHash("sha256").update("Hello").digest("hex");
// "185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969"
// Kapan pakai: verifikasi integritas file, checksum
// JANGAN pakai untuk password (gunakan bcrypt/argon2)
3. Encryption
Mengubah data ke bentuk yang hanya bisa dibaca dengan key yang benar (two-way).
// Symmetric Encryption (AES) — satu key untuk encrypt dan decrypt
const algorithm = "aes-256-gcm";
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update("data rahasia", "utf8", "hex");
encrypted += cipher.final("hex");
// Asymmetric Encryption (RSA) — public key encrypt, private key decrypt
// Digunakan di TLS, digital signature, dll.
Perbandingan
- Encoding: Reversible, tanpa key, bukan keamanan. Contoh: Base64, URL encoding
- Hashing: Irreversible, tanpa key, untuk verifikasi integritas. Contoh: SHA-256, bcrypt
- Encryption: Reversible, butuh key, untuk kerahasiaan data. Contoh: AES, RSA
Kesalahan Umum
- Meng-encode password dengan Base64 — Ini bukan proteksi, siapa pun bisa decode
- Meng-encrypt password — Jika key bocor, semua password terekspos. Gunakan hashing!
- Menggunakan MD5/SHA untuk password — Terlalu cepat, rentan brute force. Gunakan bcrypt/argon2!
- Meng-hash data yang perlu dibaca kembali — Hash tidak bisa di-reverse. Gunakan encryption!
Kapan Menggunakan Apa?
- Password → Hashing (bcrypt/argon2)
- Data sensitif yang perlu dibaca → Encryption (AES)
- Transfer data via HTTP → Encoding (Base64) + HTTPS
- Verifikasi file integrity → Hashing (SHA-256)
Certificate Pinning
Certificate pinning adalah teknik ekstra dimana client menolak koneksi TLS kalau certificate server tidak cocok dengan yang sudah di-pin (di-hardcode) di aplikasi. Tujuannya: mengalahkan MITM lewat CA jahat. Normalnya, browser percaya ratusan Certificate Authority — kalau satu saja di-compromise atau dipaksa pemerintah mengeluarkan certificate palsu untuk domain kamu, attacker bisa menyadap. Dengan pinning, attacker tetap butuh private key yang benar.
Public Key Pinning vs Certificate Pinning
- Certificate pinning — pin hash seluruh certificate. Kalau certificate di-rotate, aplikasi harus di-update. Fragile.
- Public key pinning — pin hash public key saja. Certificate boleh di-renew (public key bisa dipakai lagi), lebih fleksibel.
Konteks: Mobile App
Pinning paling umum di mobile app — attacker sering coba MITM dengan install CA root jahat di device (misal via konfigurasi VPN/MDM). Browser hampir tidak lagi pakai pinning (HPKP header sudah di-deprecate oleh Chrome karena terlalu mudah bikin outage); fokus geser ke Certificate Transparency.
// Android OkHttp
CertificatePinner pinner = new CertificatePinner.Builder()
.add("api.example.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.add("api.example.com", "sha256/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=") // backup
.build();
OkHttpClient client = new OkHttpClient.Builder().certificatePinner(pinner).build();
Fallback Strategy
Selalu pin minimal 2 key (primary + backup). Kalau salah satu key harus di-rotate darurat (misal bocor), aplikasi tetap bisa konek dengan backup key sambil menunggu update. Tanpa backup, rotasi = semua user lama tidak bisa konek sampai mereka update aplikasi.
Downside Pinning
- Brittle — certificate rotation yang lupa meng-update pinned key = seluruh user offline
- Debugging sulit — proxy debug (Charles, mitmproxy) tidak bisa intercept traffic dari build production
- Bypass — attacker dengan akses fisik ke device bisa patch binary untuk nonaktifkan pinning (tools: Frida, Objection)
- Butuh kill-switch — strategi untuk remote-disable pinning kalau ada insiden