Hosting Unlimited Indonesia

Recent Comment

Navigation

Secure Login Menggunakan Bcrypt Di Php dan Mysql


Assalmualaikum Warahmatullahi Wabarakatu
Bismillahirrahmanirrahiim

Bcrypt adalah fungsi hashing password yang dirancang oleh Niels Provos dan David Mazières, berdasarkan cipher Blowfish, dan dipresentasikan di USENIX pada tahun 1999. Selain menggabungkan salt untuk melindungi terhadap serangan rainbow table, bcrypt adalah fungsi adaptif: dari waktu ke waktu, jumlah iterasi dapat ditingkatkan untuk membuatnya lebih lambat, sehingga tetap tahan terhadap serangan pencarian brute force bahkan dengan meningkatnya daya komputasi.

Fungsi bcrypt adalah algoritma hash password default untuk OpenBSD dan sistem lainnya termasuk beberapa distribusi Linux seperti SUSE Linux. Awalan "$ 2a $" atau "$ 2b $" (atau "$ 2y $") dalam string hash dalam file kata kunci bayangan menunjukkan bahwa string hash adalah hash bcrypt dalam format kriptografi modular. Sisa dari string hash mencakup parameter biaya, salt 128 bit (basis-64 yang dikodekan sebagai 22 karakter), dan 184 bit dari nilai hash yang dihasilkan (basis-64 dikodekan sebagai 31 karakter). Parameter biaya menentukan jumlah iterasi ekspansi kunci sebagai kekuatan dua, yang merupakan masukan ke algoritma kriptografi (wikipedia).


Sebelum menggunakan password Bcrypt perlu diperhatikan versi dari php yang sobat gunakan, php yang support bcrypt adalah php versi 5.3 keatas saat artikel ini di tulis versi php 7.1, jika versi php sobat sesuai dengan yang saya sebutkan diatas maka ikutilah langkah-langkah dibawah ini untuk membuat secure login di php dan mysql menggunakan bcrypt

Langkah Pertama
Download file yang dibutuhkan disini

Langkah Kedua
Buatlah database dengan nama terserah sobat, kemudian buat tabel seperti struktur tabel dibawah ini
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES ('1', 'admin', 'admin@gmail.com', '$2a$16$i8wE2oa9mpRhhFVlWjiXLeZreahhi1OS6j7wVFMm7nsg/5Pf5UybG');
INSERT INTO `users` VALUES ('2', 'users', 'users@gmail.com', '$2a$16$CDGvzpPEBOB/n3tnyZs5f.y1W1NQsQ93gE9tIEk6wzB3Wu3GA7Hi6');

Langkah Ketiga
Buatlah folder dengan nama securelogin di root folder local web server milik sobat, nama foldernya htdocs bagi yang menggunakan xampp, dan extractlah hasil dowload sobat kedalam folder yang telah sobat buat

Langkah Keempat
Buatlah file dengan nama index.php, kemudian ketiklah kode dibawah ini lalu save
<?php 
session_start();
if (!empty($_SESSION['username'])):
 header('location:home.php');
endif;
?>
<!DOCTYPE html>
<html lang="">
 <head>
   <!-- Required meta tags always come first -->
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Secure Login PHP</title>

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="css/bootstrap.css">
  <style>
   #wrapper{
    position: relative;
    display: block;
    margin: auto;
    background:#f5f5f5;
    width:500px;
    height: auto;
    padding:30px;
    margin-top:5%;
   }
  </style>
 </head>
 <body>
  
  <div id="wrapper">
   <form action="process.php" method="post" accept-charset="utf-8">

    <div class="form-group">
     <label for="username">Username</label>
     <input type="text" class="form-control" name="username" placeholder="Username or Email">
    </div>

    <div class="form-group">
     <label for="password">Password</label>
     <input type="text" class="form-control" name="password" placeholder="Password">
    </div>

    <div class="form-group">
     <input type="reset" value="Cancel" class="btn btn-danger">
     <input type="submit" value="Login" class="btn btn-primary">
    </div>

   </form>
   <a href="register.php">Register</a>
  </div>

  <!-- jQuery -->
  <script src="js/jquery.min.js"></script>
  <!-- Bootstrap JavaScript -->
  <script src="js/bootstrap.min.js"></script>
 </body>
</html>

