Fungsi password_verify() Pada PHP
  Halo, teman-teman! Kali ini kita akan mengupas tuntas sebuah fungsi yang 
  sebenarnya lumayan sering disebut-sebut di kalangan para pengembang web, 
  khususnya yang menggunakan PHP. Nama fungsinya adalah password_verify(). 
  Buat kamu yang masih baru di dunia pemrograman, jangan khawatir. Di artikel ini 
  kita akan membahasnya secara santai, tapi tetap detail, dari segi apa 
  itu password_verify(), gimana cara kerjanya, dan kenapa kita butuh 
  itu dalam mengamankan aplikasi kita.
  Nah, sebelum kita nyemplung lebih dalam, mari kita bahas sedikit latar belakang 
  tentang kenapa topik ini penting. Ketika kita membuat aplikasi web yang butuh 
  fitur login, kita pasti berurusan dengan password pengguna. Gimana cara 
  menyimpan password tersebut biar aman? Gimana menghindari pencurian data 
  pengguna? Di sinilah fungsi password_hash() dan 
  password_verify() memainkan peranan krusial. 
  password_verify() khususnya berguna banget pas kita mau 
  membandingkan password yang diinput user dengan password yang sudah disimpan 
  di database (yang tentunya sudah di-hash).
Apa Itu password_verify()?
  password_verify() adalah sebuah fungsi di PHP yang berfungsi untuk 
  memeriksa apakah sebuah plain-text password (password mentah yang diinput 
  user) cocok dengan hash yang telah disimpan di database. Caranya, fungsi ini akan 
  memasukkan password mentah yang kita berikan dan mencocokkannya dengan 
  hashed password yang kita punya. Jika cocok, dia akan mengembalikan 
  true; kalau tidak, dia akan mengembalikan false. 
  Buat kamu yang baru tahu, normalnya kita nggak akan pernah nyimpen password 
  dalam bentuk teks asli di database. Gawat dong kalau sampai database-nya 
  kebocoran! Makanya, developer biasanya menyimpan password dalam bentuk hash. 
  Salah satu teknik hashing yang direkomendasikan adalah dengan menggunakan 
  password_hash() yang juga disediakan oleh PHP. Kenapa dua fungsi 
  ini sebaiknya dipakai bareng? Karena password_hash() secara default 
  menggunakan algoritma yang aman (misalnya BCRYPT atau 
  Argon2), lalu password_verify() disiapkan agar cocok 
  dengan format hash tersebut.
Bagaimana Cara Kerjanya?
  password_verify() punya sintaks yang sangat simpel:
bool password_verify ( string $password, string $hash )
  Parameter pertama $password adalah password mentah yang diketik 
  user saat login, sedangkan $hash adalah hasil hash password yang 
  sebelumnya telah kita simpan di database. Hasil dari fungsi ini adalah 
  true atau false. True menandakan 
  bahwa password mentah yang diinput cocok dengan hash di database, 
  false berarti tidak cocok.
  Poin penting yang perlu kamu catat: 
  password_verify() akan mengurus sendiri proses salting dan 
  pengecekan algoritma. Dengan kata lain, kamu tidak perlu repot bikin salt 
  sendiri atau memelihara data salt di database. Hal ini dikarenakan 
  password_hash() sudah menyimpan informasi salt serta parameter 
  algoritma di dalam hash itu sendiri. 
Keuntungan Menggunakan password_verify()
  Mungkin kamu bertanya, "Kenapa sih harus pakai password_verify()? 
  Kan kita bisa aja pakai md5() atau sha1() yang 
  sudah ada sejak lama?" Nah, berikut beberapa alasan kenapa fungsi ini 
  lebih direkomendasikan:
- 
    Keamanan Lebih Tinggi: 
    md5()dansha1()sudah dianggap tidak memadai untuk keamanan password karena kecepatannya yang tinggi membuat mereka rentan diserang brute force. Sementara itu,password_hash()danpassword_verify()memberikan perlindungan tambahan melalui cost factor dan salt yang ditanam langsung.
