Saturday, June 30, 2012

Hashing အေၾကာင္း

Hashing အေၾကာင္း
hashing လုပ္တယ္ဆိုတာ data ေတြကို အပိုင္းပိုင္းေလးေတြခြဲထုတ္လိုက္တာပါပဲ႔ String or Integer အျဖစ္ေျပာင္းလဲသြားပါတယ္
web developer ေတြအသံုးမ်ားတဲ႔ function တစ္ခုကေတာ႔ md5 ဆိုတာပါ။
မတူညီတဲ႔ languages and systems ေတြမွာအေတာ္ေလးအသံုးမ်ားတာကိုလည္းေတြ႔ရပါတယ္


$name="cyberoot";
$hash= md5($name);
echo $hash; //691da7f884a723202cc16371b69b678c

md5() function သံုးျပီးလုပ္တဲ႔ data ေတြဟာဆိုရင္ အျမဲတမ္း 32 character string အျဖစ္ေျပာင္းလဲသြားပါတယ္
ဒါေပမယ္႔ ဒါက hexadecimal character(0 - F) ေတြသာ ပါ၀င္တာပါ 128-bit (16byte) ကိုလည္းကိုယ္စားျပဳပါတယ္ တူတူပဲ႔ေပါ႔ဗ်ာ

hashing ကိုဘယ္မွာသံုးလဲဆိုရင္ေတာ႔
user registering လုပ္တဲ႔ password field ေတြမွာသံုးပါတယ္
ျပီးေတာ႔ password insert လုပ္တဲ႔အခါ password ကို md5 အျဖစ္ေျပာင္းျပီး သံုးၾကတာမ်ားပါတယ္
ဒါေၾကာင္႔ ကၽြန္ေတာ္တို႔ admin password ေတြကိုရွာတဲ႔အခါ password ကို hashing အျဖစ္ေတြ႕ရပါတယ္
ဒါက မလံုျခံဳပါဘူး ဘာေၾကာင္႔လဲဆိုေတာ႔ ကၽြန္ေတာ္တို႔ ျပန္ျပီး decrypt ျပန္လုပ္လို႔ရလို႔ပါပဲ႔

အရင္တုန္းက Crc32 ဆိုတဲ႔ hash script ကိုလည္းေတာ္ေတာ္ေလးသံုးခဲ႔ပါေသးတယ္
သူကေတာ႔ ေနာက္ပိုင္းလူသိနည္းလာတယ္ နည္းနည္းလည္းၾကာျပီးဆိုေတာ႔

ေလ႔လာၾကည္႔ရေအာင္

echo crc32('cyberoot_hash');
// output is 4ab4649b


အခုဆိုရင္ ကၽြန္ေတာ္ database ေလးခိုးခံထိတယ္ဆိုပါစို႔ database မွာေစာေစာတုန္းက hashing လုပ္ထားတဲ႔ value ေလးရွိတယ္ဗ်ာ
အဲဒီ hash ေလး 4ab4649b ကို cyberoot_hash လို႔ေျပာင္းလို႔မရနိုင္ပါဘူးဒါေပမယ္႔ အျခား password အျဖစ္ နဲ႔ တူညီတဲ႔ hash value ကိုေျပာင္းလဲနိုင္ပါတယ္
decrypt ျပန္လုပ္တဲ႔ သေဘာပါပဲ႔ ေအာက္မွာပါ

set_time_limit(0);
$i=0;
while(true){
if(crc32(base64_encode($i))==4ab4649b){
echo base64_encode($i);
exit;
}
$i++;
}

အေပၚက code ကို run လိုက္တဲ႔အခါမွာေတာ႔ hash ကို string အျဖစ္ျပန္လည္ေျပာင္းလဲေပးမွာျဖစ္ပါတယ္
ဒါဆိုရင္ေစာေစာက ကၽြန္ေတာ္တို႔ သံုးခဲ႔တဲ႔ cyberoot_hash ဆိုတဲ႔ အစား decrypt လုပ္တဲ႔ string ကိုျပန္ျပီးအသံုးျပဳနိုင္ပါတယ္
ဒါက login page ထဲကို အဆင္ေျပေအာင္ ျပန္ျပီး၀င္ေရာက္နိုင္ပါတယ္
ကၽြန္ေတာ္တို႔ script ကို run လိုက္တဲ႔အခါ မွာ output အေနနဲ႔ BZIxMjY5OTAwCk== လို႔ ထုတ္ေပးတယ္ဆိုပါစို႔

ဒီလိုပါ
echo crc32('cyberoot_hash');
//outputs :4ab4649b
echo crc32('BZIxMjY5OTAwCk==');
//outputs :4ab4649b


