Cara Membuat Form Login Menggunakan Password Hash di PHP dan MySQL

Cara Membuat Form Login Menggunakan Password Hash di PHP dan MySQL
Kucatat.com,

Pada tutorial sebelumnya, kita membuat sistem login sederhana dengan membandingkan password secara langsung menggunakan operator ===. Cara tersebut memang mudah dipahami oleh pemula, tetapi tidak aman apabila digunakan pada aplikasi yang berjalan di lingkungan produksi.

PHP telah menyediakan mekanisme keamanan bawaan melalui fungsi password_hash() dan password_verify(). Dengan metode ini, password pengguna akan disimpan dalam bentuk hash sehingga tidak dapat dibaca secara langsung meskipun database berhasil diakses oleh pihak yang tidak berwenang.

Pada artikel ini, kita akan mempelajari cara membuat sistem login yang lebih aman menggunakan password hash.

Mengapa Harus Menggunakan Password Hash?

Menyimpan password dalam bentuk teks biasa (plain text) memiliki risiko yang sangat besar. Apabila database bocor, seluruh password pengguna dapat diketahui.

Baca Juga:

Contoh yang tidak disarankan:

$password = "admin123";

Di dalam database akan tersimpan:

admin123

Sedangkan dengan password_hash(), password akan berubah menjadi string acak seperti berikut.

$2y$10$hT5rF5Jw9QjM2tJQ1....

Hash tersebut tidak dapat dikembalikan menjadi password asli sehingga jauh lebih aman.

Baca Juga:

Cara Menyimpan Password ke Database

Saat proses registrasi atau pembuatan akun, gunakan fungsi password_hash().

Contoh:

$password = $_POST['password'];

$password_hash = password_hash($password, PASSWORD_DEFAULT);

Selanjutnya simpan variabel $password_hash ke dalam database.

Contoh query:

$query = $koneksi->prepare("
INSERT INTO users
(nama,username,email,password)
VALUES (?,?,?,?)
");

$query->bind_param(
"ssss",
$nama,
$username,
$email,
$password_hash
);

$query->execute();

Dengan cara tersebut, password yang tersimpan di database sudah dalam bentuk hash.

Membuat Halaman Login

File login.php tetap sama seperti tutorial sebelumnya.

<form method="post" action="proses_login.php">

<input type="text" name="username" placeholder="Username" required>

<input type="password" name="password" placeholder="Password" required>

<input type="submit" value="Login">

</form>

Perbedaannya hanya terdapat pada proses verifikasi password.

Membuat Proses Login Menggunakan password_verify()

Buat atau ubah file proses_login.php menjadi seperti berikut.

Baca Juga:

<?php

require_once 'config.php';

$username = trim($_POST['username']);
$password = $_POST['password'];

$query = $koneksi->prepare("
SELECT *
FROM users
WHERE username=?
");

$query->bind_param("s",$username);
$query->execute();

$result = $query->get_result();

if($result->num_rows==1){

    $user = $result->fetch_assoc();

    if(password_verify($password,$user['password'])){

        $_SESSION['login']=true;
        $_SESSION['id']=$user['id'];
        $_SESSION['username']=$user['username'];
        $_SESSION['role']=$user['role'];

        header("Location: dashboard.php");
        exit;

    }else{

        header("Location: login.php?error=Password salah");
        exit;

    }

}else{

    header("Location: login.php?error=Username tidak ditemukan");
    exit;

}

Pada contoh di atas, fungsi password_verify() akan membandingkan password yang dimasukkan pengguna dengan password hash yang tersimpan di database.

Apabila keduanya cocok, pengguna berhasil login.

Perbedaan password_hash() dan password_verify()

password_hash()

Digunakan saat menyimpan password.

$password_hash = password_hash(
$password,
PASSWORD_DEFAULT
);

Fungsi ini hanya dipanggil satu kali, yaitu ketika membuat akun baru atau mengganti password.

Baca Juga:

password_verify()

Digunakan saat login.

password_verify(
$password,
$user['password']
);

Fungsi ini akan menghasilkan nilai true apabila password yang dimasukkan sesuai dengan hash yang ada di database.

Struktur Tabel Users

Contoh struktur tabel:

CREATE TABLE users (

id INT AUTO_INCREMENT PRIMARY KEY,

nama VARCHAR(100),

username VARCHAR(50),

email VARCHAR(100),

password VARCHAR(255),

role VARCHAR(20)

);

Kolom password sebaiknya menggunakan tipe VARCHAR(255) agar mampu menyimpan hasil hash yang dihasilkan oleh PHP.

Baca Juga:

Kelebihan Password Hash

Menggunakan password hash memiliki beberapa keuntungan, di antaranya:

  • Password tidak tersimpan dalam bentuk teks biasa.
  • Lebih aman apabila database bocor.
  • Menggunakan algoritma hashing bawaan PHP yang terus diperbarui.
  • Direkomendasikan oleh dokumentasi resmi PHP.
  • Mudah diimplementasikan tanpa library tambahan.

Tips Keamanan Login

Selain menggunakan password hash, Anda juga disarankan menerapkan beberapa praktik berikut:

  • Gunakan Prepared Statement untuk seluruh query database.
  • Validasi seluruh input pengguna.
  • Gunakan htmlspecialchars() saat menampilkan data.
  • Batasi jumlah percobaan login (login attempt).
  • Gunakan HTTPS pada website yang sudah dipublikasikan.
  • Regenerasi session setelah login menggunakan session_regenerate_id(true) untuk mengurangi risiko session fixation.

Kesimpulan

Menggunakan password_hash() dan password_verify() merupakan standar keamanan yang wajib diterapkan pada sistem login berbasis PHP. Dengan metode ini, password pengguna tidak lagi disimpan dalam bentuk teks biasa sehingga risiko kebocoran data dapat diminimalkan.

Pada tutorial ini Anda telah mempelajari cara menyimpan password dalam bentuk hash, melakukan verifikasi saat login, serta memahami perbedaan fungsi password_hash() dan password_verify().

Pada artikel selanjutnya, kita akan membahas cara membuat fitur registrasi pengguna menggunakan password hash sehingga akun baru dapat dibuat dengan aman dan langsung terintegrasi dengan sistem login.

Belum ada komentar

Kucatat Kucatat