- Penggunaan Mudah: Fungsi-fungsi bawaan ini secara otomatis menangani banyak hal teknis, mulai dari pengelolaan salt hingga pemilihan algoritma. Kamu tidak perlu menulis banyak kode tambahan.
- Standar Resmi PHP: Karena ini sudah terintegrasi langsung di core PHP, proses migrasi (jika sebelumnya kamu pakai metode hashing lain) jadi lebih mudah. Juga ada jaminan bahwa fungsi ini akan di-maintain oleh tim pengembang PHP.
Contoh Dasar Penggunaan password_verify()
Mari kita lihat contoh paling sederhana. Misalnya kita punya form login. Ketika user memasukkan username dan password, kita ambil data hashed password dari database berdasarkan username tersebut. Kira-kira kodenya seperti ini:
<?php
// Misalkan $user_input_password diambil dari form login
$user_input_password = $_POST['password'];
// $hashed_password diambil dari database
$hashed_password = '$2y$10$R/vI4G6IXcZslN2YjPW0heGwxJ5EnW7nGbqxdlz4k1mM2xCNG6B6.'; // Contoh hash
if (password_verify($user_input_password, $hashed_password)) {
    echo "Password cocok, user terotentikasi!";
} else {
    echo "Password salah, silakan coba lagi.";
}
  Contoh hash di atas adalah hasil dari password_hash("somepassword", PASSWORD_BCRYPT). 
  Kalau user mengetik password yang sama dengan string aslinya (somepassword), 
  maka password_verify() akan mengembalikan nilai true.
Studi Kasus: Registrasi dan Login
  Biar makin jelas, kita akan bahas alur penggunaan password_hash() 
  dan password_verify() secara lengkap, mulai dari proses registrasi 
  hingga login. Biar lebih kasual, kita anggap aja kita lagi bikin sistem 
  user sederhana.
1. Registrasi
Di tahap ini, user akan membuat akun baru. Mereka mengisi form yang di dalamnya ada username dan password. Ketika form di-submit, kita akan melakukan hal-hal berikut:
- 
    Ambil password mentah yang diinput user (misalnya $plain_password).
- 
    Hash password tersebut menggunakan password_hash()dengan algoritma yang disarankan (misalnyaPASSWORD_BCRYPTatauPASSWORD_DEFAULT).
- Simpan hasil hash ke database bersama data user lainnya.
<?php
// Proses registrasi
$username = $_POST['username'];
$plain_password = $_POST['password'];
// Lakukan hashing pada password
$hashed_password = password_hash($plain_password, PASSWORD_BCRYPT);
// Simpan ke database
$sql = "INSERT INTO users (username, password) VALUES ('$username', '$hashed_password')";
// Eksekusi query, dan seterusnya
  Nah, di sini kita belum nyentuh password_verify() sama sekali, 
  karena fungsinya memang lebih relevan di proses login. 
2. Login
  Ketika user login, mereka memasukkan username dan password. Kita ambil data 
  hashed password berdasarkan username tersebut dari database (pastikan 
  usernamenya ada). Kemudian, kita gunakan password_verify() 
  untuk mengecek kecocokan password mentah yang diinput dengan hash di database.
<?php
// Proses login
$username = $_POST['username'];
$plain_password = $_POST['password'];
// Ambil hash dari database
// SELECT password FROM users WHERE username = '$username'
$hashed_password = ...; // hasil query database
if (password_verify($plain_password, $hashed_password)) {
    echo "Login berhasil! Selamat datang, $username.";
} else {
    echo "Username atau password salah.";
}
  Jika cocok, maka kita bisa mengizinkan user masuk ke sistem. Kalau nggak, 
  kita tolak dan mungkin menampilkan pesan error. Inilah penggunaan dasar 
  password_verify() yang paling umum ditemui di aplikasi web.
Berbagai Kasus Penggunaan password_verify()
  Tentu aja, password_verify() nggak cuma bisa dipakai di proses 
  login simpel. Ada banyak skenario lain di mana fungsi ini sangat membantu. 
  Berikut beberapa contohnya.
1. Migrasi dari Metode Hashing Lama
  Banyak aplikasi lama yang masih menggunakan md5() atau 
  sha1() untuk hashing password. Ketika mau meng-upgrade ke 
  password_hash() dan password_verify(), 
  biasanya akan ada fase transisi. Salah satu caranya adalah:
- 
    Saat user login menggunakan password lama yang di-hash dengan 
    md5()atausha1(), kita verifikasi dulu dengan metode lama.
- 
    Jika cocok, kita langsung re-hash password tersebut dengan 
    password_hash()lalu update di database, sehingga next time login, kita bisa pakaipassword_verify().
  Setelah beberapa waktu, semua password user akhirnya akan menggunakan 
  format hash baru, jadi kita bisa sepenuhnya beralih ke 
  password_verify(). Teknik ini dikenal sebagai 
  gradual migration atau rehashing on login.
2. Multi-Factor Authentication (MFA)
  Meskipun fungsinya masih sama, terkadang kita butuh mengonfirmasi password 
  pengguna sebelum proses pengiriman kode OTP (One-Time Password) atau 
  verifikasi dua langkah. Kita tetap bisa menggunakan 
  password_verify() untuk memastikan user benar-benar tahu 
  password akunnya sebelum kita melanjutkan ke langkah MFA berikutnya. 
  Skemanya kurang lebih sama, yakni cek password_verify() 
  lalu kalau sukses, barulah kita kirim kode OTP.
