Senin, 01 November 2010

Tips Membuat Script PHP Pengolah Password dengan MD5

Setiap password pengguna aplikasi hendaknya dienkripsi untuk keperluan faktor keamanan. Mengapa password harus dienkripsi? atau apa sih enkripsi itu? OK… enkripsi adalah teknik penyandian pesan, yang semula pesan tersebut dapat dibaca dan bermakna, setelah dienkripsi menjadi tidak terbaca dan tidak bermakna. Lantas… mengapa password harus dienkripsi? Pertanyaan tersebut saya balik, bagaimana jika password tidak dienkripsi? Apabila password tidak dienkripsi, maka dapat dengan mudah dibaca, dan digunakan oleh orang lain yang tidak berhak untuk masuk ke dalam sistem atau aplikasi.

Dalam PHP, tentu kita tidak asing dengan perintah atau function md5(). Function ini sering digunakan para programmer untuk mengenkripsi password sebelum hasil enkripsi tersebut disimpan dalam database sistem, ketika registrasi user baru. Hasil enkripsi md5() berupa suatu string acak dengan panjang 32 karakter (256 bit). Sudah amankah penggunaan md5()? Artikel ini akan membahasnya, serta memberikan tips bagaimana cara membuat script PHP yang baik untuk mengolah password.

Nah… biasanya, struktur code untuk mengenkripsi password dengan md5 dan menyimpannya ke dalam database (pada registrasi user baru) adalah sebagai berikut:

<?php

// input username baru
// input password asli baru ($passAsli)

$passEnkrip = md5($passAsli);

/* procedure simpan data username
dan password hasil md5() ke db */

?>

Sedangkan struktur code untuk loginnya adalah

<?php

// input login username
// input login password asli ($passAsli)

if (md5($passAsli) == $passEnkrip)
{
// login sukses
// procedure jika login sukses
}
else {
// login gagal
// procedure jika login gagal
}

?>

Lantas… benar-benar sudah amankah penggunaan md5() dengan struktur code di atas?

Beberapa periode yang lalu, mungkin penggunaan struktur seperti di atas sudah dirasa aman. Namun saat ini tidak aman lagi, karena sudah banyak tool untuk mendekripsi hasil enkripsi md5(). Salah satu toolnya seperti yang ada di situs http://md5.rednoize.com. Apa akibatnya jika password ini didekripsi? wah bahaya… bisa-bisa password aslinya ketahuan.

So… gimana donk? apakah md5() tidak usah digunakan lagi? Tidak usah khawatir, kita tetap bisa menggunakan md5() namun perlu sedikit kreatif. Maksudnya adalah bahwa kita perlu mengkombinasikan penggunaan md5() dengan pengacak, misalnya kita gunakan md5() berulangkali, atau menggabungkan password asli dengan suatu string tertentu lalu dienkripsi.

Berikut ini contoh struktur code untuk menyimpan password terenkripsi menggunakan pengacak

<?php

// input username baru
// input password baru ($passAsli)

$pengacak = "AJWKXLAJSCLWLW";
$passEnkrip = md5($pengacak . md5($passAsli) . $pengacak );

/* procedure simpan data username
dan password $passEnkrip ke db */

?>

Sedangkan berikut ini adalah struktur untuk loginnya

<?php

// input login username
// input login password asli ($passAsli)

$pengacak = "AJWKXLAJSCLWLW";

if (md5($pengacak . md5($passAsli) . $pengacak) == $passEnkrip)
{
// login sukses
// procedure jika login sukses
}
else {
// login gagal
// procedure jika login gagal
}
?>

Anda dapat mengubah isi pengacak atau mungkin mengubah format enkripsinya menjadi model lain, misalnya menggabungkan 3 atau lebih md5() dalam enkripsi. Dalam hal ini, hanya kita yang tahu format enkripsi atau pengacaknya. Intinya adalah jangan mengenkripsi password menggunakan md5() secara langsung, karena hal ini rawan untuk dihack pada saat ini.

Mudah-mudahan artikel ini membantu…

Sumber blog.rosihanari

Membuat form login, logout, dan register (Autentifikasi User di PHP)


Masalah autentifikasi user ini sering ditanyakan oleh orang kepada saya. Masalah ini pula yang sering banyak dijumpai kelemahannya sehingga hal ini menjadi sesuatu hal yang sangat krusial. Sekali autentifikasi ini bobol, maka dampaknya akan sangat berbahaya bagi suatu sistem.

Pada artikel ini akan dijelaskan perlunya autentifikasi user dalam suatu sistem, serta cara pembuatannya dengan PHP script.

