هش کردن چیست؟
هش کردن مفهوم جدیدی نیست. برای مدت زمان طولانی است که از این روش استفاده میشود. برای فهمیدن hashing درباره اثر انگشت فکر کنید. هر نفر یک اثر انگشت متمایز دارد. مشابه آن هر متنی میتواند با سایز مخصوص خودش یک اثر انگشت دیجیتالی داشته باشد که به آن hash میگویند(hash در زبان انگلیسی به معنای مخلوط است). یک الگوریتم hash خوب, الگوریتمی است که دو متن hash شده یکسانی وجود نداشته باشد.
روش هش کردن در PHP
الگوریتم های متفاوتی برای تولید یک متن به صورت hash شده وجود دارد. مشهورهای آنها عبارتند از: MD5, SHA1 و Bcrypt. همه اینها در PHP ساپورت میشوند.
کار را با استفاده از تابع md5() در PHP شروع میکنیم.
ابتدا خودتان فرمی را در یک صفحه با دو تکست باکس username و password بسازید و به این صفحه متصل کنید. همچنین در کد زیر اطلاعات دیتابیس خود را با کد زیر تطبیق دهید. همچنین نوع این فیلدها در دیتابیس باید از نوع text باشد.
$db = new PDO('mysql:host=localhost;dbname=test;charset=UTF8', 'root', ''); $username=$_POST['username']; $password=$_POST['password']; $password=md5($password); $query="insert into users (username,password) values (:username,:password)"; $stmt=$db->prepare($query); $stmt->execute(array( ":username"=>$username, ":password"=>$password )) or die('Your Pass and Username not Register'); echo "Your Password and Username is Registered."
کد بالا پسورد گرفته شده از کاربر را به صورت hash تبدیل و در دیتابیس ذخیره میکند. حالا برای گرفتن یوزرنیم و پسورد از دیتابیس همین عمل باید برعکس تکرار شود.
به صورت زیر: ابتدا فرم جهت ورود کاربر ساخته سپس به صفحه زیر متصل کنید:
$db = new PDO('mysql:host=localhost;dbname=test;charset=UTF8', 'root', ''); $username=$_POST['username']; $password=$_POST['password']; $password=md5($password); $query="select * from users where username=:username and password=:password"; $stmt=$db->prepare($query); $stmt->execute(array( ":username"=>$username, ":password"=>$password )); $row=$stmt->fetch(); echo "Your Username Equal to:".$row['username']." and Your Password Equal to:".$row['password']."";
در مثال بالا تابع md5() یک hash 128 بیتی تولید میکند. شما به راحتی میتوانید به جای md5() از sha1() استفاده کنید. این تابع یک hash 160 بیتی تولید میکند. اگر شما با تابع md5() پسورد “admin” را به hash تبدیل کنید متن hash شده برابر با زیر خواهد بود:
21232f297a57a5a743894a0e4a801fc3
هیچ وقت یک پسورد را دوباره hash نکنید. اینکار به امنیت اضافه نمیکند بلکه پسورد را ضعیف و بدردنخور میکند. برای مثال سعی نکنید ابتدا پسورد را به ms5 تبدیل سپس به تابع sha1 بفرستید. اینکار امکان برخورد hash را افزایش میدهد.
رفتن به مرحله بعدی
محققان چندین عیب برای الگوریتم های sha1 و md5 پیداکرده اند. به همین دلیل برنامه های مدرن PHP از این دو تابع برای hash کردن استفاده نمیکنند. بلکه آنها از الگوریتم خانواده sha2 مانند sha256 یا sha512 استفاده میکنند. بر اساس اسمشان یکی hash 256 بیتی و دیگری hash 512 بیتی تولید میکنند. این تابع ها جدید تر و به طور قابل ملاحظه ای قویتر از md5 هستند. یکی از آنها افزایش تعداد بیت ها که کاهش برخوردها را دربردارد.
کد زیر نحوه استفاده از sha256 را نشان میدهد.
$password=hash(“sha256”,$password);
PHP تابع hash() را ارائه میدهد. آرگومان اول نام الگوریتم را میگیرد( شما میتوانید از الگوریتم های sha256 , sha512 , md5 , sha1 و دیگر الگوریتم های متداول استفاده کنید). آرگومان دوم هم متنی که قرار است تبدیل به hash شود.
اضافه کردن امنیت با استفاده از Salts
خب با استفاده از sha512 شما بیشترین امنیت را به پسورتان اضافه میکنید. اما اگر حمله کننده به دیتابیس از انواع الگوریتم ها برای برگرداندن پسورد شما استفاده کند میتواند پسوردها را به راحتی رمزگشایی کند.
راه حل استفاده از یک عدد تصادفی در تولید hash است که با آن salt میگویند. در هر بار که ما تولید hash میکنیم از یک عدد تصادفی استفاده میکنیم. شما فقط کافی است که یک عدد تصادفی در اندازه خاصی تولید و آن را به متن پسورد بدهید سپس آن را hash کنید.
حتی اگر پسورد دو اکانت شبیه هم باشد باز هم رشته hash شده شبیه هم نخواهد بود زیرا ما از عدد تصادفی استفاده میکنیم.
برای استفاده از salt مانند زیر عمل میکنیم:
define("MAX_LENGTH_SALT",6); function generateHash($password){ $rand=md5(uniqid(rand(),true)); $salt=substr($rand , 0 , MAX_LENGTH_SALT); return hash("sha256",$password . $salt); }
برای ساخت salt ما به uniqid() احتیاج داریم. آرگومان اول تابع rand است که یک عدد تصادفی در integer میسازد و آرگومان دوم true میگیرد زیرا ما میخواهیم اعداد منحصر به فرد باشند.
برای اعتبارسنجی کاربر باید مقدار salt را در ذخیره کنیم(در یکی از فیلدهای دیتابیس). زمانی که کاربر سعی کرد وارد اکانت خود شود مقدار salt را در پسورد وارد شده وارد میکنیم سپس با استفاده از تابع hash مقایسه را انجام میدهیم.
حتی بیشتر از این با Bcrypt
یادگرفتن درباره md5 و sha1 و salt برای فهم آنچه که مورد نیاز ما برای ذخیره سازی امن هست خوب است. اما برای اجرای شدید امنیت باید از تکنیک Bcrypt در hashing استفاده کنیم.
ما باید از یک الگوریتم استفاده کنیم که حمله کننده خیلی سخت بتواند آن را رمزگشایی کند و به راحتی بتوان از آن در اپلیکیشن ها استفاده کرد. اگر از Bcrypt استفاده کنیم لازم نیست دیگر salt را ذخیره کنیم.
مثال:
function generateHash($password){ if(defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH){ $salt='$2y$11$' . substr(md5(uniqid(rand(),true)),0,22); return crypt($password,$salt); } }
تابع بالا ابتدا ثابت CRYPT_BLOWFISH را چک میکند. اگر این قابلیت وجود داشت یک salt تولید میکنیم. Salt تولید شده باید با “$2a$” یا “$2y$” شروع شده باشد. برای اطلاعات بیشتر در این مورد به PHP Manual مراجعه کنید.
برای شناسایی کاربر نیز از تابع زیر استفاده میکنیم. در صورت درست بودن, این تابع یک را برمیگرداند.
function verify($password,$hashedPassword){ return crypt($password,$hashedPassword) == $hashedPassword; }
این آموزش هش کردن بود و برای باز کردن هش برای هک چندین روش وجود دارد که به استحضار کاربران عزیز می رسانیم:
روش اول ) استفاده از سایت های خارجی برای کرک کردن یا باز کردن رمز :
باز کردن کد های Md5
سایت های زیر بهترین و قویترین آنلاین کرکر های پسورد md5 هستند.
روش دوم) استفاده از نرم افزارهایی است که این کار را انجام می دهند..
دو نرم افزار در این زمینه ۱ . برنامه هویج ۲٫ برنامه Cain & able
برای دانلود برنامه هویج کلیک کنید.
سایت های کرکر آنلاین از نرم افزارها قوی تر عمل میکنند..
روش سوم )که از روش های قبلی بهتر و کاربردی تر است توسط برنامه بک ترک
روش سوم که از روش های قبلی بهتر و کاربردی تر است توسط برنامه بک ترک است که در پست های آینده مطرح میکنم..
کرک کردن پسورد md5 با بک ترک کمی پیچیده است و نیاز بو توضیحات و کلیپ آموزشی دارد..
دم شما گرم
استفاده کردیم