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-աղյուսակից
}
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 {
// նման լոգինով օգտատեր չկա, ցույց կտանք հաղորդագրություն
}
?>
Վերափոխեք ձեր տեղի ունեցողը և գրանցումը նոր ուսումնասիրված ֆունկցիաների վրա։