ფუნქცია password_hash
სინამდვილეში ფუნქცია md5 და პაროლის
მარილდენა მისი გამოყენებით მოძველებულად ითვლება.
ჩვენ მას ვსწავლობდით იმისთვის, რომ თქვენ გაგეგოთ შემდგომი
მასალა, და ასევე იმიტომ, რომ თქვენ შეიძლება ამას შეხვდეთ
სხვა პროექტებთან მუშაობისას.
არსებობს უფრო სრულყოფილი გზა მარილდებული პაროლის მისაღებად.
ამისთვის გამოიყენება ფუნქცია
password_hash. პირველ პარამეტრად ის
იღებს სტრიქონს, ხოლო მეორედ - დაშიფვრის ალგორითმს
(ამაზე შემდგომ), და აბრუნებს ამ სტრიქონის ჰეშს
მარილთან ერთად.
სცადეთ რამდენჯერმე გაუშვათ ეს კოდი:
<?php
echo password_hash('12345', PASSWORD_DEFAULT);
?>
თქვენ ყოველ ჯერზე მიიღებთ განსხვავებულ შედეგს და ამ შედეგში პირველი ნაწილი იქნება მარილი, ხოლო მეორე ნაწილი - მარილდებული პაროლი.
დავუშვათ, გვაქვს ჰეში, მიღებული ფუნქციიდან
password_hash და რაღაც პაროლი. რათა
შევამოწმოთ, ეს არის ამ პაროლის ჰეში თუ არა,
უნდა გამოვიყენოთ ფუნქცია password_verify
- პირველ პარამეტრად ის იღებს პაროლს,
ხოლო მეორედ - ჰეშს, და აბრუნებს true
ან false.
შევხედოთ მაგალითს:
<?php
$password = '12345'; // პაროლი
$hash = '$2y$10$xoYFX1mFPxBSyxaRe3iIRutxkIWhxGShzEhjYUVd3qpCUKfJE1k7a'; // ჰეში
if (password_verify($password, $hash)) {
// ჰეში ამ პაროლისგან
} else {
// ჰეში არაა ამ პაროლისგან
}
?>
რას გვაძლევს ეს პრაქტიკაში: ჩვენ შეგვიძლია არ შევქმნათ ბაზაში ცალკე ველი მარილის შესანახად, არ ვიღაზათ მარილის გენერირებით - PHP ყველაფერს გააკეთებს ჩვენთვის!
ანუ გამოვა, რომ მონაცემთა ბაზაში ველში
password ჩვენ ვინახავთ მარილდებულ
პაროლს მის მარილთან ერთად. ამ შემთხვევაში ჰეშირებულ
პაროლს ექნება მეტი სიგრძე. ამიტომ
მონაცემთა ბაზაში ჩვენ უნდა შევასწოროთ ზომა
პაროლის ველის და დავაყენოთ ის 60
სიმბოლოზე.
ახლა მოდით შევასწოროთ რეგისტრაციის კოდი. აი, რა გვაქვს ამჟამად:
<?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-ის გამოყენებით ჩვენ ამას შევამცირებთ:
<?php
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
?>
ანალოგიურად შესწორდება ავტორიზაციის კოდი:
<?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 {
// ასეთი ლოგინის მომხმარებელი არ არის, გამოვიტანოთ შეტყობინება
}
?>
გადააკეთეთ თქვენი ავტორიზაცია და რეგისტრაცია ახალ შესწავლილ ფუნქციებზე.