password_hash လုပ်ဆောင်ချက်

တကယ်တော့ md5 လုပ်ဆောင်ချက်နှင့် ၎င်းကို အသုံးပြု၍ စကားဝှက်ကို ဆားထည့်ခြင်းသည် ခေတ်နောက်ကျသွားပြီဟု ယူဆပါသည်။ နောက်ထပ်သင်ယူမှုအတွက် သင်နားလည်စေရန်နှင့် အခြားသူများ၏ ပရောဂျက်များတွင် သင်တွေ့ရှိနိုင်သောကြောင့် ၎င်းကို ကျွန်ုပ်တို့လေ့လာခဲ့ကြသည်။

ဆားထည့်ထားသော စကားဝှက်ကို ရရှိရန် ပိုမိုကောင်းမွန်သော နည်းလမ်းရှိပါသည်။ ၎င်းအတွက် password_hash လုပ်ဆောင်ချက်ကို အသုံးပြုပါသည်။ ၎င်း၏ ပထမပါရာမီတာအနေဖြင့် စတင်း၏၊ ဒုတိယပါရာမီတာအနေဖြင့် (နောက်မှဖော်ပြမည်) စာဝှက်ဖော်ခြင်းအယ်ဂိုရီသမ်ကို လက်ခံပြီး၊ ထိုစတင်းနှင့် ဆားကို အတူတကွ ပြန်ပေးသည်။

ဤကုဒ်ကို အကြိမ်ကြိမ်လည်ပတ်ကြည့်ပါ။

html<?php
  echo password_hash('12345', PASSWORD_DEFAULT);
?>

သင်သည် အကြိမ်တိုင်း ရလဒ်အမျိုးမျိုးကို ရရှိပြီး ထိုရလဒ်၏ ပထမအပိုင်းသည် ဆားဖြစ်ကာ၊ ဒုတိယအပိုင်းသည် ဆားထည့်ထားသော စကားဝှက်ဖြစ်ပါသည်။

ကျွန်ုပ်တို့၌ password_hash လုပ်ဆောင်ချက်မှ ရရှိသော ဟက်ရှ်နှင့် စကားဝှက်တစ်ခုခု ရှိသည်ဆိုပါစို့။ ၎င်းဟက်ရှ်သည် ထိုစကားဝှက်၏ ဟက်ရှ်ဟုတ်မဟုတ် စစ်ဆေးရန် password_verify လုပ်ဆောင်ချက်ကို အသုံးပြုရပါမည်။ ၎င်းသည် ပထမပါရာမီတာအနေဖြင့် စကားဝှက်ကို လက်ခံပြီး၊ ဒုတိယပါရာမီတာအနေဖြင့် ဟက်ရှ်ကို လက်ခံကာ true သို့မဟုတ် false ကို ပြန်ပေးပါသည်။

ဥပမာတစ်ခုဖြင့် ကြည့်ကြရအောင်။

html<?php
  $password = '12345'; // စကားဝှက်
  $hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // ဟက်ရှ်
  
  if (password_verify($password, $hash)) {
    // ဤစကားဝှက်၏ ဟက်ရှ်
  } else {
    // ဤစကားဝှက်မှ မဟုတ်သော ဟက်ရှ်
  }
?>

၎င်းက လက်တွေ့တွင် ကျွန်ုပ်တို့အား ဘာပေးသနည်း။ ဒေတာဘေ့စ်တွင် ဆားသိမ်းဆည်းရန် သီးခြားကွက်လပ်ကို ဖန်တီးရန်မလို၊ ထိုဆားကို ထုတ်လုပ်ခြင်းနှင့် ပတ်သက်၍ စိတ်ပူစရာမလို - PHP က အားလုံးကို ကျွန်ုပ်တို့အတွက် လုပ်ပေးပါလိမ့်မည်။

ဆိုလိုသည်မှာ ဒေတာဘေ့စ်ရှိ password ကွက်လပ်တွင် ဆားနှင့်အတူ ဆားထည့်ထားသော စကားဝှက်ကို သိမ်းဆည်းထားမည်ဖြစ်သည်။ ထို့အပြင် ဟက်ရှ်ရိုက်ထားသော စကားဝှက်သည် အရှည်ပိုရှိပါလိမ့်မည်။ ထို့ကြောင့် ဒေတာဘေ့စ်တွင် စကားဝှက်ကွက်လပ်၏ အရွယ်အစားကို ပြင်ဆင်ပြီး 60 စာလုံးအထိ သတ်မှတ်ရပါမည်။

ယခု မှတ်ပုံတင်ခြင်း ကုဒ်ကို ပြင်ဆင်ကြရအောင်။ လက်ရှိတွင် ရှိနေသည်မှာ ဤအတိုင်းဖြစ်သည်။

html<?php
  function generateSalt()
  {
    $salt = '';
    $saltLength = 8; // ဆား၏ အရှည်
    
    for($i = 0; $i < $saltLength; $i++) {
      $salt .= chr(mt_rand(33, 126)); // ASCII-table မှ စာလုံး
    }
    
    return $salt;
  }
  
  $salt = generateSalt(); //  ဆား
  $password = md5($salt . $_POST['password']); // စကားဝှက်ကို ဆားထည့်ထားသော ဟက်ရှ်အဖြစ် ပြောင်းလဲပါ
?>

password_hash ကို အသုံးပြု၍ ကျွန်ုပ်တို့သည် ဤအတိုင်း အတိုချုံးနိုင်သည်။

html<?php
  $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>

အလားတူပင် အတည်ပြုခြင်း ကုဒ်ကို ပြင်ဆင်ပါမည်။

html<?php
  $login = $_POST['login'];
  
  $query = "SELECT * FROM users WHERE login='$login'"; // လော့ဂ်အင်အမည်ဖြင့် ယူဇာကို ရယူပါ
  $res = mysqli_query($link, $query);
  $user = mysqli_fetch_assoc($res);
  
  if (!empty($user)) {
    $hash = $user['password']; // ဒေတာဘေ့စ်မှ ဆားထည့်ထားသော စကားဝှက်
    
    // ဒေတာဘေ့စ်မှ ဟက်ရှ်နှင့် ရိုက်ထည့်ထားသော စကားဝှက် ကိုက်ညီမှုကို စစ်ဆေးပါ
    if (password_verify($_POST['password'], $hash)) {
      // အားလုံးအဆင်ပြေ၊ အတည်ပြု...
    } else {
      // စကားဝှက် မကိုက်ညီ၊ မက်ဆေ့ဂျ်ပြပါ
    }
  } else {
    // ထိုလော့ဂ်အင်အမည်ဖြင့် ယူဇာမရှိ၊ မက်ဆေ့ဂျ်ပြပါ
  }
?>
Задание 1

သင်၏ အတည်ပြုခြင်းနှင့် မှတ်ပုံတင်ခြင်းကို လေ့လာထားသော အသစ်များဖြစ်သည့် လုပ်ဆောင်ချက်များသို့ ပြောင်းလဲပါ။