Fungsi password_hash() Pada PHP
Halo, teman-teman pengembang web! Pada artikel kali ini, kita akan
mengupas secara mendalam tentang password_hash()
, sebuah
fungsi penting di PHP yang berhubungan erat dengan keamanan
website atau aplikasi yang kalian buat. Gaya bahasanya santai
saja, ya, supaya lebih mudah dipahami.
Sebagai seorang web developer, kamu pasti paham betapa krusialnya
menangani password pengguna. Bayangin aja kalau password disimpan
dalam bentuk plain text di database, bisa gawat banget
kalau sampai bocor! Karena itulah PHP menyediakan password_hash()
untuk memudahkan kita melakukan hashing yang aman terhadap
password. Setelah di-hash, password tersebut jadi sulit (bahkan
diharapkan nyaris mustahil) untuk dipecahkan atau dibalik ke teks asli.
Apa Itu password_hash()
?
password_hash()
adalah fungsi yang digunakan untuk
membuat hash dari password. Fungsi ini sudah termasuk
salt otomatis dan mendukung cost factor (tingkat
kesulitan) yang bisa disesuaikan. Berbeda dengan md5()
atau sha1()
yang sudah kuno dan dianggap kurang aman
untuk menyimpan password, password_hash()
diciptakan
untuk memenuhi standar keamanan modern. Fungsi ini juga sangat
fleksibel karena mendukung beberapa algoritma, seperti
BCRYPT
, Argon2
, dan lainnya, tergantung
versi PHP yang kamu gunakan.
Coba kita lihat contoh sederhana penggunaan password_hash()
:
<?php
$plain_password = "iniRaHasiaBanget";
// Membuat hash dengan algoritma default (biasanya BCRYPT)
$hashed_password = password_hash($plain_password, PASSWORD_DEFAULT);
echo $hashed_password;
Hasilnya bakal jadi string yang lumayan panjang dan terlihat acak. Itulah yang kita sebut hashed password. Nah, hash ini yang kita simpan di database, bukan password mentahnya. Kalau database kita bocor, penyerang tetap butuh usaha (dan biasanya sangat besar) untuk menebak password asli.
Kenapa Kita Membutuhkan password_hash()
?
Mungkin ada beberapa di antara kalian yang masih kepikiran,
"Kenapa sih harus ribet pake hashing segala?
md5()
kan juga menghasilkan hash?"
Memang md5()
itu menghasilkan hash, tapi perlu dipahami
kalau md5()
(dan sha1()
) sudah dianggap
usang untuk urusan penyimpanan password. Kenapa?
-
Tanpa Salt Otomatis
md5()
atausha1()
tidak menyertakan salt secara otomatis. Salt diperlukan agar dua password yang sama tidak menghasilkan hash yang identik, dan supaya makin sulit diterka oleh rainbow table. Denganpassword_hash()
, proses penyisipan salt sudah beres tanpa kita perlu pusing. -
Kurang Kuat Melawan Serangan Brute Force
md5()
dansha1()
sangat cepat dihitung. Kecepatan ini malah jadi kelemahan, karena penjahat bisa mencoba jutaan hash per detik.password_hash()
dan algoritma modern lain sepertiBCRYPT
atauArgon2
dirancang untuk lebih lambat, sehingga lebih susah di-brute force. -
Mudah Digunakan
password_hash()
sudah mengurus banyak hal di belakang layar, termasuk salt dan pengaturan cost factor. Kita cukup panggil sekali, lalu hashed password-nya langsung siap disimpan. -
Mendukung Algoritma Baru
Ketika PHP merilis algoritma hashing baru (sepertiArgon2
), kita bisa dengan mudah menyesuaikanpassword_hash()
tanpa perlu menulis ulang logika hashing yang rumit.
Cara Kerja password_hash()
Secara Singkat
Secara sederhana, password_hash()
akan:
- Mengambil password mentah yang kita berikan.
- Menggabungkan password tersebut dengan salt unik yang di-generate secara otomatis. Salt ini disisipkan ke dalam hasil hash, sehingga kita tidak perlu menyimpannya secara terpisah di database.
-
Menggunakan algoritma yang kita pilih (misal
BCRYPT
) dengan cost factor tertentu. Semakin tinggi cost factor, semakin lama proses hashing, yang berarti lebih aman namun bisa sedikit memperlambat proses. -
Menghasilkan sebuah string hash yang menyimpan informasi
algoritma, cost factor, dan salt, sehingga
password_verify()
nanti bisa "membaca" informasi itu untuk memverifikasi password.
Semua proses teknis ini berjalan otomatis di balik layar. Kita
tinggal memanggil password_hash()
dan menyimpan
hasilnya. Praktis, kan?
Contoh Penggunaan password_hash()
di Berbagai Kasus
1. Registrasi User
Kasus paling umum tentu saja adalah pembuatan akun (registrasi). Ketika user mendaftar, mereka mengisi username, password, dan data lain yang diperlukan. Setelah kita dapat password mentahnya, langsung saja kita hash dan simpan ke database. Contohnya:
<?php
// Misal data dari form registrasi
$username = $_POST['username'];
$plain_password = $_POST['password'];
// Hash password-nya dulu
$hashed_password = password_hash($plain_password, PASSWORD_DEFAULT);
// Lalu simpan ke database
// Contoh sederhana (tidak aman terhadap SQL Injection):
$sql = "INSERT INTO users (username, password) VALUES ('$username', '$hashed_password')";
// Jalankan query...
Di sini, PASSWORD_DEFAULT
biasanya mengarah ke
BCRYPT
, tapi bisa berubah di versi PHP mendatang.
Keuntungannya, kita otomatis akan pakai algoritma terbaru tanpa
perlu mengubah banyak kode.
2. Menggunakan Cost Factor Tertentu
Kalau kita ingin spesifik pakai BCRYPT
dengan cost
tertentu, misalnya 12, kita bisa menulis seperti ini:
<?php
$plain_password = "passw0rd123";
$options = [
'cost' => 12, // semakin besar, semakin aman, tapi juga semakin lama proses hashing
];
$hashed_password = password_hash($plain_password, PASSWORD_BCRYPT, $options);
echo $hashed_password;
Semakin tinggi cost factor, semakin lama (dan semakin aman) hashing-nya. Namun ingat, kalau servermu spesifikasinya pas-pasan, hati-hati jangan sampai cost-nya terlalu tinggi hingga membuat aplikasi lambat. Lakukan benchmark untuk cari sweet spot-nya.
3. Menggunakan Argon2
Jika versi PHP yang kamu pakai sudah mendukung Argon2 (dimulai dari PHP 7.2), kamu juga bisa menggunakan algoritma ini. Caranya kurang lebih sama:
<?php
$plain_password = "Passw0rd@1234";
$hashed_password = password_hash($plain_password, PASSWORD_ARGON2ID);
echo $hashed_password;
Argon2 dianggap sebagai salah satu algoritma paling aman saat ini, namun mungkin perlu dicek apakah hosting atau server yang kamu pakai sudah mendukungnya.
4. Re-hash Password
Kadang-kadang, kita pengin meng-update hash password
yang sudah tersimpan untuk menyesuaikan dengan cost factor
baru atau mengganti algoritma. Kita bisa memanfaatkan
password_needs_rehash()
untuk deteksi
apakah hash lama masih relevan. Berikut contoh alurnya:
<?php
$hashed_password = dapatkanHashDariDatabase(); // contoh ambil dari DB
// Tentukan opsi baru
$options = [
'cost' => 14
];
// Cek apakah hash lama masih memenuhi kriteria
if (password_needs_rehash($hashed_password, PASSWORD_BCRYPT, $options)) {
// Kalau butuh rehash, kita dapat password asli dari user
// (biasanya ketika user login, kita punya password plain-nya)
$plain_password = $_POST['password'];
// Verifikasi dulu password lamanya
if (password_verify($plain_password, $hashed_password)) {
// Jika valid, buat hash baru
$new_hash = password_hash($plain_password, PASSWORD_BCRYPT, $options);
// Update di database
// UPDATE users SET password = '$new_hash' WHERE ...
}
}
Teknik ini berguna kalau kita mau gradually migrate semua hash lama ke hash baru, tanpa harus maksa user mengubah password. Setiap kali user login, kita cek, kalau memang perlu re-hash, langsung eksekusi.
Perbandingan password_hash()
dengan Metode Hashing Lain
Sebelum password_hash()
populer, banyak developer
yang memakai md5()
, sha1()
, atau
hash()
dengan salt manual. Mungkin
cara itu dulu sudah cukup, tapi standar keamanan terus
berkembang. Tabel di bawah ini memberikan gambaran singkat:
-
md5()
/sha1()
: Sudah dianggap tidak aman untuk password, mudah di-brute force, collision relatif gampang ditemui. -
hash('sha256')
: Lebih baik ketimbangmd5()
, tapi masih fast hashing, tidak ada penundaan, dan salt harus diatur manual. -
password_hash()
: Dirancang khusus untuk password. Otomatis menanam salt, mendukung cost factor, dan lebih aman dari serangan brute force.
Jadi, jelas password_hash()
menawarkan lebih banyak
keamanan dan kemudahan. Kecuali ada alasan yang benar-benar khusus,
sebaiknya kamu pakai password_hash()
untuk
hashing password.
Kapan Kita Menggunakan password_hash()
dan password_verify()
?
password_hash()
dan password_verify()
ibarat sepasang sahabat karib. password_hash()
dipakai saat kita ingin membuat atau memperbarui hash
password, sementara password_verify()
dipakai
untuk mencocokkan plain text password dengan
hash yang disimpan.
Pada proses registrasi, setelah user masukkan
password, kita hash pakai password_hash()
dan
simpan ke database. Sementara saat login,
ketika user masukkan password, kita cocokkan dengan
password_verify()
terhadap hash di database.
Kalau cocok, barulah user dianggap terotentikasi.
Studi Kasus Lain di Dunia Nyata
1. Fitur "Ubah Password" dalam Aplikasi
Ketika user mau ganti password, kita bakal minta user memasukkan password lama dan password baru. Tahapannya biasanya seperti ini:
-
Verifikasi Password Lama:
Kita ambil hash password di database, kemudian
password_verify()
password lama yang diinput. Kalau valid, lanjut. -
Hash Password Baru:
Pakai
password_hash()
di password baru yang diinput user. - Update di Database: Ganti hash lama dengan hash baru. Beres, password user sudah resmi diganti!
2. Sistem Multi-Factor Authentication (MFA)
Buat aplikasi yang menerapkan MFA, kita seringkali
membutuhkan verifikasi password sebelum mengirim
kode OTP atau link konfirmasi. Di situ,
password_hash()
memainkan peran
menyiapkan data di database, dan password_verify()
memastikan user memang punya password asli.
Meskipun penekanan utamanya ada di password_verify()
,
tetap aja password_hash()
menjadi landasan
untuk menyimpan password secara aman.
3. Migrasi dari Sistem Hashing Lama
Ada banyak aplikasi lawas yang masih pakai
md5()
atau sha1()
.
Ketika kita mau upgrade ke password_hash()
,
kita bisa lakukan migrasi secara bertahap.
Saat user login, kita cek dulu dengan metode
hashing lama. Kalau cocok, kita langsung
re-hash password dengan
password_hash()
dan update database.
Setelah sekian lama, semua password user akhirnya
beralih ke hash yang lebih aman.
Tips dan Trik Menggunakan password_hash()
-
Jangan Pernah Simpan Password Mentah
Kedengarannya sepele, tapi masih banyak yang "iseng" nyimpen password asli. Jauhi kebiasaan itu! Selalu hash sebelum masuk database. -
Gunakan Cost Factor yang Wajar
Uji dulu di servermu, berapa cost factor yang membuat proses hashing tidak terlalu lama (biasanya 10-15 untuk BCRYPT, tapi tergantung server). Jika server lebih kencang, bisa aja naikkan cost jadi 12 atau lebih. -
Manfaatkan
password_needs_rehash()
Dengan fungsi ini, kita bisa tahu apakah hash lama perlu di-update ke cost atau algoritma yang lebih baru. Ini cara yang praktis untuk menjaga keamanan tetap up to date. -
Perhatikan Versi PHP
Pastikan versi PHP kamu sudah mendukung algoritma yang diinginkan (misalnya Argon2). Kalau belum, mungkin perlu update PHP atau pakaiBCRYPT
sementara waktu. -
Selalu Lindungi Aplikasi dengan HTTPS
password_hash()
hanya mengamankan password di sisi server. Kalau koneksi antara klien dan server tidak aman (HTTP biasa), password tetap bisa disadap. Jadi, jangan lupa pakai SSL/TLS ya!
FAQ Seputar password_hash()
-
Apakah
password_hash()
Bisa untuk Hash Data Selain Password?
Sebenarnya bisa, tapi fungsi ini didesain khusus untuk password. Dia menanam salt dan parameter cost ke dalam hash, sehingga pasangannyapassword_verify()
cocok banget untuk login. Kalau hanya mau hash biasa, kamu bisa pakaihash()
atauhash_hmac()
, tapi untuk password,password_hash()
tetap pilihan terbaik. -
Mending BCRYPT atau Argon2?
Keduanya aman.Argon2
lebih baru dan dianggap lebih unggul di beberapa aspek. Kalau servermu mendukung Argon2, silakan gunakan. Kalau belum,BCRYPT
pun sudah bagus. -
Bagaimana Jika Mau Menyimpan Salt Terpisah?
Tidak perlu.password_hash()
udah menempatkan salt ke dalam hash itu sendiri. Justru menyimpan salt terpisah menambah kerumitan yang tidak diperlukan. -
Ada Batas Panjang Password?
password_hash()
akan berfungsi bahkan kalau password mentahnya panjang. Meski demikian, kita sering batasi input password (misalnya max. 72 karakter untuk BCRYPT) demi alasan praktis dan standar UX. -
Apakah Harus Pakai "pepper" Juga?
"Pepper" adalah kunci tambahan yang disimpan terpisah (misal di file config atau environment variable). Beberapa orang menggunakannya untuk menambah lapisan keamanan, tapi ini opsional dan tergantung kebutuhan. Umumnya,password_hash()
udah cukup untuk skenario umum.
Menangani Error dan Debugging
Dalam penggunaan password_hash()
, error jarang banget
terjadi. Kalau sampai terjadi, biasanya karena versi PHP yang
tidak kompatibel dengan algoritma yang kita pilih atau
pemanggilan fungsi yang salah. Pastikan:
-
Kamu pakai sintaks yang benar:
password_hash(string $password, int|string $algo, array $options = [])
. - Algoritma yang digunakan sesuai dengan versi PHP (misalnya Argon2 butuh PHP 7.2 atau lebih).
- Cost factor masih dalam rentang wajar dan tidak membebani server.
Kalau hasilnya selalu hash yang sama persis,
cek apakah password yang diinput selalu sama
atau mungkin ada bug yang membuat
$plain_password
-nya tidak berubah.
Debugging sederhana dengan menampilkan
var_dump($plain_password)
atau
echo
di tahap awal bisa membantu melacak error.
Membangun Keamanan Aplikasi Web yang Lebih Menyeluruh
Menggunakan password_hash()
hanyalah
satu langkah untuk mengamankan aplikasi dari sisi
penyimpanan password. Berikut beberapa hal lain
yang juga penting kamu terapkan:
- Filter dan Validasi Input: Selalu pastikan data dari pengguna (form, URL, dll.) difilter dan divalidasi. Hindari SQL injection dengan prepared statements.
- Penggunaan HTTPS: Supaya password tidak bocor di jalur komunikasi, pastikan website menggunakan protokol HTTPS. Sertifikat SSL/TLS sekarang bisa didapatkan gratis lewat Let's Encrypt, misalnya.
-
Session Management:
Setelah user login, pastikan session
dihandle dengan benar. Misalnya
session_regenerate_id()
setelah login, atur session timeout, dan lain-lain. Ini untuk mencegah session hijacking. - Batasi Percobaan Login: Fitur "limit login attempts" bisa mengurangi risiko brute force. Misal, kalau user salah 3 kali, tunggu 15 menit sebelum bisa mencoba lagi.
- Backup dan Monitor: Selalu punya sistem backup, pantau log server, dan cek anomali. Kadang, indikasi serangan muncul dari hal-hal yang tidak biasa terjadi di log.
Dengan menambahkan langkah-langkah tersebut,
sistem keamananmu jadi lebih kokoh.
password_hash()
dan password_verify()
hanyalah pondasi awal untuk menjaga kerahasiaan password pengguna.
Penutup
Nah, gimana? Sudah paham dong pentingnya
password_hash()
dalam menjaga keamanan aplikasi kita?
Dengan fungsi ini, kamu bisa hash password pengguna
tanpa pusing soal salt, cost factor,
dan logika hashing yang rumit.
Selain itu, password_hash()
juga memudahkan
migrasi ke algoritma hash lain (seperti Argon2)
seiring berkembangnya PHP dan standar keamanan.
Jangan lupa, password_hash()
selalu digunakan
bareng password_verify()
untuk mencocokkan
password mentah dengan hashed password di database.
Kolaborasi keduanya mempermudah implementasi proses
registrasi dan login yang aman.
Lebih jauh lagi, perhatikan penggunaan
password_needs_rehash()
jika kamu mau
meningkatkan cost factor di masa depan
atau mengganti algoritma hashing baru.
Tentu aja, satu langkah hashing password ini
nggak otomatis bikin aplikasi kebal terhadap
segala serangan. Kamu masih perlu menambahkan
lapisan-lapisan keamanan lain, seperti
SQL injection prevention, manajemen
session yang benar, limit login attempts,
serta penggunaan HTTPS.
Namun, dengan menerapkan password_hash()
secara tepat, kamu sudah membuat fondasi yang kuat
dalam menjaga privasi dan keamanan data pengguna.
Sekian artikel kali ini. Mudah-mudahan penjelasan
mengenai password_hash()
dapat
membantu kamu dalam mengembangkan aplikasi web
yang lebih aman. Jika masih ada pertanyaan,
jangan ragu buat berdiskusi atau mencari referensi
tambahan di dokumentasi resmi PHP.
Selamat ngoding dan jangan lupa tetap keep it secure!
Baca Juga :