Hash Password yang Benar
Simpan password dengan aman memakai password_hash dan verifikasi dengan password_verify.
Kenapa Tidak Boleh Simpan Password Asli?
Database bisa bocor: diserang, diintip admin nakal, atau terikut backup yang hilang. Kalau password tersimpan apa adanya (plaintext), satu kebocoran = semua akun jebol, dan karena user memakai password sama di banyak situs, kerusakannya meluas. Hashing mengubah password menjadi string acak satu arah: mudah dibuat, mustahil dibalik.
Bedakan dengan enkripsi: enkripsi bisa di-decode dengan kunci, hashing tidak bisa dibalik sama sekali. Server tidak perlu tahu password aslimu; cukup tahu cara memverifikasinya.
<?php
// Contoh 1: hash saat daftar, verify saat login
// --- daftar.php ---
$password = $_POST["password"]; // "sinta123" (sudah divalidasi)
$hash = password_hash($password, PASSWORD_DEFAULT);
// Contoh hasil: $2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL8kXoC
// Simpan $hash ke database, JANGAN $password!
// --- login.php ---
$input = $_POST["password"];
$hashDariDb = $user["password_hash"]; // ambil dari database
if (password_verify($input, $hashDariDb)) {
echo "Login berhasil!";
} else {
echo "Password salah.";
}PASSWORD_DEFAULT memakai algoritma terbaik yang tersedia (saat ini bcrypt, otomatis upgrade di versi PHP mendatang). Setiap password_hash menghasilkan string berbeda untuk password sama (karena salt acak), jadi dua user berpassword sama tidak terlihat sama di database.
<?php
// Contoh 2: upgrade hash otomatis (password_needs_rehash)
// Saat PHP mengupgrade algoritma default, hash lama tetap valid,
// tapi sebaiknya di-upgrade saat user login:
if (password_verify($input, $hashDariDb)) {
if (password_needs_rehash($hashDariDb, PASSWORD_DEFAULT)) {
$hashBaru = password_hash($input, PASSWORD_DEFAULT);
// simpan $hashBaru ke database untuk user ini
}
// ... lanjutkan login ...
}Pola ini membuat sistemmu future-proof: tanpa memaksa semua user ganti password, hash mereka bermigrasi ke algoritma terbaru satu per satu saat login.
Jebakan yang Sering Terjadi
Hash dengan md5/sha1. md5($password) bisa di-balik dalam detik dengan rainbow table dan tidak punya salt. Fungsi hash cepat (md5, sha1, bahkan sha256 polos) dirancang untuk checksum, bukan password. Selalu password_hash/password_verify.
Membatasi panjang password sebelum hash. bcrypt memotong di 72 byte; password lebih panjang dari itu "dianggap sama" untuk 72 byte pertamanya. Untuk password super panjang, pre-hash dulu dengan sha256 lalu password_hash hasilnya. Untuk tugas umum, batasi 72 karakter dengan pesan jelas.
Kebijakan Password Modern
Standar NIST terbaru justru menyederhanakan aturan password:
- Minimal 8 karakter, tidak ada batas maksimal yang kecil (izinkan 64+).
- Tidak wajib kombinasi simbol/angka yang rumit: yang penting panjang. "kuda-terbang-malam-hari" lebih kuat dan mudah diingat daripada "P@ss1!".
- Cek daftar password bocor: tolak password yang ada di daftar umum (123456, password, qwerty). API "Have I Been Pwned" menyediakan daftarnya.
- Jangan paksa ganti berkala: memaksa ganti tiap 90 hari membuat user memilih password lemah berurutan.
<?php
$lemah = ["123456", "password", "qwerty", "12345678"];
if (in_array(strtolower($pass), $lemah, true)) {
$errors[] = "Password ini terlalu umum, pilih yang lain.";
}Fokus pada panjang dan keunikan, bukan kerumitan simbol.
Catatan teknis: Jangan pernah "mengenkripsi" password agar bisa dilihat admin ("untuk membantu user lupa password"). Alur lupa password yang benar: kirim link reset bertoken ke email, bukan menampilkan password lama. Password yang bisa dibaca siapa pun = password yang tidak aman.
Tantangan
Sistem daftar mini
Buat fungsi daftar(string $username, string $password): array yang memvalidasi password minimal 8 karakter, lalu mengembalikan ["username" => $username, "hash" => password_hash($password, PASSWORD_DEFAULT)]. Uji verify-nya dengan password_verify.
Kuis Bab
Uji pemahamanmu: Bab 7: Keamanan Web
Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".
1.Apa itu serangan CSRF?
2.Fungsi apa yang tepat untuk membandingkan token CSRF?
3.Di mana dan bagaimana pertahanan utama terhadap XSS?
4.Cara paling tepat mencegah SQL injection adalah...
5.Pasangan fungsi yang benar untuk menyimpan dan memeriksa password adalah...