Ngomong-ngomong… apa sih autentifikasi user ini? Autentifikasi user adalah suatu mekanisme untuk memastikan apakah suatu user itu berhak masuk ke dalam sistem atau bukan. Implementasinya adalah berupa login. Dalam hal ini user yang berhak mengakses akan diberikan nama user tertentu beserta password. Gampangannya… bila terdapat nama user dan password yang tidak terdaftar dalam daftar user, maka user tersebut tidak berhak mengakses. Saya kira tidak perlu dipanjanglebarkan masalah ini karena hampir semua orang tahu.

Pendaftaran User
  1. User mengisi form pendaftaran sebagai legal user (user mengisi username dan password).
  2. Sistem akan mengecek apakah username yang didaftarkan sudah ada yang memiliki atau belum.
  3. Jika sudah ada, user diminta mengisi kembali username yang lain beserta passwordnya. Sedangkan jika belum ada, data user ini akan disimpan dalam database, dengan password terenkripsi.
Proses Autentifikasi
  1. User yang akan mengakses sistem diminta memasukkan username dan password (asli)
  2. Sistem akan mencari password terenkripsi yang tersimpan dalam database berdasarkan username yang terdaftar
  3. Sistem akan mencocokkan antara password asli terenkripsi yang diisikan user melalui form login, dengan password terenkripsi yang tersimpan dalam database
  4. Jika password asli terenkripsi yang dikirim via form login ini sama dengan password terenkripsi yang ada dalam database, maka user tadi bisa masuk ke dalam sistem. Jika tidak sama, maka user tadi tidak berhak masuk ke sistem.
Proses autentifikasi tidak hanya sampai sini saja… Kadangkala user nakal ingin masuk ke sistem tanpa melalui proses autentifikasi terlebih dahulu atau melakukan by pass ke dalam sistem. Nah… hal ini juga berbahaya. Kita harus bisa mengantisipasi hal ini bila tidak ingin sistem yang dibangun diacak-acak oleh orang yang tidak berhak.

Dalam artikel ini akan dibahas bagaimana membuat autentifikasi user ini dengan script PHP, serta mengantisipasi user yang mem-by pass autentifikasi ini.

Pertama, kita siapkan tabel user terlebih dahulu.
CREATE TABLE user (
username varchar(20),
password varchar(32),
PRIMARY KEY (username)
)

Mengapa field username ini kita buat primary key, ya… karena username harus unik, tidak boleh ada username yang sama. Sedangkan password kita set tipe datanya varchar dengan panjang field 32. Mengapa 32? Ya… karena password yang akan disimpan di sini adalah terenkripsi. Untuk enkripsi nanti kita akan gunakan MD5() termodifikasi, seperti yang telah dijelaskan pada artikel saya tentang Tips membuat password dengan MD5 (). Nah… hasil md5() ini adalah karakter dengan panjang 32.

OK… langkah kedua kita siapkan form pendaftaran usernya.

Register.php

<form method="post" action="submit.php">
<table border="0">
<tr>
<td>Masukkan Username </td>
<td><input name="username" type="text"></td>
</tr>
<tr>
<td>Masukkan Password </td>
<td><input name="pass1" type="password"></td>
</tr>
<tr>
<td>Ulangi Password </td>
<td><input name="pass2" type="password"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Submit"></td>
</tr>
</table>
</form>

Perhatikan… pada form di atas terdapat dua isian untuk password. Mengapa tidak hanya satu isian saja? Dengan mengisi password lebih dari satu kali akan memastikan bahwa password yang dimasukkan adalah benar dari sisi ejaannya.

Selanjutnya kita buat script untuk pemrosesan registrasi user ini.

submit.php

<?php
$username = $_POST['username'];
$password1 = $_POST['pass1'];
$password2 = $_POST['pass2'];

// cek kesamaan password
if ($password1 == $password2)
{
mysql_connect("namahost", "dbuser", "dbpass");
mysql_select_db("dbname");

// perlu dibuat sebarang pengacak
$pengacak = "NDJS3289JSKS190JISJI";

// mengenkripsi password dengan md5() dan pengacak
$password1 = md5($pengacak . md5($password1) . $pengacak);

// menyimpan username dan password terenkripsi ke database
$query = "INSERT INTO user VALUES('$username', '$password1')";
$hasil = mysql_query($query);

// menampilkan status pendaftaran
if ($hasil) echo "User sudah berhasil terdaftar";
else echo "Username sudah ada yang memiliki";

}
else echo "Password yang dimasukkan tidak sama";

?>

Untuk proses pengenkripsian password seperti halnya dijelaskan pada artikel tentang Tips Membuat Password dengan MD5(), Anda boleh membuat pengacak yang lain, atau mengkombinasikan sendiri bentuknya, misalnya $password1 = md5($pengacak.md5($pengacak.$password1.$pengacak).$pengacak) atau yang lain.. It’s up to you, yang jelas jangan menggunakan $password1 = md5($password1);

