Fungsi password_hash() Pada Fungsi PHP

Berikut adalah artikel yang membahas fungsi password_hash() pada PHP secara mendalam, mulai dari pengertian, sintaks, penjelasan detail, hingga contoh penggunaannya pada berbagai kasus dalam konteks keamanan aplikasi web.


1. Pengenalan Fungsi password_hash()

Fungsi password_hash() pada PHP digunakan untuk membuat hash kata sandi (password hashing) secara aman. Tujuannya adalah untuk menyimpan kata sandi di database dalam bentuk yang tidak dapat dibaca secara langsung oleh siapa pun, termasuk administrator basis data. Hal ini penting untuk mencegah pencurian kata sandi dalam kasus kebocoran data (data breach).

Sebelum password_hash() diperkenalkan (PHP versi 5.5), pengembang sering menggunakan fungsi hashing seperti md5(), sha1(), ataupun library eksternal untuk hashing kata sandi. Namun metode tersebut semakin tidak disarankan karena dianggap kurang aman. password_hash() mempermudah implementasi hashing yang kuat dengan menggunakan algoritma bawaan seperti bcrypt atau Argon2.


2. Sintaks dan Parameter

Sintaks dasar password_hash() adalah sebagai berikut:

password_hash(
    string $password,
    string|int $algo,
    array $options = []
): string
  1. $password
    • String yang ingin di-hash (umumnya kata sandi plaintext).
  2. $algo
    • Menentukan algoritma yang digunakan untuk hashing.
    • Bisa berupa konstanta bawaan PHP, misalnya:
      • PASSWORD_DEFAULT
      • PASSWORD_BCRYPT
      • PASSWORD_ARGON2I
      • PASSWORD_ARGON2ID
  3. $options (opsional)
    • Parameter tambahan (biasanya berisi cost untuk bcrypt, atau memory_cost/time_cost/threads untuk Argon2).

    • Contoh untuk bcrypt:

      ['cost' => 12]
    • Semakin tinggi cost, semakin sulit (lambat) proses hashing, tapi lebih aman dari serangan brute force.

Fungsi ini akan mengembalikan string hasil hash yang biasanya memiliki format khusus, termasuk informasi algoritma dan cost di dalamnya.


3. Penjelasan Lengkap mengenai password_hash()

3.1 Keamanan

3.2 Algoritma yang Didukung

  1. PASSWORD_DEFAULT
    • Menggunakan algoritma yang dianggap paling aman saat ini oleh PHP (saat ini adalah bcrypt untuk versi PHP < 8.0, sementara versi terbaru bisa berubah ke Argon2).
    • Pemilihan ini bisa berubah di versi PHP mendatang.
  2. PASSWORD_BCRYPT
    • Secara khusus menggunakan algoritma bcrypt.
    • Hasil hash sepanjang 60 karakter.
  3. PASSWORD_ARGON2I, PASSWORD_ARGON2ID
    • Menggunakan memory-hard algorithm Argon2, yang lebih sulit diretas dengan GPU/ASIC (karena memerlukan memori besar).
    • Tersedia di PHP 7.2+ (Argon2i) dan 7.3+ (Argon2id).

3.3 Parameter Opsi (Cost)

Karena password_hash() menambahkan salt dan metadata algoritma di dalam hasilnya, Anda tidak perlu lagi menambahkan salt manual ataupun memikirkan format hash.


4. Contoh Penggunaan pada Berbagai Kasus

4.1 Membuat Hash Kata Sandi Sederhana

Kode Dasar

<?php
$password = "rahasiaPengguna";
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);

echo $hashedPassword;
// Output: $2y$10$7JELxR3VJrxwCE... (contoh)

4.2 Menyimpan Hash di Database

Contoh Skema Tabel

Misalkan Anda memiliki tabel users dengan kolom id, username, dan password_hash.

Menyimpan Hash

<?php
// Ambil input username dan password
$username = $_POST['username'];
$password = $_POST['password'];

// Buat hash kata sandi
$hashed = password_hash($password, PASSWORD_DEFAULT);

// Simpan ke database (contoh penggunaan PDO)
$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (:username, :pass)");
$stmt->execute([
  ':username' => $username,
  ':pass' => $hashed
]);

echo "Data pengguna telah disimpan.";

4.3 Verifikasi Kata Sandi Menggunakan password_verify()

Untuk memverifikasi apakah kata sandi yang dimasukkan pengguna cocok dengan hash yang disimpan, kita menggunakan password_verify(). Ini bukan bagian dari password_hash(), tetapi keduanya saling melengkapi.

<?php
// Ambil username dan password dari form
$username = $_POST['username'];
$password = $_POST['password'];

