အခုနောက်ပိုင်း 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!