फ़ंक्शन 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 {
// इस लॉगिन वाला कोई यूज़र नहीं है, संदेश दिखाएं
}
?>
अपने ऑथेंटिकेशन और रजिस्ट्रेशन को नए सीखे गए फ़ंक्शन पर बदलें।