// Cari hash di database
$stmt = $pdo->prepare("SELECT password_hash FROM users WHERE username = :username");
$stmt->execute([':username' => $username]);
$user = $stmt->fetch();

if ($user) {
    // Verifikasi password
    if (password_verify($password, $user['password_hash'])) {
        echo "Login sukses!";
    } else {
        echo "Password salah.";
    }
} else {
    echo "Pengguna tidak ditemukan.";
}

4.4 Menentukan Cost Lebih Tinggi untuk Keamanan Tambahan

<?php
$password = "rahasiaTinggi";
// Meningkatkan cost jadi 12
$options = ['cost' => 12];
$hashWithCost12 = password_hash($password, PASSWORD_BCRYPT, $options);

echo $hashWithCost12;

4.5 Menggunakan Algoritma Argon2 (jika didukung)

Jika server Anda menjalankan PHP versi 7.3+ (atau 7.2+ untuk Argon2i), Anda dapat menggunakan Argon2.

<?php
$password = "rahasiaArgon";
$options = [
    'memory_cost' => 1<<17,  // 131072 bytes (128 MB)
    'time_cost'   => 4,
    'threads'     => 2
];

// Gunakan Argon2id (direkomendasikan) bila tersedia
$argonHash = password_hash($password, PASSWORD_ARGON2ID, $options);

echo $argonHash;
// Contoh output: $argon2id$v=19$m=65536,t=4,p=2$...

5. Manfaat dan Alasan Penggunaan

  1. Keamanan Tinggi
    password_hash() tidak hanya sekadar hashing, tetapi juga menghasilkan salt yang kuat secara otomatis.

  2. Mudah Digunakan
    Hanya perlu memanggil satu fungsi untuk mendapat hash, dan menggunakan password_verify() untuk memeriksa kebenaran password.

  3. Fleksibel dalam Algoritma
    Anda bisa menggunakan PASSWORD_DEFAULT, PASSWORD_BCRYPT, ataupun Argon2 sesuai kebutuhan dan dukungan versi PHP.

  4. Bawaan PHP (Native)
    Tidak perlu memasang ekstensi tambahan. Anda cukup memastikan versi PHP mendukung fungsi ini (PHP 5.5+ atau lebih tinggi).

  5. Mempersiapkan Migrasi Algoritma
    PASSWORD_DEFAULT dapat berubah di masa depan saat algoritma yang lebih aman diimplementasikan. Hal ini memudahkan migrasi tanpa harus mengubah banyak kode.


6. Tips dan Trik

  1. Selalu Gunakan password_verify()
    Jangan membandingkan hash menggunakan == atau ===. password_verify() memiliki prosedur aman untuk pengecekan.

  2. Gunakan password_needs_rehash()
    Bila Anda ingin secara otomatis meng-upgrade cost atau algoritma hashing, bisa gunakan password_needs_rehash() untuk memeriksa apakah hash lama perlu diperbarui.

  3. Jangan Pernah Menyimpan Password dalam Bentuk Asli
    Selalu simpan password dalam bentuk hash. Hal ini fundamental untuk keamanan aplikasi.

  4. Sesuaikan Cost dengan Kapasitas Server
    Lakukan benchmark singkat untuk menentukan cost optimum. Pada umumnya cost 10-12 untuk bcrypt sudah cukup kuat.

  5. Perhatikan Versi PHP
    Untuk Argon2, pastikan server Anda menjalankan minimal PHP 7.2.
    Jika Anda masih menjalankan PHP lama, pertimbangkan upgrade demi fitur keamanan terbaru.

  6. Pastikan Zona Waktu Bukan Masalah
    Proses hashing tidak bergantung pada zona waktu, tetapi pastikan server Anda disetel dengan benar agar tidak ada masalah dengan log atau waktu eksekusi yang diperlukan.


Fungsi password_hash() di PHP adalah solusi andal dan sederhana untuk mengelola hashing kata sandi. Dengan satu baris kode, kita dapat menghasilkan hash yang aman, lengkap dengan salt yang di-generate secara otomatis. Digabungkan dengan password_verify(), proses validasi kata sandi menjadi lebih mudah dan terjamin keamanannya.

Pengembang tak perlu lagi mengimplementasikan salt secara manual atau khawatir mengenai standar algoritma terbaik. Cukup gunakan PASSWORD_DEFAULT atau PASSWORD_BCRYPT/PASSWORD_ARGON2ID, atur parameter cost/memory sesuai kebutuhan, dan PHP akan mengurus sisanya. Dengan penerapan yang benar, data password sensitif dapat dilindungi secara optimal dari potensi ancaman dan kebocoran data.