1. Encoding vs Enkripsi vs Hashing: Jangan Tertukar!
2. Mengapa SHA-256 Biasa Berbahaya untuk Password?
Fungsi hash umum (seperti MD5, SHA-1, SHA-256) dirancang untuk kecepatan tinggi (memverifikasi integritas file dalam hitungan mikrodetik). Penyerang yang memiliki GPU modern dapat menebak miliaran hash SHA-256 per detik menggunakan **Rainbow Tables** dan *brute-force*.
Untuk password, kita **wajib** menggunakan algoritma **Key Derivation Function (KDF)** yang sengaja dibuat lambat dan boros memori (*memory-hard*), seperti **Scrypt, Argon2id, atau BCrypt**, serta selalu menyertakan **Salt unik acak (cryptographic random)** untuk setiap pengguna.
3. Timing Attacks & crypto.timingSafeEqual
Operator perbandingan string biasa (`a === b`) berhenti membandingkan (*early exit*) begitu menemukan karakter pertama yang tidak cocok. Penyerang dapat mengukur waktu respon server dalam nanodetik untuk menebak karakter token rahasia satu per satu! Selalu gunakan perbandingan waktu konstan (*constant-time comparison*):
| 1 | import crypto from 'crypto'; |
| 2 | |
| 3 | // Mencegah Timing Attacks pada verifikasi HMAC / Token sesi: |
| 4 | function verifySecret(userHash, storedHash) { |
| 5 | const userBuf = Buffer.from(userHash, 'hex'); |
| 6 | const storedBuf = Buffer.from(storedHash, 'hex'); |
| 7 | |
| 8 | if (userBuf.length !== storedBuf.length) return false; |
| 9 | return crypto.timingSafeEqual(userBuf, storedBuf); |
| 10 | } |