အေျဖက တူတူပဲ႔ထြက္ပါတယ္
စိတ္ပူသြားျပီလား သင္႔ရဲ႕ security ေလးကို ဟီး ဆက္ရွင္းမယ္ဗ်ာ ေၾကာက္နဲ႔ (အပူရွိရင္အေအးရွိရမယ္တြ)
ဒီလိုနည္းလည္းကိုကာကြယ္ဖို႔ နည္းလမ္းရွိပါတယ္
md5() function ကိုသံုးတာလည္းေကာင္းပါတယ္ ဒါက 128 bit hashes အျဖစ္ generate လုပ္ေပးပါတယ္
ေနာက္ျပီး sha1() function က ပိုျပီးေတာ႔ ေကာင္းပါတယ္ သူကေတာ႔ 160 -bit hash value ပါ
md5 ထက္ sha1 က ပိုျပီး ရွည္ပါတယ္ ဒါေပမယ႔္ ဒီလိုရိုးရိုး နည္းေတြကလည္း စိတ္မခ်ရေသးပါဘူး
Rainbow Table သံုးျပီးတိုက္ခိုက္ရင္ ထိမွာေသခ်ာပါတယ္ ဒီေတာ႔ ပိုေကာင္းေအာင္ဘယ္လိုလုပ္္မလဲဆိုတာကို စဥ္းစားရပါမယ္

ေအာက္ကေရးထားတာကိုၾကည္႔႔ပါ

$password = "easypassword";      //passowrd ကို ပံုမွန္အတိုင္းပဲ႔ေပးထားတာပါ character အျဖစ္နဲ႔ေပါ႔
echo sha1($password);  //output is : 6c94d3b42518febd4ad747801d50a8972022f956 ျပန္ျပီး sh1 () function သံုးျပီး hashing လုပ္ထားတာပါ

ဒီအထိကၽြန္ေတာ္တို႔ decrypt လုပ္နိုင္ပါတယ္
အဲလိုမ်ိဳးမလုပ္နိုင္ေအာင္ ကၽြန္ေတာ္က variable တစ္ခုသတ္မွတ္ျပီး string ကို assign လုပ္လိုက္ပါတယ္
$salt = "f#@V)Hu^%Hg15fds*"; //ဒါက ကၽြန္ေတာ္ သတ္မွတ္ထားတဲ႔ string တစ္ခုပါ
ဒါကို sh1() funtion သံုးျပီး ေစာေစာတုန္းက ပံုမွန္ေရးထားတဲ႔ $password နဲ႔ ေပါင္းလိုက္ေတာ႔ decrpty လုပ္လို႔မရေတာ႔ပါဘူး ဟီး ဒါေပမယ္႔ security ဆိုတာ 99% ပဲ႔
echo sha1($salt . $password); // cd56a16759623378628c0d9336af69b74d9d71a5

ဒီေတာ႔ code က ဒီလိုျဖစ္သြားမယ္
$salt = "f#@V)Hu^%Hg15fds*";
echo sha1($salt . $password); // cd56a16759623378628c0d9336af69b74d9d71a5 အဲလိုမ်ိဳး hashing ကို decrypt လုပ္လို႔မရေတာ႔ပါဘူး

ဘာေၾကာင္႔လဲဆိုေတာ႔ Rainbow Table ကေတာ႔ md5 & sha1 အျခားနည္းေတြအမ်ားၾကီးကို decrypt လုပ္နိုင္စြမ္းရွိပါတယ္
ကၽြန္ေတာ္တို႔က string နဲ႔ hash နဲ႔ေပါင္းလိုက္ေတာ႔ ပိုျပီးလံုျခံဳသြားပါတယ္

အၾကံေပးခ်င္တာတစ္ခုက သင္႔ website ရဲ႕ admin or member ေတြထည္႔တဲ႔အခါ database ကိုေအာက္မွာေရးထားတဲ႔ ပံုစံမ်ိဳးထည္႔ေပးရင္ပိုျပီးေတာ႔စိတ္ခ်ရပါတယ္
$hash = sha1($user_id . $password);  သိုမဟုတ္ $hash = md5($user_id . $password);  
$hash = md5($_POST['$user_id . $password']);

ဒါဆို ok မယ္ထင္ပါတယ္ဗ်ာ
ကၽြန္ေတာ္လည္းအမ်ားၾကီးမသိပါဘူး ေနာက္ထပ္နည္းလမ္းေတြလည္းအမ်ားၾကီးရွိပါတယ္
သိသေလာက္ေလးမွ်ေ၀ေပးလိုက္တာပါ အမွာပါရင္လည္း ၀င္ေရာက္ေဆြးေႏြးေပးပါလို႔ဖိတ္ေခၚပါတယ္
Written by cyberoot
Ref:Burak Guzel

No comments:

Post a Comment

Thanks for your comments
Welcome from cyberoot