Implementasi Password Hash dan Password Verify pada PHP

Apa itu password_hash?
password_hash() adalah fungsi PHP untuk melakukan hashing menggunakan algoritma satu arah (one-way hashing). Tersedia sejak PHP 5.5.
Hash adalah mekanisme untuk memetakan data berupa teks polos (plain text) menjadi output berupa checksum atau fingerprint — kode acak dengan panjang karakter yang tetap.
Karena password_hash() menggunakan algoritma satu arah, data yang sudah ter-hash tidak bisa dikembalikan ke bentuk aslinya.
Contoh penggunaan:
<?php
$options = [
'cost' => 10,
];
echo password_hash("secret password", PASSWORD_DEFAULT, $options);
Output:
$2y$10$EnIi90KP.0BqCVJgK21BrO3xzArxCZaiAPaUebCw.K2Xw71QOCZv2
Penjelasan parameter:
"secret password"— password yang akan di-hash.PASSWORD_DEFAULT— algoritma bawaan menggunakan BCRYPT, menghasilkan output 60 karakter. Disarankan membuat kolom database sepanjang 255 karakter untuk mengantisipasi algoritma lain yang mungkin menghasilkan output lebih panjang.$options— array opsional. Nama variabel bisa diganti sesuka hati.cost— menentukan jumlah iterasi hashing. Nilai 10 berarti proses dilakukan sebanyak 2¹⁰ atau 1024 kali.
Hasil hash disimpan di database untuk digunakan bersama password_verify() saat autentikasi login.
Apa itu password_verify?
password_verify() adalah fungsi PHP untuk memverifikasi (mencocokkan) password asli dengan data yang sudah ter-hash menggunakan password_hash().
Contoh:
<?php
$hashed = '$2y$10$EnIi90KP.0BqCVJgK21BrO3xzArxCZaiAPaUebCw.K2Xw71QOCZv2';
if (password_verify('secret password', $hashed)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
$hashed— nilai hash yang diambil dari database.password_verify($userInput, $hashed)— mencocokkan password input dengan hash. Mengembalikantruejika cocok,falsejika tidak.
Implementasi password_hash dan password_verify
Contoh implementasi lengkap pada halaman login:
<?php
// Memulai session.
session_start();
// Jika ditemukan session, maka user akan otomatis dialihkan ke halaman admin.
if (isset($_SESSION['username'])) {
header("location: admin.php");
}
// Include koneksi database.
require_once "connect.php";
// Jika tombol login ditekan, maka akan mengirimkan variabel yang berisi username dan password.
if (isset($_POST['login'])) {
$username = $_POST['username'];
$userpass = $_POST['password']; // password yang di-inputkan user lewat form login.
// Query ke database.
$sql = mysqli_query($connect_db, "SELECT username, password, nama FROM login WHERE username = '$username'");
list($username, $password, $nama) = mysqli_fetch_array($sql);
// Jika data ditemukan dalam database, lakukan validasi dengan password_verify.
if (mysqli_num_rows($sql) > 0) {
/*
Validasi login dengan password_verify
$userpass -----> diambil dari password yang di-inputkan user lewat form login
$password -----> diambil dari password dalam database
*/
if (password_verify($userpass, $password)) {
// Buat session baru.
session_start();
$_SESSION['username'] = $username;
$_SESSION['nama'] = $nama;
// Jika login berhasil, user akan diarahkan ke halaman admin.
header("location: admin.php");
die();
} else {
echo '<script language="javascript">
window.alert("LOGIN GAGAL! Silakan coba lagi");
window.location.href="./";
</script>';
}
} else {
echo '<script language="javascript">
window.alert("LOGIN GAGAL! Silakan coba lagi");
window.location.href="./";
</script>';
}
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Login dengan password_hash dan password_verify</title>
<style type="text/css">
body {
font-family: Arial, serif;
margin: 0;
}
.container {
display: table;
margin: 0 auto;
height: 100vh;
}
.box {
background: #eee;
border-radius: 3px;
padding: 20px;
top: 30vh;
position: relative;
vertical-align: middle;
margin: 0 auto;
width: 275px;
height: 175px;
}
.form-group {
margin-bottom: 10px;
}
button {
cursor: pointer;
font-size: 16px;
padding: 5px;
}
</style>
</head>
<body>
<div class="container">
<div class="box">
<h2>Login</h2>
<form action="" method="post">
<div class="form-group">
<label>Username :</label>
<input type="text" name="username" required>
</div>
<div class="form-group">
<label>Password :</label>
<input type="password" name="password" required>
</div>
<button type="submit" name="login">Login</button>
</form>
</div>
</div>
</body>
</html>
Kesimpulan dan penutup
password_hash() sangat disarankan untuk mengenkripsi password karena menggunakan algoritma satu arah — mustahil untuk mengetahui password asli hanya dari output hash-nya. Pastikan setiap aplikasi PHP yang dibuat menggunakan password_hash() dan password_verify() untuk keamanan login.