3. Session Hijacking Prevention
  Ada kalanya, setelah user login, kita ingin memastikan bahwa yang sedang 
  membuka halaman sensitif memang user yang bersangkutan. Kita mungkin 
  meminta user memasukkan passwordnya sekali lagi (mirip kayak Twitter 
  saat pengaturan kata sandi). Di titik ini, 
  password_verify() kembali dibutuhkan untuk validasi. 
  Contohnya saat user mau mengganti alamat email, kita panggil 
  password_verify() terhadap password mereka sebelum 
  benar-benar mengganti data sensitif.
4. Validasi Sebelum Hapus Akun
  Seringkali, platform akan meminta pengguna memasukkan kembali password 
  sebelum menghapus akun. Ini untuk mencegah aksi iseng dari orang yang 
  kebetulan lagi memakai komputer orang lain. Sekali lagi, 
  password_verify() adalah teman setia kita di sini. 
  Sebelum proses penghapusan akun dilakukan, kita cek dulu password 
  yang diinput user dengan hash di database.
Tips dan Trik Seputar password_verify()
Meskipun penggunaannya terbilang gampang, ada beberapa tips dan trik yang bisa kamu terapkan demi keamanan dan keefisienan aplikasi:
- 
    Selalu Gunakan HTTPS 
 Walaupun kita sudah mengenkripsi password di level backend denganpassword_hash(), data yang dikirim dari klien ke server tetap rentan disadap kalau tidak menggunakan HTTPS. Jadi, pastikan server aplikasi kamu sudah diatur untuk menggunakan protokol aman ini, agar password nggak bocor di tengah jalan.
- 
    Update Cost Factor Secara Berkala 
 Kalau kamu pakaiBCRYPT, ada parameter cost yang menentukan seberapa rumit hashing-nya. Seiring berkembangnya teknologi (misalnya prosesor komputer makin cepat), kita mungkin perlu menaikkan cost factor untuk menambah keamanan. Kamu bisa menambahkan logika di mana kalau password user masih pakai cost factor lama, re-hash dengan cost baru pas user login.
- 
    Gunakan password_needs_rehash()
 PHP punya fungsipassword_needs_rehash()yang bisa membantu mendeteksi apakah hash lama sudah tidak sesuai dengan algoritma atau cost yang kita inginkan. Kalo iya, kita bisa re-hash password tersebut dengan setting baru. Lalu tinggal update di database.
- 
    Selalu Simpan Hash Bukan Password Mentah 
 Jangan pernah menyimpan password mentah, walau cuma untuk testing. Kalau butuh, kamu bisa log password di environment local, tapi jangan sampai di server produksi. Ingat, security first!
- 
    Hindari Double Hashing Tanpa Alasan Jelas 
 Kadang ada yang berpikir, "lebih aman dong kalau kita hash terus di-hash lagi?" Kenyataannya, praktik ini justru bisa membuat password_verify() nggak berguna.password_hash()danpassword_verify()sudah dirancang supaya auto-salt dan menanam info algoritma. Double hashing sering bikin pusing tanpa menambah keamanan signifikan.
Pertanyaan yang Sering Muncul (FAQ)
  Berikut adalah beberapa pertanyaan yang sering diajukan seputar 
  password_verify() dan jawaban singkatnya.
- 
    Apakah password_verify()Hanya Bisa untuk BCRYPT?
 Enggak, kok! Meskipun awalnya fungsi ini lebih dikenal untuk BCRYPT, seiring waktu PHP juga mendukung algorithm lain seperti Argon2. Kamu cukup menyesuaikan parameterpassword_hash()saat membuat hash. Selama kamu pakaipassword_verify()untuk mencocokkan, prosesnya akan tetap mulus.
- 
    Bagaimana Kalau Mau Memakai md5()atausha1()?
 Sebaiknya kamu nggak pakaimd5()atausha1()untuk password karena mereka tidak dirancang untuk keamanan modern.password_hash()danpassword_verify()sudah punya mekanisme untuk melawan rainbow table dan dictionary attack dengan menambahkan salt secara otomatis dan mendukung cost factor yang bikin serangan brute force semakin sulit.
- 
    Apa Hubungannya password_verify()dengan CSRF?
 Sebenarnya tidak ada hubungan langsung.password_verify()fokusnya di verifikasi password, sedangkan CSRF (Cross-Site Request Forgery) adalah serangan yang memanfaatkan session dan cookies. Kamu tetap perlu mengimplementasikan CSRF token atau metode lain untuk mencegah CSRF.
