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 )
-
$password
- String yang ingin di-hash (umumnya kata sandi plaintext).
-
$algo
- Menentukan algoritma yang digunakan untuk hashing.
- Bisa berupa konstanta bawaan PHP, misalnya:
-
PASSWORD_DEFAULT
-
PASSWORD_BCRYPT
-
PASSWORD_ARGON2I
-
PASSWORD_ARGON2ID
-
- Menentukan algoritma yang digunakan untuk hashing.
-
$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
-
Hash One-Way
Hasil daripassword_hash()
tidak dapat dibalik (di-dekripsi) menjadi teks asli. Dengan demikian, meski seorang peretas mendapatkan data hash, mereka tidak dapat dengan mudah merekonstruksi kata sandi aslinya. -
Salt Otomatis
password_hash()
secara default akan menghasilkan salt (garam) secara acak untuk setiap password yang diproses. Salt digunakan untuk mencegah penggunaan rainbow table dan serangan lain yang memanfaatkan daftar hash statis. -
Pilihan Algoritma Kuat
password_hash()
mendukung algoritma yang disarankan secara luas seperti bcrypt dan Argon2. Kedua algoritma ini dianggap aman karena memasukkan parameter cost yang mengontrol tingkat kesulitan komputasi. Semakin tinggi cost, semakin sulit bagi peretas melakukan serangan brute force.
3.2 Algoritma yang Didukung
-
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.
-
PASSWORD_BCRYPT
- Secara khusus menggunakan algoritma bcrypt.
- Hasil hash sepanjang 60 karakter.
-
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)
-
Cost pada bcrypt (
cost
)- Nilai cost bervariasi, biasanya diatur antara 10 hingga 15. Semakin besar nilainya, semakin lama proses hashing, tetapi semakin aman.
- Contoh penggunaan:
['cost' => 12]
-
Cost pada Argon2
- Dapat meliputi
memory_cost
,time_cost
, danthreads
. - Memastikan penggunaan memori yang cukup untuk menyulitkan serangan brute force.
- Dapat meliputi
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)
- Di sini, kita menggunakan
PASSWORD_DEFAULT
yang saat ini mengarah ke bcrypt pada versi PHP modern (dengan cost default 10). - Nilai
$hashedPassword
akan berupa string acak yang panjangnya sekitar 60 karakter (untuk bcrypt).
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.";
- Hasil dari
password_hash()
disimpan di kolompassword_hash
. - Jangan pernah menyimpan password asli maupun
md5()
/sha1()
tanpa salt.
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.";
}
-
password_verify()
secara otomatis membaca algoritma, cost, dan salt dari hash. - Jangan mencoba men-compare hash secara manual menggunakan
==
atau===
.
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;
- Semakin tinggi cost, semakin lama waktu hashing, tetapi membuat brute
force menjadi lebih susah dilakukan.
- Uji di server Anda untuk memastikan bahwa cost tersebut masih dapat dijalankan dengan efisien.
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$...
- Argon2 dapat di-tweak menggunakan parameter
memory_cost
,time_cost
, danthreads
. - Pastikan server memiliki resource memadai agar hashing tidak terlalu lambat.
5. Manfaat dan Alasan Penggunaan
-
Keamanan Tinggi
password_hash()
tidak hanya sekadar hashing, tetapi juga menghasilkan salt yang kuat secara otomatis. -
Mudah Digunakan
Hanya perlu memanggil satu fungsi untuk mendapat hash, dan menggunakanpassword_verify()
untuk memeriksa kebenaran password. -
Fleksibel dalam Algoritma
Anda bisa menggunakanPASSWORD_DEFAULT
,PASSWORD_BCRYPT
, ataupun Argon2 sesuai kebutuhan dan dukungan versi PHP. -
Bawaan PHP (Native)
Tidak perlu memasang ekstensi tambahan. Anda cukup memastikan versi PHP mendukung fungsi ini (PHP 5.5+ atau lebih tinggi). -
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
-
Selalu Gunakan
password_verify()
Jangan membandingkan hash menggunakan==
atau===
.password_verify()
memiliki prosedur aman untuk pengecekan. -
Gunakan
password_needs_rehash()
Bila Anda ingin secara otomatis meng-upgrade cost atau algoritma hashing, bisa gunakanpassword_needs_rehash()
untuk memeriksa apakah hash lama perlu diperbarui. -
Jangan Pernah Menyimpan Password dalam Bentuk Asli
Selalu simpan password dalam bentuk hash. Hal ini fundamental untuk keamanan aplikasi. -
Sesuaikan Cost dengan Kapasitas Server
Lakukan benchmark singkat untuk menentukan cost optimum. Pada umumnya cost 10-12 untuk bcrypt sudah cukup kuat. -
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. -
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.