Nah selanjutnya… misalkan kita buat skenario bahwa terdapat dua buah halaman (halaman 1 dan halaman 2) dalam sistem yang membutuhkan autentifikasi user sebelum masuk ke dalamnya.

OK… untuk autentifikasi, kita buat form loginnya.

login.php

<form method="post" action="loginsubmit.php">
<table border="0">
<tr>
<td>Masukkan Username </td>
<td><input name="username" type="text"></td>
</tr>
<tr>
<td>Masukkan Password </td>
<td><input name="pass" type="password"></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="Submit" value="Submit"></td>
</tr>
</table>
</form>

Jangan lupa buat pula script untuk mengolah loginnya

loginsubmit.php

<?php
// menjalankan session
session_start();

$username = $_POST['username'];
$password = $_POST['pass'];

mysql_connect("namahost", "dbuser", "dbpass");
mysql_select_db("dbname");

// mencari password terenkripsi berdasarkan username
$query = "SELECT * FROM user WHERE username = '$username'";
$hasil = mysql_query($query) or die("Error");
$data = mysql_fetch_array($hasil);

$pengacak = "NDJS3289JSKS190JISJI";

// cek kesesuaian password terenkripsi dari form login
// dengan password terenkripsi dari database
if (md5($pengacak.md5($password).$pengacak) == $data['password'])
{
// jika sesuai, maka buat session untuk username
$_SESSION['username'] = $username;

// menampilkan menu ke halaman akses
echo "<h2>Login sukses</h2>";
echo "<p><a href=\"hal1.php\">Menu 1</a> | <a href=\"hal2.php\">Menu 2</a></p>";
}
else echo "<h2>Login Gagal</h2>";

?>

Perhatikan… dalam cek kesesuaian password terenkripsi dari form dan dari database, harus menggunakan pengacak dan rule yang sama dengan proses mengenkripsi password sebelum disimpan ke database (lihat kembali script submit.php).

Selanjutnya, untuk mencegah by pass yang dilakukan user nakal ke dalam halaman 1 dan 2, maka kita perlu membuat script untuk menanggulangi hal ini.

cek.php

<?php

session_start();

// mengecek ada tidaknya session untuk username
if (!isset($_SESSION['username']))
{
echo "<h1>Anda belum login</h1>";
exit;
}

?>

Script di atas berguna untuk mengecek keberadaan session untuk username. Bila user tidak melakukan login, maka session username tidak pernah dibuat. Sehingga apabila user tidak melakukan login, akan muncul pesan ‘Anda belum login’. Perintah isset() digunakan untuk mengecek keberadaan suatu variabel (dalam hal ini variabel session untuk username). Perintah ini akan menghasilkan nilai TRUE jika variabel yang dicek ada, dan FALSE jika variabel tidak ada.

Nah.. script cek.php di atas harus disisipkan di setiap halaman yang sifatnya private atau membutuhkan autentifikasi user.

Misalkan isi halaman 1 dan 2 adalah sebagai berikut

hal1.php

<?php

include "cek.php";

echo "<h1>Ini Halaman 1</h1>";
echo "<p><a href=\"hal1.php\">Menu 1</a> | <a href=\"hal2.php\">Menu 2</a></p>";
echo "<p>Ini isi halaman 1. Ini isi halaman 1</p>";
echo "<p>Ini isi halaman 1. Ini isi halaman 1</p>";
echo "<p><a href=\"logout.php\">Logout</a></p>";

?>

hal2.php

<?php

include "cek.php";

echo "<h1>Ini Halaman 2</h1>";
echo "<p><a href=\"hal1.php\">Menu 1</a> | <a href=\"hal2.php\">Menu 2</a></p>";
echo "<p>Ini isi halaman 2. Ini isi halaman 2</p>";
echo "<p>Ini isi halaman 2. Ini isi halaman 2</p>";
echo "<p><a href=\"logout.php\">Logout</a></p>";

?>

Perhatikan… di setiap halaman private disisipkan script cek.php. Apakah harus diletakkan sebelum isi dari halaman? Ya… harus… sebelum menampilkan isi halaman, terlebih dahulu harus di cek apakah user yang akan mengakses sudah login atau belum. Jika belum… langsung muncul pesan belum login dan exit artinya isi halaman tidak ditampilkan di browser.

Oya… jangan lupa membuat script untuk logout. Konsep logout dalam autentifikasi adalah menghapus variabel session untuk username tadi.

logout.php

<?php

session_start();

// menghapus session username
unset($_SESSION['username']);

echo "<h1>Anda sudah logout</h1>";

?>

Aduh… panjang juga ya artikelnya. Capek nulisnya… but mudah-mudahan bermanfaat. See you in the next article…
Jika Anda ingin source code dari autentifikasi ini, silakan download di bawah ini. Free 100%

Download Source Code

Sumber blog.rosihanari