Langkah Kelima
Buatlah file dengan nama koneksi.php, kemudian ketiklah kode dibawah ini lalu save
<?php
 $host="localhost";
 $user="root";
 $pass="";
 $database="dbphp7";
 $mysqli=new mysqli($host,$user,$pass,$database);
 if (mysqli_connect_errno()) {
   trigger_error('Koneksi ke database gagal: '  . mysqli_connect_error(), E_USER_ERROR); 
 }
?>

Langkah Keenam
Buatlah file dengan nama create.php, kemudian ketiklah kode dibawah ini lalu save
<?php
include "Bcrypt.php";
include "koneksi.php";

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

$bcrypt = new Bcrypt(16);
$hash = $bcrypt->hash($password);

$mysqli->query("INSERT INTO users (username,email,password) VALUES ('$username','$email','$hash')");

header('location:index.php');

/*
Untuk cek password hash
//$verify = $bcrypt->verify($password, $hash);
Untuk script update data sesuaikan dengan kondisi yang dibutuhkan
$mysqli->query("UPDATE users SET username = '$username',email = '$email',password='$hash' WHERE id = '$id'");
*/
?>

Langkah Ketujuh
Buatlah file dengan nama prosess.php, kemudian ketiklah kode dibawah ini lalu save
<?php
include "Bcrypt.php";
include "koneksi.php";
$username = $_POST['username'];
$password = $_POST['password'];

function resolve_login($username, $password) 
{
 include "koneksi.php";
 $bcrypt = new Bcrypt(16);
 $data = $mysqli->query("SELECT password FROM users WHERE username='$username' or email='$username'  ");
 $result=mysqli_fetch_array($data);
 $hash =$result['password'];
 return $bcrypt->verify($password, $hash);
}

if(resolve_login($username, $password)!=false):
 $login = $mysqli->query("SELECT * FROM users WHERE username='$username' or email='$username' ");
 $find=mysqli_num_rows($login);
 $result=mysqli_fetch_array($login);
 if ($find > 0):
   session_start();
   $_SESSION['username'];
   $_SESSION['email'];
   $_SESSION['username'] = $result['username'];
   $_SESSION['email']  = $result['email'];
   header('location:home.php');
 endif;
else:
 header('location:error.php');
endif;
?>

Penjelasan : Ketika pertama kali kita login dengan menginputkan username dan password, maka pertama-tama program akan mengambil password bcrypt yang ada di database berdasarkan username yang kita inputkan, kemudian password yang kita inputkan akan di cek sesuai atau tidak dengan enkripsi hash password  yang ada di database jika tidak sesuai maka akan ditampilkan halaman error.php jika sesuai maka akan diarahkan kehalaman home.php

Langkah Kedelepan
Buatlah file dengan nama logout.php, kemudian ketiklah kode dibawah ini lalu save
<?php
 session_start();
 session_destroy();
 header('location:index.php');
?>

Langkah Kesembilan
Buatlah file dengan nama Bcrypt.php, kemudian ketiklah kode dibawah ini lalu save
<?php
class Bcrypt
{
  private $rounds;

  public function __construct($rounds = 12)
  {
    if (CRYPT_BLOWFISH != 1) {
      throw new Exception("bcrypt not supported in this installation. See http://php.net/crypt");
    }

    $this->rounds = $rounds;
  }

  public function hash($input)
  {
    $hash = crypt($input, $this->getSalt());

    if (strlen($hash) > 13)
      return $hash;

    return false;
  }

  public function verify($input, $existingHash)
  {
    $hash = crypt($input, $existingHash);

    return $hash === $existingHash;
  }

  private function getSalt()
  {
    $salt = sprintf('$2a$%02d$', $this->rounds);

    $bytes = $this->getRandomBytes(16);

    $salt .= $this->encodeBytes($bytes);

    return $salt;
  }

