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 වගුවෙන් අක්ෂරය
    }
    
    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

ඔබේ ප්‍රවේශ අනුමත කිරීම සහ ලියාපදිංචි කිරීම නව ඉගෙනගත් ක්‍රියාකාරීත්වයන් වෙත පරිවර්තනය කරන්න.