- 
    Kenapa password_verify()Tidak Menghasilkan Hash Baru?
 Karena tugasnya cuma untuk verifikasi. Kalau kamu butuh hash baru (misalnya re-hash dengan cost yang lebih tinggi), gunakanpassword_needs_rehash()danpassword_hash()untuk menghasilkan hash baru.
Menangani Error dan Debugging
  password_verify() sendiri jarang sekali menimbulkan error 
  kecuali parameternya ada yang null atau bukan string. 
  Kalau kamu mendapati hasil selalu false, periksa hal-hal berikut:
- 
    Apakah Hash di Database Benar-Benar Hasil password_hash()?
 Jangan-jangan kamu menyimpan hash dari metode lain (sepertimd5()) tetapi mencoba memverifikasinya denganpassword_verify(). Tentu saja itu nggak akan cocok.
- 
    Apakah $plain_passwordBenar-Benar diambil dari Input User?
 Mungkin ada kesalahan penamaan variabel atau typo dalam mengekstrak data dari$_POST.
- 
    Periksa Cost Factor (Jika Tidak Sengaja Berubah)
 Pada beberapa kasus, developer iseng mengubah cost factor tanpa menyadari dampaknya. Akibatnya hash yang dihasilkan bisa beda dengan hash lama.
Mengamankan Aplikasi dengan Pendekatan Menyeluruh
  Menggunakan password_verify() dan password_hash() 
  adalah langkah penting dalam mengamankan password pengguna, tapi jangan lupa 
  bahwa keamanan aplikasi merupakan usaha menyeluruh. Kamu juga harus 
  mempertimbangkan:
- Validasi Input: Pastikan input lain seperti username, email, dan token juga di-filter atau di-sanitasi dengan tepat.
- Penggunaan HTTPS: Seperti yang dibahas sebelumnya, selalu gunakan protokol yang terenkripsi untuk mencegah man-in-the-middle attack.
- 
    Session Management: Gunakan session_regenerate_id()setelah login untuk mencegah session fixation, dan atur session timeout yang wajar.
- 
    Database Security: Terapkan prepared statements 
    untuk menghindari SQL injection. Selalu gunakan PDOataumysqlidengan parameter binding.
- Limit Login Attempts: Pertimbangkan untuk membatasi jumlah percobaan login dalam jangka waktu tertentu, sehingga serangan brute force jadi lebih sulit.
  Oke, sejauh ini kita sudah membahas panjang lebar tentang fungsi 
  password_verify() di PHP dan bagaimana cara memanfaatkannya 
  dalam sistem login, keamanan aplikasi, serta beberapa skenario khusus 
  seperti migrasi hashing dan MFA. Intinya, fungsi ini adalah salah satu 
  elemen penting dalam menjaga kerahasiaan password pengguna. 
  password_verify() bekerja dengan mencocokkan password 
  mentah yang diinput user dengan hash yang disimpan di database, 
  memastikan hanya user dengan password benar yang bisa mengakses akun.
  Kenapa kita lebih suka password_hash() dan 
  password_verify() dibanding metode hashing lama? 
  Karena keduanya udah dirancang mengikuti praktik keamanan modern, 
  termasuk penggunaan salt otomatis dan opsi untuk menyesuaikan 
  cost factor. Seiring bertambahnya kemampuan komputasi, 
  kita bisa menyesuaikan cost factor agar hashing password 
  tetap sulit di-brute force tapi tetap feasibel untuk dijalankan 
  di server produksi.
  Pastinya, keamanan password bukan satu-satunya hal yang perlu kita 
  perhatikan dalam aplikasi web. Namun, memulai dari proteksi password 
  yang baik adalah fundamental. Dengan memadukan 
  password_verify() dan password_hash() 
  bersama dengan HTTPS, validasi input, manajemen session, 
  dan praktik penulisan kode yang aman, kita bisa menciptakan 
  fondasi kokoh untuk melindungi data pengguna.
  Jadi, buat kamu yang lagi membangun sistem login atau sedang 
  meningkatkan keamanan aplikasi, jangan ragu untuk menjadikan 
  password_verify() sebagai bagian integral. 
  Tinggal panggil dua baris kode, eh, sistem keamanan password 
  udah lebih robust daripada mengandalkan hashing konvensional. 
  Nggak perlu lagi pusing soal salt, algoritma, dan lain-lain, 
  karena PHP sudah meng-handle urusan itu dengan baik. 
  Selamat mencoba, dan semoga bermanfaat!
Baca Juga :