  private $randomState;
  private function getRandomBytes($count)
  {
    $bytes = '';

    if (function_exists('openssl_random_pseudo_bytes') &&
        (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) { // OpenSSL is slow on Windows
      $bytes = openssl_random_pseudo_bytes($count);
    }

    if ($bytes === '' && is_readable('/dev/urandom') &&
       ($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) {
      $bytes = fread($hRand, $count);
      fclose($hRand);
    }

    if (strlen($bytes) < $count) {
      $bytes = '';

      if ($this->randomState === null) {
        $this->randomState = microtime();
        if (function_exists('getmypid')) {
          $this->randomState .= getmypid();
        }
      }

      for ($i = 0; $i < $count; $i += 16) {
        $this->randomState = md5(microtime() . $this->randomState);

        if (PHP_VERSION >= '5') {
          $bytes .= md5($this->randomState, true);
        } else {
          $bytes .= pack('H*', md5($this->randomState));
        }
      }

      $bytes = substr($bytes, 0, $count);
    }

    return $bytes;
  }

  private function encodeBytes($input)
  {
    // The following is code from the PHP Password Hashing Framework
    $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

    $output = '';
    $i = 0;
    do {
      $c1 = ord($input[$i++]);
      $output .= $itoa64[$c1 >> 2];
      $c1 = ($c1 & 0x03) << 4;
      if ($i >= 16) {
        $output .= $itoa64[$c1];
        break;
      }

      $c2 = ord($input[$i++]);
      $c1 |= $c2 >> 4;
      $output .= $itoa64[$c1];
      $c1 = ($c2 & 0x0f) << 2;

      $c2 = ord($input[$i++]);
      $c1 |= $c2 >> 6;
      $output .= $itoa64[$c1];
      $output .= $itoa64[$c2 & 0x3f];
    } while (true);

    return $output;
  }
}

Langkah Kesepuluh
Buatlah file dengan nama register.php, kemudian ketiklah kode dibawah ini lalu save
<?php 
session_start();
if (!empty($_SESSION['username'])):
 header('location:home.php');
endif;
?>
<!DOCTYPE html>
<html lang="">
 <head>
   <!-- Required meta tags always come first -->
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Secure Login PHP</title>

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="css/bootstrap.css">
  <style>
   #wrapper{
    position: relative;
    display: block;
    margin: auto;
    background:#f5f5f5;
    width:500px;
    height: auto;
    padding:30px;
    margin-top:5%;
   }
  </style>
 </head>
 <body>
  
  <div id="wrapper">
   <form action="create.php" method="post" accept-charset="utf-8">

    <div class="form-group">
     <label for="username">Username</label>
     <input type="text" class="form-control" name="username" placeholder="Username">
    </div>

    <div class="form-group">
     <label for="Email">Email</label>
     <input type="email" class="form-control" name="email" placeholder="Email">
    </div>

    <div class="form-group">
     <label for="password">Password</label>
     <input type="text" class="form-control" name="password" placeholder="Password Min 6 Characters">
    </div>

    <div class="form-group">
     <input type="reset" value="Cancel" class="btn btn-danger">
     <input type="submit" value="Register" class="btn btn-primary">
    </div>

   </form>
  </div>

  <!-- jQuery -->
  <script src="js/jquery.min.js"></script>
  <!-- Bootstrap JavaScript -->
  <script src="js/bootstrap.min.js"></script>
 </body>
</html>

Langkah Kesebelas
Buatlah file dngan nama error.php, kemudian ketiklah kode dibawah ini lalu save
<!DOCTYPE html>
<html lang="">
 <head>
   <!-- Required meta tags always come first -->
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Secure Login PHP</title>

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="css/bootstrap.css">
  <style>
   #wrapper{
    position: relative;
    display: block;
    margin: auto;
    background:#f5f5f5;
    width:500px;
    height: auto;
    padding:30px;
    margin-top:5%;
   }
   #wrapper h3{
    margin-top:0px;
   }
  </style>
 </head>
 <body>
  
  <div id="wrapper">
   <div class="alert alert-warning" role="alert">
       <strong>Warning!</strong> Error!
   </div>
   <a href="index.php" class="btn btn-primary">Go Back!</a>
  </div>

  <!-- jQuery -->
  <script src="js/jquery.min.js"></script>
  <!-- Bootstrap JavaScript -->
  <script src="js/bootstrap.min.js"></script>
 </body>
</html>

Langkah Keduabelas
Jalankanlah atau eksekusi script yang telah sobat ketik, jika berhasil akan terlihat hasilnya seperti gambar-gambar dibawah ini









Sampai disini dulu tutorial dari saya , Semoga tutorial ini bermanfaat bagi sobat, atas segala kekuranganya mohon dimaafkan dan di beri, untuk download source dan demo dari code diatas bisa klik link dibawah ini.

Share
Hosting Unlimited Indonesia
Next
This is the most recent post.
Previous
Older Post

agus ribudi

Programmer, Web Developer, Android Developer and Blogger

Post A Comment:

0 comments:

Rekomendasi Untuk Anda × +