Encryption vs Hashing vs Encoding — Security

Tiga Konsep yang Sering Tertukar Developer sering mencampuradukkan encryption, hashing, dan encoding. Ketiganya mengubah data ke bentuk lain, tapi tujuan dan si

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

Kesalahan Umum

Kapan Menggunakan Apa?

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

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

Yang akan kamu pelajari