Dalam dunia pemrograman web, keamanan data merupakan aspek yang tidak bisa diabaikan. Salah satu praktik dasar dalam menjaga keamanan adalah dengan melakukan enkripsi string, terutama pada data sensitif seperti password. PHP sebagai bahasa pemrograman populer menyediakan sejumlah fungsi bawaan untuk melakukan hashing, mulai dari yang sederhana seperti md5() dan sha1(), hingga yang lebih modern dan aman seperti password_hash(). Artikel ini akan membahas ketiga fungsi tersebut secara mendetail dengan contoh implementasi nyata.
Mengapa Hashing Penting dalam PHP?
Sebelum membahas tekniknya, penting untuk memahami alasan di balik penggunaan hashing. Saat pengguna mendaftar di sebuah aplikasi, biasanya mereka membuat akun dengan username dan password. Jika password disimpan dalam bentuk teks biasa (plain text) di database, maka risiko kebocoran data sangat besar. Cukup satu kali peretasan, semua password bisa diketahui dengan mudah.
Di sinilah hashing berperan. Hashing adalah proses mengubah string menjadi representasi acak yang tidak dapat dikembalikan ke bentuk aslinya secara langsung. Jadi, meskipun database bocor, password asli tetap tidak mudah diketahui. PHP memberikan beberapa fungsi bawaan yang bisa digunakan untuk hashing dengan tingkat keamanan berbeda-beda.
Hashing dengan md5() – Cepat Tapi Usang
Fungsi md5() sudah lama ada di PHP dan sangat populer digunakan di era awal internet. Fungsinya adalah menghasilkan hash 32 karakter heksadesimal dari sebuah string. Contoh penggunaannya sangat sederhana:
<?php
$password = "rahasia123";
$hash = md5($password);
echo "Password asli: " . $password . "<br>";
echo "Hash MD5: " . $hash;
?>
Hasil dari kode tersebut adalah string acak sepanjang 32 karakter, misalnya:
Password asli: rahasia123
Hash MD5: 2c6ee24b09816a6f14f95d1698b24ead
Meskipun terlihat acak, hash MD5 bisa dengan mudah diretas menggunakan rainbow table atau brute force. Karena kecepatannya, MD5 dianggap tidak lagi aman untuk menyimpan password. Namun, dalam beberapa kasus sederhana seperti verifikasi integritas file, MD5 masih dipakai.
sha1() – Lebih Panjang Tapi Masih Rentan
Setelah MD5, ada sha1() yang menghasilkan hash sepanjang 40 karakter heksadesimal. Fungsi ini sering dipilih sebagai alternatif karena dianggap sedikit lebih kuat dibanding MD5.
<?php
$password = "rahasia123";
$hash = sha1($password);
echo "Password asli: " . $password . "<br>";
echo "Hash SHA1: " . $hash;
?>
Output yang dihasilkan bisa berupa:
Password asli: rahasia123
Hash SHA1: 4fcbeeb7d13daefe6b9870c83f83f13d7cbe9b8b
SHA1 memang lebih panjang dibanding MD5, tapi tetap rentan terhadap serangan modern. Para peneliti keamanan sudah menunjukkan bahwa SHA1 bisa di-collision attack, artinya dua input berbeda bisa menghasilkan hash yang sama. Karena itu, SHA1 juga sudah jarang direkomendasikan untuk password hashing.
password_hash() – Standar Modern yang Direkomendasikan
Seiring berkembangnya kebutuhan keamanan, PHP menyediakan fungsi yang lebih kuat yaitu password_hash(). Berbeda dengan MD5 atau SHA1, fungsi ini menggunakan algoritma modern seperti bcrypt atau argon2, serta menambahkan salt otomatis sehingga hash menjadi unik meskipun password-nya sama.
Contoh penggunaan:
<?php
$password = "rahasia123";
$hash = password_hash($password, PASSWORD_DEFAULT);
echo "Password asli: " . $password . "<br>";
echo "Hash dengan password_hash: " . $hash;
?>
Output dari password_hash() biasanya lebih panjang, contohnya:
Password asli: rahasia123
Hash dengan password_hash: $2y$10$eGfHVuQG3L3JdFhK3fILeOJ8ivkF0s.8sT4rQyH6QphP08XH9s9q6
Keunggulan utama password_hash() adalah:
- Menggunakan algoritma kuat (bcrypt atau argon2).
- Menambahkan salt otomatis untuk mencegah serangan rainbow table.
- Menghasilkan hash yang berbeda walaupun password yang diinput sama.
- Mudah diverifikasi dengan fungsi
password_verify().
Contoh verifikasi:
<?php
$password = "rahasia123";
$hash = password_hash($password, PASSWORD_DEFAULT);
if (password_verify($password, $hash)) {
echo "Password benar!";
} else {
echo "Password salah!";
}
?>
Dengan pendekatan ini, aplikasi menjadi jauh lebih aman dibanding hanya mengandalkan MD5 atau SHA1.
Studi Kasus: Menyimpan Password di Database
Bayangkan sebuah aplikasi login sederhana. Dengan MD5, kode untuk menyimpan password bisa terlihat seperti ini:
<?php
$password = $_POST['password'];
$hash = md5($password);
// Simpan ke database
mysqli_query($conn, "INSERT INTO users (username, password) VALUES ('user1', '$hash')");
?>
Namun, pendekatan ini berbahaya karena hash bisa dibalik dengan mudah menggunakan hash cracking tools.
Sebaliknya, dengan password_hash():
<?php
$password = $_POST['password'];
$hash = password_hash($password, PASSWORD_DEFAULT);
// Simpan ke database
mysqli_query($conn, "INSERT INTO users (username, password) VALUES ('user1', '$hash')");
?>
Dan saat login, kita cukup menggunakan password_verify():
<?php
$input_password = $_POST['password'];
$stored_hash = $row['password']; // ambil dari database
if (password_verify($input_password, $stored_hash)) {
echo "Login berhasil";
} else {
echo "Password salah";
}
?>
Dengan cara ini, meskipun database bocor, peretas tetap sulit membongkar password asli.
Perbandingan md5, sha1, dan password_hash
Setiap fungsi hashing memiliki kelebihan dan kekurangan. Berikut ringkasannya:
- MD5
- Kelebihan: Cepat, sederhana.
- Kekurangan: Mudah di-crack, tidak aman untuk password.
- SHA1
- Kelebihan: Lebih kuat dari MD5.
- Kekurangan: Masih rentan serangan collision, tidak disarankan untuk password.
- password_hash
- Kelebihan: Menggunakan algoritma modern, aman, ada salt otomatis.
- Kekurangan: Lebih lambat dibanding MD5/SHA1, tapi justru itulah yang membuatnya aman.
Dengan perbandingan ini, jelas bahwa password_hash() adalah pilihan terbaik untuk sistem autentikasi modern.
Kapan Menggunakan Hashing Sederhana?
Meskipun MD5 dan SHA1 sudah dianggap usang untuk menyimpan password, bukan berarti mereka tidak berguna sama sekali. Ada beberapa situasi di mana hashing sederhana ini masih bisa dipakai:
- Verifikasi integritas file: memastikan file tidak berubah setelah diunduh.
- Pembuatan kode unik: misalnya untuk token verifikasi email.
- Proses caching: membuat nama file unik dari sebuah string panjang.
Namun, untuk urusan keamanan seperti login atau penyimpanan password, gunakanlah password_hash() agar aplikasi lebih tahan terhadap serangan modern.






