Bcrypt ဆိုတာ

အခုနောက်ပိုင်း Password တွေကို MD5 hash အစား Bcrypt ကို အသုံးပြုလာပါပြီ။ MD5 ကတော့ fast hash ပေါ့။ ချက်ချင်း hash value ထွက်လာတယ်။​ Bcrypt ကတော့ slow hash ပါ။ သူ့မှာ rounding ပါတယ်။ fast hash တွေက rainbow table attack နဲ့ ဖြစ်နိုင်သလို CPU power ကောင်းကောင်းနဲ့ တပြိုင်တည်း hash တွေ အများကြီး ထုတ်ပြီး စစ်နိုင်ပါတယ်။ Bcrypt ကတော့ တမင်နှေးအောင် လုပ်ထားတာပါ။ MD 5 က Collision ဖြစ်နိုင်ခြေလည်း ရှိပါတယ်။ မတူညီသည့် value က တူညီတည့် hash ထုတ်ပေးနိုင်ခြေပါ။

ဒါကြောင့် နောက်ပိုင်းမှာ ကျွန်တော်တို့ တွေဟာ bcrypt ကို ပြောင်းသုံးလာတာပါ။

Bcrypt format က

$2$[cost]$[22 character salt][31 character hash]

ဆိုပြီး ရှိပါတယ်။


$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW

မှာ

  • 2a = algorithm
  • 12 = input cost (212 , 4096 round)
  • R9h/cIPz0gi.URNNX3kh2O = salt
  • PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW = hash

cost 12 ဆိုတာ 4096 round hashing လုပ်မယ် လို့ ပြောတာပါ။​ cost များလေလေ hash လုပ်ဖို့ အချိန် ကြာလေလေပဲ။ ပုံမှန် ၁၀ ကနေ ၁၃ ကြားပဲ အခုအချိန် မှာ အသုံးပြုပါတယ်။​ CPU performance ကောင်းလာလေလေ cost ကို တိုးသွားဖို့ လိုလေလေပါပဲ။

Algorithm က

  • $1$ = MD5 base
  • $2$ = Blowfish-base , 2a original , 2x,2y (June 2011) bugs  but nobody. 2b (Feb 2014) bugs in OpenBSD
  • $sha1$ = SHA-1 base
  • $5$ = SHA-256 base
  • $6$= SHA-512 base

စတာတွေ ရှိပါတယ်။ 2a ကတော့ original ပါ။ နောက်ပိုင်း PHP မှာ security issue အကြောင့် 2x,2y version ကို အသုံးပြုပါတယ်။ နောက်ပိုင်း openBSD က security issue ကြောင့် 2b ကို ပြောင်းသုံးကြတယ်။

ဒါကြောင့် မူရင်း value ကနေ hash ပြန်ထုတ်ဖို့ အတွက် Algorithm ရှိမယ်။​ round ရှိမယ်။​ Salt ရှိတယ် ဆိုရင် hash ကို ပြန်ထုတ်လို့ရပါပြီ။

<?php
// Password to be hashed
$password = "yourPassword123";

$options = ['cost' => 12]; // Default cost is 10

// Hash the password using bcrypt
$hashedPassword = password_hash($password, PASSWORD_BCRYPT,$options);

// Output the hashed password
echo "Hashed Password: " . $hashedPassword . "\n";

// Verifying the password against the hash
$inputPassword = "yourPassword123";
if (password_verify($inputPassword, $hashedPassword)) {
    echo "Password is valid!";
} else {
    echo "Invalid password.";
}
?>

//Hashed Password: $2y$12$43MKwVRtu1CgY3/svuHtM.8gtUYOe.w5CghxDVD8C9pgMjgj5Mc1q
//Password is valid!

Node JS ဆိုရင်တော့

npm install bcrypt

ကို အရင် သွင်းထားဖို့ လိုပါတယ်။

const bcrypt = require('bcrypt');

async function hashAndVerifyPassword() {
  try {
    const password = 'yourPassword123';
    const saltRounds = 10;

    // Hashing the password
    const hash = await bcrypt.hash(password, saltRounds);
    console.log('Hashed Password:', hash);

    // Verifying the password
    const isValid = await bcrypt.compare(password, hash);
    console.log(isValid ? 'Password is valid!' : 'Invalid password.');
  } catch (err) {
    console.error('Error:', err);
  }
}

hashAndVerifyPassword();

//Hashed Password: $2b$10$2T5pMHAxGg0242esZqdLr.avo0iCUsBsW7nm3jNl4YESr.8kdEN0S

//Password is valid!