password_hash ফাংশন
আসলে md5 ফাংশন এবং এটি ব্যবহার করে পাসওয়ার্ডে সল্ট যোগ করা obsolete বলে বিবেচিত।
আমরা এটি পড়েছি যাতে আপনি পরবর্তী বিষয়বস্তু বুঝতে পারেন, এবং কারণ আপনি অন্যের প্রকল্পে কাজ করার সময় এর সম্মুখীন হতে পারেন।
একটি আরও উন্নত পদ্ধতি রয়েছে সল্টেড পাসওয়ার্ড পেতে। এর জন্য 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 {
// এই লগইন সহ কোন ইউজার নেই, একটি মেসেজ দেখানো হবে
}
?>
আপনার লগইন এবং নিবন্ধন সিস্টেম নতুন শেখা ফাংশনগুলিতে পরিবর্তন করুন।