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
1234567891011121314CREATE 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960<?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
12345678910<?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
1234567891011121314151617181920212223<?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
1234567891011121314151617181920212223242526272829303132<?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
12345<?php
session_start();
session_destroy();
header('location:index.php');
?>
Langkah Kesembilan
Buatlah file dengan nama Bcrypt.php, kemudian ketiklah kode dibawah ini lalu save
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114<?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
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364<?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
123456789101112131415161718192021222324252627282930313233343536373839404142<!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.
0 comments:
Post a Comment