Pendahuluan
Keamanan data pengguna adalah prioritas utama dalam pengembangan aplikasi. Salah satu aspek kritis adalah penyimpanan password. Password tidak boleh disimpan dalam bentuk teks biasa (plaintext) karena rentan terhadap serangan. Solusinya adalah menggunakan password hashing dan verifikasi.
Artikel ini akan membahas:
-
Apa itu Password Hashing?
-
Mengapa Password Perlu Dihash?
-
Metode Hashing yang Aman
-
Implementasi Hashing & Verify dalam Berbagai Bahasa
-
Best Practices dalam Penyimpanan Password
1. Apa itu Password Hashing?
Hashing adalah proses mengubah data (seperti password) menjadi deretan karakter acak (hash) menggunakan fungsi kriptografi. Hash bersifat:
-
Deterministik: Input yang sama selalu menghasilkan output yang sama.
-
One-way function: Tidak bisa dikembalikan ke bentuk aslinya (irreversible).
-
Fixed length: Output memiliki panjang tetap, terlepas dari panjang input.
Contoh hash (menggunakan SHA-256):
-
Input:
password123
-
Output:
ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f
2. Mengapa Password Perlu Dihash?
Beberapa alasan pentingnya hashing:
✅ Mencegah kebocoran password jika database diretas.
✅ Melindungi dari serangan brute-force & rainbow table.
✅ Meminimalkan risiko akses tidak sah.
Tanpa hashing, jika database bocor, penyerang bisa langsung membaca semua password pengguna.
3. Metode Hashing yang Aman
Tidak semua fungsi hash cocok untuk password. Beberapa metode yang direkomendasikan:
a. Bcrypt
-
Menggunakan salt (nilai acak) untuk mencegah serangan rainbow table.
-
Memiliki faktor cost (iterasi) untuk memperlambat brute-force.
-
Contoh (dalam Node.js):
const bcrypt = require('bcrypt'); const saltRounds = 10; // Hash password bcrypt.hash('password123', saltRounds, (err, hash) => { console.log(hash); // Output: $2a$10$N9qo8uLOickgx2ZMRZoMy... }); // Verify password bcrypt.compare('password123', hash, (err, result) => { console.log(result); // true jika cocok });
b. Argon2
-
Pemenang Password Hashing Competition (PHC).
-
Tahan terhadap serangan GPU/ASIC.
-
Contoh (dalam Python):
import argon2 hasher = argon2.PasswordHasher() hash = hasher.hash("password123") print(hash) # Output: $argon2id$v=19$m=65536,t=3,p=4$... # Verify try: hasher.verify(hash, "password123") print("Password benar!") except: print("Password salah!")
c. PBKDF2
-
Menggunakan iterasi tinggi untuk memperlambat serangan.
-
Sering digunakan bersama HMAC-SHA256.
-
Contoh (dalam PHP):
$password = "password123"; $salt = random_bytes(16); $iterations = 10000; $hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 32); // Simpan $hash dan $salt di database
d. Scrypt
-
Dirancang untuk membutuhkan banyak memori, sehingga tahan serangan hardware.
-
Contoh (dalam Go):
package main import ( "golang.org/x/crypto/scrypt" "log" ) func main() { salt := []byte("randomsalt") key, err := scrypt.Key([]byte("password123"), salt, 16384, 8, 1, 32) if err != nil { log.Fatal(err) } log.Printf("%x", key) // Output hash }
4. Implementasi Hashing & Verify dalam Berbagai Bahasa
a. JavaScript (Node.js) - Bcrypt
const bcrypt = require('bcrypt'); // Hashing async function hashPassword(password) { const salt = await bcrypt.genSalt(10); return await bcrypt.hash(password, salt); } // Verify async function checkPassword(password, hash) { return await bcrypt.compare(password, hash); }
b. Python - Argon2
from argon2 import PasswordHasher ph = PasswordHasher() # Hashing hashed = ph.hash("password123") # Verify try: ph.verify(hashed, "password123") print("Password valid!") except: print("Password invalid!")
c. PHP - password_hash() & password_verify()
// Hashing $hash = password_hash("password123", PASSWORD_BCRYPT); // Verify if (password_verify("password123", $hash)) { echo "Password valid!"; } else { echo "Password invalid!"; }
d. Java - PBKDF2
import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import java.security.spec.KeySpec; import java.util.Base64; public class PasswordHash { public static String hash(String password, String salt) throws Exception { KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), 10000, 256); SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); byte[] hash = factory.generateSecret(spec).getEncoded(); return Base64.getEncoder().encodeToString(hash); } }
5. Best Practices dalam Penyimpanan Password
-
Gunakan algoritma modern (Bcrypt, Argon2, PBKDF2, Scrypt).
-
Selalu gunakan salt untuk mencegah rainbow table attacks.
-
Hindari hash yang sudah tidak aman (MD5, SHA-1).
-
Update cost factor sesuai perkembangan hardware.
-
Jangan simpan password dalam log atau cache.
-
Gunakan HTTPS untuk transmisi password.
Kesimpulan
Password hashing adalah langkah wajib dalam pengembangan aplikasi yang aman. Dengan menggunakan metode seperti Bcrypt, Argon2, atau PBKDF2, kita bisa memastikan password pengguna tetap terlindungi bahkan jika database diretas. Implementasi yang benar dan pemilihan algoritma yang tepat akan mengurangi risiko kebocoran data secara signifikan.
Semoga artikel ini membantu! 🚀