PHP: Autentikasi user di linux
saat ini hampir semua web memerlukan autentikasi user sebelum mereka dapat menggunakan fasilitas di web tsb. seperti di sebuah website, diperlukan registrasi terlebih dahulu kemudian login menggunakan username/password yang telah dimiliki. Banyak tutorial yang membahas proses autentikasi berdasarkan database atau plain text. Kali ini kita akan membahas teknik autentikasi untuk user di linux menggunakan skrip PHP yg cukup sederhana.
di linux, metode penyimpanan informasi user seperti username,password,uid,gid,dsb yang telah terenkripsi berada di /etc/shadow. jika kamu membuka file tsb (tentunya harus punya akses superuser) maka akan terlihat beberapa baris yg mirip seperti ini:
adi:$1$Kr78YTr4$phyOAMRubB2RpbEfoYQdD/:12268::::::
belog:$1$8uTy9o1V$.FAxSEOVdmlEWSjzkKNfW.:12268::::::
bambang:$1$lK9iEw7c$.9UNMdi8n0pqRd46Bv90d/:12268::::::
setiap informasi dibagi oleh tanda “:”. pertama, ‘adi’ adalah username, kemudian ‘$1$Kr78YTr4$phyOAMRubB2RpbEfoYQdD/’ adalah password yg telah terenkripsi, informasi berikutnya adalah uid,gid, homedir, default shell, dsb. yg akan kita bahas hanyalah username & password saja.
metode enkripsi untuk linux yg kuno masih menggunakan Standard DES-based encryption. Saat ini metode enkripsi yg umum digunakan adalah MD5 encryption dan Blowfish encryption. Pada prinsipnya setiap metode enkripsi menggunakan istilah ‘salt’ yaitu string yg berfungsi sebagai dasar dari enkripsi yg dihasilkan. metode DES menggunakan 2 karakter pertama, sedangkan MD5 menggunakan 12 karakter pertama. Pada contoh baris pertama diatas menggunakan metode MD5 dengan 12 karakter pertama sebagai salt yaitu $1$Kr78YTr4$. Untuk informasi lebih lanjut silahkan lihat man page mengenai fungsi crypt di linux.
di PHP telah terdapat fungsi yaitu crypt() yg memudahkan kita dalam enkripsi suatu string. sebelum melangkah lebih lanjut silahkan lihat terlebih dahulu di manual PHP tentang penggunaan fungsi crypt().
string crypt ( string str [, string salt] )
crypt() will return an encrypted string using the standard Unix DES-based encryption algorithm or alternative algorithms that may be available on the system. Arguments are a string to be encrypted and an optional salt string to base the encryption on. See the Unix man page for your crypt function for more information.
If the salt argument is not provided, one will be randomly generated by PHP.
…
Dengan penjelasan tersebut diatas kita bisa melakukan autentikasi user di linux menggunakan skrip PHP yg sederhana. Berikut skrip PHP secara lengkap:
//contoh autentikasi user di linux dgn metode enkripsi MD5
//andaikan $username & $password didapat dari form,dsb
$username = 'adi';
$password = 'passwordku';
$fd = fopen ("/etc/shadow", "r");
//baca baris perbaris
while (!feof ($fd)) {
$user = explode(":", fgets($fd, 4096));
//jika user benar
if ($user[0] == $username) {
//cek password apakah sesuai
if (crypt($password, substr($user[1], 0, 12)) == $user[1]) {
echo "password benar.";
} else {
echo "password salah.";
}
break;
}
}
fclose($fd);
mari kita bahas satu persatu:
$username = 'adi';
$password = 'passwordku';
adalah variabel yg didapat dari input user dari form, dsb. contoh diatas variabel tsb telah didefinisikan.
$fd = fopen("/etc/shadow", "r");
fopen adalah fungsi utk membuka sebuah file, dgn parameter r (read only), silahkan lihat manual PHP utk fungsi fopen().
while (!feof ($fd)) {
melakukan looping utk setiap baris yg ditemukan,
$user = explode(":", fgets($fd, 4096));
memasukan baris tersebut ke dalam array $user, fungsi explode() merubah string baris tersebut menjadi array berdasarkan delimiter “:”
if ($user[0] == $username) {
membandingkan hasil yg ditemukan dgn variabel &username, jika ditemukan berarti user tersebut memang exist, maka tahap selanjutnya adalah men-cek kebenaran password
if (crypt($password, substr($user[1], 0, 12)) == $user[1]) {
echo "password benar.";
} else {
echo "password salah.";
}
}
fungsi crypt() membandingkan password yg telah terenkripsi yg ada di baris tersebut dgn variabel $password. jika ditemukan maka akan ditampilkan pesan “password benar.”. ditutup dengan menghentikan proses loop dgn break; dan terakhir mengakhiri pembacaan file /etc/shadow dgn fungsi fclose().
Jangan lupa, skrip tersebut harus mendapatkan akses utk membaca file /etc/shadow. tentu saja, karena hanya superuser yg boleh melihat file /etc/shadow. hal ini bisa dilakukan dgn merubah kepemilikan skrip ke root dan user di apache (jika skrip tsb diakses menggunakan user apache) ditambahkan utk skrip tsb atau menggunakan utilitas seperti sudo.
cukup simple kan?