Fungsi sha1() Pada PHP
Dalam pengembangan aplikasi berbasis web, proses hashing sering muncul
sebagai salah satu komponen penting. Ketika membicarakan hashing,
ada beberapa fungsi yang bisa digunakan. Salah satu fungsi bawaan
yang tersedia di PHP adalah sha1()
.
Fungsi ini kerap dipakai untuk menghasilkan hash
berukuran 40 karakter heksadesimal, yang merepresentasikan
nilai 160 bit. Pada halaman berikut, akan diuraikan
berbagai hal seputar sha1()
,
mulai dari penjelasan dasar, contoh penggunaan,
sampai alasan mengapa ia tidak lagi disarankan
untuk keamanan kritis, meskipun masih kerap digunakan
dalam beberapa skenario tertentu.
Mengenal sha1()
Secara Umum
sha1()
merupakan fungsi di PHP
yang mengimplementasikan algoritma secure hash
SHA-1. Jika memanggil sha1()
dengan sebuah string, maka hasilnya adalah
representasi heksadesimal sepanjang 40 karakter.
Sebagai contoh, jika ada string "Hello World"
,
maka sha1("Hello World")
akan menghasilkan hash tertentu yang bersifat deterministik,
artinya setiap kali diberikan input yang sama,
hasilnya pun sama. Namun, apabila ada perubahan
sekecil apa pun di input, hasil hash berubah drastis.
Gambaran mendasar cara kerja hashing adalah input string diolah melalui serangkaian operasi matematis sehingga output yang dihasilkan terlihat acak, tapi sebenarnya tetap konsisten untuk input yang sama. Tujuan hashing bukan untuk enkripsi (karena tidak bisa dikembalikan ke bentuk asli dengan mudah), melainkan untuk verifikasi integritas data atau mengidentifikasi data secara unik.
Cara Memakai Fungsi sha1()
di PHP
Sintaks untuk memanggil fungsi ini sangat sederhana:
<?php
$hash = sha1($string);
?>
Parameter $string
di atas adalah nilai
yang ingin di-hash. Hasilnya berupa string 40 karakter,
berisi digit heksadesimal (0–9 dan a–f).
Jika diinginkan, kita bisa meminta hasilnya dalam bentuk
raw
(binary) dengan mengisi parameter kedua
$raw_output
menjadi true
,
sehingga sha1($string, true)
mengembalikan
data biner sepanjang 20 byte, bukan 40 karakter teks heksadesimal.
Untuk penggunaan umum, kebanyakan orang tetap memakai format heksadesimal.
Contoh singkatnya:
<?php
$input = "Halo, selamat datang!";
$hash1 = sha1($input);
$hash2 = sha1($input, true); // hasil biner
echo "Hash heksadesimal: " . $hash1 . "<br>";
echo "Hash biner: " . bin2hex($hash2) . "<br>";
?>
Bagian bin2hex($hash2)
di contoh di atas
berfungsi mengubah hasil biner menjadi representasi heksadesimal
supaya bisa dicetak dan dilihat. Perhatikan bahwa
$hash1
dan hasil bin2hex($hash2)
pada dasarnya sama, hanya berbeda cara penyimpanan di variabel.
Kasus Pemakaian sha1()
dalam Proyek
1. Deteksi Perubahan Berkas
Salah satu penerapan fungsi hashing seperti SHA-1 adalah memeriksa apakah sebuah berkas telah berubah. Dengan menyimpan nilai hash awalnya, kita bisa membandingkan nilai hash di kemudian hari. Apabila hasil hash berbeda, maka dapat disimpulkan bahwa isi berkas telah dimodifikasi. Ini sering digunakan saat membuat sistem version control atau sistem pembaruan (update system) yang perlu mengecek integritas file.
Meski sha1()
bukan opsi teraman
untuk situasi kritis (karena algoritma SHA-1 sudah
tidak begitu direkomendasikan),
masih ada yang memakainya dalam skenario
“cek perubahan file†yang tingkat keamanannya tidak setinggi
aplikasi perbankan atau kependudukan.
Terkadang, fungsi ini tetap dinilai cukup
untuk kasus basic integrity check
ketika tidak ada ancaman serius yang menargetkan kolisi.
2. Mencari Duplikasi Data
Di beberapa aplikasi, kita ingin mendeteksi apakah dua data teks identik tanpa menyimpan semuanya secara langsung. Misalnya, ada sistem document management dan kita mau tahu apakah sebuah dokumen sudah pernah diunggah sebelumnya. Salah satu pendekatannya adalah membandingkan nilai hash SHA-1 dari dokumen.
Jika hash keduanya sama,
kemungkinan besar dokumennya sama.
Walau demikian, perlu diingat bahwa
collision (dua data berbeda menghasilkan hash sama)
di SHA-1 lebih mungkin terjadi
dibanding algoritma yang lebih baru seperti SHA-256.
Karena itu, untuk use case yang lebih sensitif,
kebanyakan pengembang beralih ke SHA-256 atau
bahkan password_hash()
bila tujuannya terkait password.
3. Menandai Berkas pada Sistem Cache
Ketika mengelola cache, kadang kita perlu nama unik yang merepresentasikan konten, sehingga kalau kontennya berubah, nama filenya pun berubah. SHA-1 dapat dipakai untuk membentuk nama file atau folder cache karena panjangnya ringkas (40 karakter), dan relatif cepat dihitung. Setiap kali data berubah, kita akan memperoleh nilai hash baru, membuat sistem cache bisa merespons perubahan data dengan baik.
Alasan sha1()
Tidak Disarankan untuk Password
Dulu, banyak tutorial jadul yang merekomendasikan MD5 atau SHA-1 untuk hashing password. Seiring waktu, itu tidak lagi dianggap aman. Alasan utamanya:
-
Algoritma Terlalu Cepat.
Serangan brute force jadi mudah
karena hashing dengan
sha1()
dapat dilakukan sangat cepat, memungkinkan penjahat mencoba jutaan kombinasi dalam waktu singkat. - Perkembangan Teknik Cracking. SHA-1 sudah terbukti memiliki kelemahan yang mempermudah penjahat menemukan collision. Walau collision tidak langsung berarti membalikkan hash menjadi password (itu berbeda hal), tapi menunjukkan kerentanan keamanan di algoritma tersebut.
-
Tidak Ada Salt Bawaan.
Fungsi
sha1()
standar tidak menambahkan salt secara otomatis. Pengembang memang bisa menambahkan sendiri, tapi ini menambah kerumitan. Di sisi lain, fungsi modern sepertipassword_hash()
di PHP sudah otomatis menangani salt serta punya mekanisme cost factor.
Oleh karena itu,
jika tujuannya spesifik untuk mengamankan password,
sangat disarankan menggunakan password_hash()
atau algoritma key derivation seperti
bcrypt
maupun Argon2
.
Fungsi-fungsi ini dirancang untuk menahan serangan brute force
dan telah dipakai luas dalam aplikasi modern.
Contoh Kode Sederhana Memakai sha1()
di Aplikasi
1. Membandingkan Dua String
Kode di bawah ini menunjukkan bagaimana menggunakan sha1()
untuk melihat apakah dua string sama.
Meskipun sebenarnya kita bisa langsung pakai perbandingan
===
di PHP,
contoh ini hanyalah ilustrasi bagaimana sha1()
bisa jadi alat identifikasi.
<?php
function isSameContent($str1, $str2) {
$hash1 = sha1($str1);
$hash2 = sha1($str2);
return ($hash1 === $hash2);
}
// Contoh penggunaan
$textA = "Selamat Pagi";
$textB = "Selamat pagi";
// Bandingkan
if (isSameContent($textA, $textB)) {
echo "Kedua teks identik.";
} else {
echo "Keduanya berbeda.";
}
?>
Pada contoh di atas,
"Selamat Pagi" dan "Selamat pagi"
memiliki perbedaan di huruf "P" kapital.
Maka, hasil sha1()
-nya tidak sama,
karena hashing itu case-sensitive.
Jika teks input benar-benar identik,
barulah hash keduanya sama.
2. Membuat Tanda Tangan Data
Di beberapa aplikasi,
tanda tangan data yang sederhana bisa dibuat
dengan menambahkan secret key pada akhir string,
lalu menggunakan sha1()
.
Ini bukan metode terkuat (idealnya memakai HMAC),
tapi contoh berikut menjelaskan ide dasarnya:
<?php
function signData($data, $secret) {
// Menggabungkan data dengan secret key
$combined = $data . $secret;
// Hash
return sha1($combined);
}
$data = "order_id=1234&amount=50000";
$secretKey = "MySecretKey";
$signature = signData($data, $secretKey);
echo "Signature: " . $signature;
?>
Kita mungkin menyertakan signature ini
saat mengirim data ke server lain.
Di sisi penerima,
data dan secret key yang sama
akan diproses, lalu dicocokkan signature-nya.
Jika cocok, berarti data belum diubah selama perjalanan.
Walaupun ini membantu memastikan integritas,
perlu diingat penggunaan hash_hmac()
lebih disarankan karena dirancang khusus
untuk pembuatan Hash-based Message Authentication Code (HMAC).
3. Membuat Nama File Cache
Saat membangun sistem caching, kita bisa menamai file cache dengan hash yang mewakili konten. Sehingga, jika kontennya berubah, nama file cache ikut berubah. Contohnya:
<?php
function getCacheFilename($content) {
$hash = sha1($content);
return "cache_" . $hash . ".tmp";
}
$content = "Konten halaman yang cukup panjang...";
$filename = getCacheFilename($content);
echo "Nama file cache: " . $filename;
?>
File .tmp
ini bisa kita simpan di direktori cache.
Saat mau menghidangkan konten,
kita cukup cek apakah file cache_<hash>.tmp
sudah ada. Jika ada, berarti konten tidak berubah,
sehingga kita dapat langsung menayangkan dari cache.
Kalau kontennya berubah,
hash baru akan dihasilkan dan nama file menjadi berbeda.
Metode ini umum di sistem asset caching atau
static site generator sederhana.
Pertimbangan Kinerja
sha1()
tergolong sangat cepat,
karena pada dasarnya SHA-1 itu cepat diproses di perangkat modern.
Apabila yang di-hash adalah file besar,
tetap perlu diperhitungkan biaya I/O untuk membaca file.
Namun, dibandingkan algoritma hashing lain yang lebih kompleks,
SHA-1 bisa dibilang ringan.
Inilah sebabnya tidak aman untuk password
karena penyerang dapat melakukan percobaan
brute force jutaan kali per detik dengan mudah.
Untuk kebutuhan validasi data biasa,
kecepatan ini adalah keuntungan.
Jika dataset cukup banyak (misalnya jutaan record),
kita tetap perlu mempertimbangkan overhead komputasi.
Tapi secara umum,
sha1()
masih layak dipakai
pada volume data yang sedang.
Kelemahan Collision SHA-1
Beberapa waktu lalu, peneliti keamanan berhasil menghasilkan dua dokumen berbeda yang memiliki hash SHA-1 sama. Ini dikenal sebagai SHA-1 collision attack. Meskipun menyiapkan serangan ini butuh sumber daya komputasi besar, fakta bahwa collision itu dimungkinkan menunjukkan kelemahan mendasar di algoritma tersebut. Kalau aplikasimu menghadapi ancaman serius (misalnya industrial espionage atau serangan tingkat tinggi), lebih baik beralih ke algoritma yang lebih baru seperti SHA-256 atau SHA-3.
Meski demikian, banyak sistem masih memakai SHA-1 untuk hal-hal yang tidak sangat sensitif, contohnya mengelola integritas data internal. Tidak ada larangan untuk memakainya jika tingkat ancamannya relatif rendah. Tapi keputusan akhir bergantung pada analisis risiko di lingkungan masing-masing.
Beberapa Tips Pemakaian
-
Bedakan Kebutuhan.
Jika ingin menyimpan password,
pakai fungsi khusus seperti
password_hash()
. Jika ingin mendeteksi perubahan data,sha1()
mungkin cukup, tapi tetap waspadai potensi collision jika data sangat sensitif. -
Kombinasikan dengan Salt atau HMAC.
Ketika data yang di-hash perlu perlindungan ekstra,
tambahkan salt atau gunakan
hash_hmac('sha1', ...)
. Ini mencegah rainbow table attack dan memberikan keamanan tambahan. -
Kenali Konversi Hasil.
Hasil hash berbentuk heksadesimal.
Pastikan sistemmu siap menampung string 40 karakter.
Jika pakai biner (
$raw_output = true
), berarti perlu penyesuaian penyimpanan. - Perhatikan Case-sensitive. Hash akan berbeda jika huruf besar-kecil di input tidak sama. Pastikan inputmu sudah terstandarisasi (misalnya di-lowercase) jika memang hanya mau membandingkan isi teks secara kasat mata.
-
Evaluasi Performa.
Sebelum menerapkan
sha1()
di loop besar atau di file raksasa, uji beban kerja agar aplikasi tidak mengalami penurunan kinerja drastis.
Pembanding dengan md5()
md5()
juga sama populernya,
bahkan beberapa tahun lalu lebih sering disebut
untuk hashing ringkas.
Namun, kedua algoritma ini (MD5 dan SHA-1)
sudah dianggap lemah untuk aplikasi keamanan kritis.
Perbedaan utama:
- Ukuran Hasil: MD5 menghasilkan 32 karakter heksadesimal (128 bit), sedangkan SHA-1 menghasilkan 40 karakter (160 bit).
- Kecepatan: Keduanya cepat, meski detail perbandingan tergantung implementasi. Kecepatan tinggi berarti rentan terhadap brute force.
- Kerentanan: MD5 sudah lebih lama diketahui rentan. SHA-1 sedikit lebih kuat, tetapi penelitian menunjukkan keduanya sama-sama tidak ideal untuk keamanan.
Meski demikian, masih ada sistem legacy yang memanfaatkan keduanya untuk hal-hal seperti cek integritas berkas. Bagi yang benar-benar mengutamakan keamanan, sebaiknya beralih ke SHA-256 atau lebih modern.
Panduan Singkat Menghindari Penggunaan yang Keliru
Supaya tidak salah kaprah,
berikut ringkasan kapan sha1()
layak dipakai dan kapan sebaiknya dihindari:
Kondisi | Keterangan |
---|---|
Ingin menyimpan password? | Hindari. Gunakan password_hash()
atau algoritma password hashing lain yang lebih aman. |
Butuh cek perubahan file yang tidak sangat sensitif? | Boleh saja pakai sha1() ,
tapi perhatikan risiko collision.
Jika ingin lebih yakin, gunakan SHA-256. |
Pembuatan signature sederhana? | Bisa, tetapi pertimbangkan hash_hmac()
agar perlindungan lebih baik. |
Membandingkan data teks biasa | Mungkin berguna untuk menyingkat string panjang, tapi tetap waspadai potensi collision. |
Fungsi sha1()
di PHP adalah alat lama
yang masih sering dijumpai dalam berbagai kode warisan.
Fungsi ini memiliki kemampuan menghasilkan hash 40 karakter
dalam format heksadesimal yang sesuai untuk identifikasi data,
deteksi perubahan file, dan pembuatan signature sederhana.
Akan tetapi, kelemahan SHA-1 dalam konteks keamanan modern
sudah diketahui luas, terutama ketika digunakan
untuk menahan serangan brute force
atau memverifikasi hal-hal kritis seperti password.
Di skenario yang tidak terlalu menuntut keamanan tingkat tinggi,
sha1()
kadang masih dianggap cukup.
Namun, untuk kebutuhan perlindungan yang serius,
ada baiknya memakai algoritma yang lebih kuat,
misalnya bcrypt
, Argon2
,
atau setidaknya SHA-256.
Selalu pertimbangkan risiko dan tujuan akhir
sebelum memilih algoritma hashing.
Jika sekadar ingin mendeteksi apakah file
telah diubah di lingkungan internal,
sha1()
bisa dipakai.
Akan tetapi,
jika berurusan dengan data sensitif
atau menyimpan password,
lebih baik berpindah ke metode yang lebih mutakhir.
Semoga penjelasan di atas membantu memahami
kelebihan dan kekurangan sha1()
,
sekaligus memberikan gambaran
tentang bagaimana fungsinya dimanfaatkan
di berbagai kasus.
Baca Juga :