نقطه ویرگول;

هر از گاهی از هر چیزی

هر از گاهی از هر چیزی

بخش دوم مقاله آموزش هشینگ رو تونستم امروز آماده کنم و برای علاقه مندان روی سایت قرار دهم، این بخش شامل مباحثی چون، سرعت هشینگ و جداول رنگین کمانی (rainbow tables ) میباشد که در در جای خود موضوعات مهمی میباشند.برای درک بهتر مطلب بهتر است که قسمت اول این مقاله رو مطالعه بکنید.
۵-مشکل دوم:جداول رنگین کمانی
اگر مسئله تصادم را بر خود حل کنیم اما باز هم در امان نیستیم،یک جدول رنگین کمانی با محاسبه کردن مقادیر هش کلمات اخیرا استفاده شده و ترکیبات آنها ساخته میشود.
این جداول میتوانند میلیون ها و یاحتی میلیاردها ردیف و رکورد داشته باشند.
برای مثال،شما میتوانید از میان کلمات دیکشنری ها برای خود مقادیر هش شده تولید کنید.و حتی می توانید شروع به ترکیب آنها با هم و تولید مقادیر هش برای آنها کنید . و لی این همه کار نیست،شما حتی میتوانید قبل/بعد/میان کلمات رقم نیز اضافه کنید و آنها را به راحتی در جدول ذخیره کنید.
با توجه به ذخیره سازی ارزان و ساده در این روزها،می توان جداول رنگین کمانی غول پیکر تولید و استفاده نمود.
چگونه می توان از این کار سوء استفاده کرد؟!
بیایید تصور کنیم که یک دیتابیس حجیم دزیده شده است!!با ۱۰ میلیون پسورد هش شده،جستجو در جداول رنگین کمانی برای هر کدام از آنها تقریبا آسان است.هر چند قرار نیست برای همه آنها این کار را انجام دهیم ولی قطعا برای بعضی از آنها این کار رو انجام خواهیم داد.
چگونه می توان از این کار جلوگیری کرد؟!
ما باید حتما salt(دسته ای از کلمات رندوم که در هیچ دیکشنری وجود ندارد) را به گذرواژه هایم اضافه کنیم،مانند نمونه زیر:
$password = "easypassword";
// این ممکن است در جداول رنگین کمانی یافت شود
// چرا که پسورد شامل دو کلمه متدوال ایزی و پسورد است
echo sha1($password); // 6c94d3b42518febd4ad747801d50a8972022f956
// از دسته کلمات رندوم برای طولانی تر کردن آن استفاده کنید
$salt = "f#@V)Hu^%Hgfds";
// این در هیچ جدول از پیش ساخته رنگین کمانی نیست
echo sha1($salt . $password); // cd56a16759623378628c0d9336af69b74d9d71a5
اساسا ما آنچه انجام دادیم الحاق salt با رشته های هش شده گذرواژه هایمان است،رشته به دست آمده بدیهی است که در هیچ یک از جداول رنگین کمانی از پیش ساخته وجود ندارد،با این حال باز ما در امان نیستیم. ;)
۶- مشکل سوم:باز هم جداول رنگین کمانی :D
به یاد داشته باشید جدول رنگین کمانی ممکن است از یک اسکریچ بعد دزید شدن دیتابیس ساخته شود.
چگونه از این موضوع سوء استفاده میشود؟!
همواره با وجود استفاده از نمک :) ،ممکن است ، مقدار نمک شده همراه دیتابیس مسروقه باشد.با این حال ممکن است یک جدول رنگین کمانی جدید از روی اسکریچ جدول مسروقه بسازند،با این وضع نمک همراه همه کلمات جدبد در جدول قرار میگیرد.
برای نمونه،در جداول رنگین کمانی معمول، “easypassword ممکن است وجود داشته باشد. در جدول رنگین کمانی جدید “f#@V)Hu^%Hgfdseasypassword” به خوبی یافت میشود.
حال همه ی ۱۰ میلیون رکورد مسروقه ی ، هش و ترکیب شده با نمک دوباره در این جدول وجود دارد، دوباره می توانیم تعدادی مشابهات در آن پیدا کنیم.
چگونه از این کار جلوگیری کنیم؟!
ما می توانیم از salt منحصر به فرد استفاده کنیم که برای هر یوزر تغییر کند.
می توانیم از آی دی کاربر به عنوان یک کاندید استفاده کنیم:
$hash = sha1($user_id . $password);
ما همنچنان ممکن است برای هر کاربر یک رشته خاص تولید کنیم،اما ما باید مطمئن شویم که در جایی آنرا برای کاربر ذخیره میکنیم.
// یک رشته ۲۲ کاراکتری رندوم تولید میکنیم
function unique_salt() {
return substr(sha1(mt_rand()),0,22);
}
$unique_salt = unique_salt();
$hash = sha1($unique_salt . $password);
// و $unique_salt را همراه با رکورد کاربر ذخیره میکنیم
// ...
این روش دوباره ما را از جداول رنگین کمانی محافظت میکند.چرا که گذرواژه با مقادیر متفاوتی نمک شده است.هکر یا هر حمله کننده باید ۱۰ میلیون جدول رنگین کمانی جدا بسازد.که کاری نشدنی می باشد.
7-مشکل چهارم:سرعت هش
تمامی فانکشن های هش با سرعتی ذهنی طراحی شده اند،چرا که آنها اغلب برای محاسبه مقادیر چک سام برای صحت داده های بزرگ تنظیم و فایل شده اند.
چگونه از این کار سوء استفاده میشود؟!
همانطور که پیشتر اشاره شد،یک کامپیوتر مدرن با پردازنده قدرتمند گرافیکی می تواند برای محاسبه حدود یک میلیارد رشته هش شده در ثانیه برنامه ریزی شود.به این ترتیب آنها می توانند با یک نیروی حمله بی رحم تمامی گذرواژه های ممکن را سعی و امتحان کنند.
شاید شما فکر کنید حداقل ۸ کارکتر برای محافظت از حمله نیروی بی رحم امن باشد.
اگر گذرواژه شما حاوی حروف کوچک،حروف بزرگ و اعداد باشد، که می تواند ۶۲ (۲۶+۲۶+۱۰) کارکتر ممکن باشد.یک رشته ۸ کاراکتری لانگ استرینگ میشود که ۶۲×۸ حالت دارد که مقداری کمتر از ۲۱۸ تریلیون میشود..
به نظر میرسد به گذرواژه های ۹ یا ۱۰ کاکتری لانگ نیاز است.که این کار نیز باعث رنجش برخی از کاربران میشود.
چگونه این مشکل را حل کنیم؟!
از تابع کند کننده هش استفاده کنید.
تصور کنید که شما از یک تابع هشی که فقط می تواند در هر ثانیه ۱ میلیون بار اجرا شود استفاده میکنید.در حالیکه در سخت افزاری مشابه یک میلیار بار در ثانیه اجرا میشود.یعنی ۱۰۰۰ بار طولانی تر و بیشتر از قبل که ۶۰ ساعت تبدیل به ۷ سال میشود!
یک روش برای این موضوع وجود دارد:
function myhash($password, $unique_salt) {
$salt = "f#@V)Hu^%Hgfds";
$hash = sha1($unique_salt . $password);
// هزار بار بیشتر این کار را طولانی تر میکنیم
for ($i = 0; $i $hash = sha1($hash);
}
return $hash;
}
یا شما ممکن است از یک الگوریتمی که توسط پارامترهای ارزشی نظیر BLOWFISH پشتیبانی میشود استفاده کنید.در پی اچ پی این کار توسط تابع crypt() انجام میشود.
function myhash($password, $unique_salt) {
// salt برای blowfishb باید۲۲ کارکتر لانگ شود
return crypt($password, '$2a$10$'.$unique_salt);
}
دومین پارامتر برای تابع crypt() توسط علامت دالر ($)جدا میشود.
اولین مقدار $2a هست که نشان میدهد ما از الگوریتم BLOWFISH استفاده میکنیم.دومین مقدار $10 هست که در این مورد بیانگر پارامتر ارزشیست.این یک الگوریتم مبنای دو هست که میگوید چه مقدار تکرار قرار هست اجرا شود( ۱۰ => ۲^۱۰ = ۱۰۲۴ تکرار)این عدد می تواند رنجی بین ۰۴ و ۳۱ داشته باشد.
یه نمونه تست کنیم:
function myhash($password, $unique_salt) {
return crypt($password, '$2a$10$'.$unique_salt);
}
function unique_salt() {
return substr(sha1(mt_rand()),0,22);
}
$password = "verysecret";
echo myhash($password, unique_salt());
// result: $2a$10$dfda807d832b094184faeu1elwhtR2Xhtuvs3R9J1nfRGBCudCCzC
نتیجه هش، شامل الگوریتم($2a)و پارامتر ارزشی($10) و ۲۲ کاراکتر سلت استفاده شده است.
// فرض کنید این مقدار وارد دیتابیس میشود
$hash = '$2a$10$dfda807d832b094184faeu1elwhtR2Xhtuvs3R9J1nfRGBCudCCzC';
// فرض کنیم این پسوردی هست که کاربر برای لاگین وارد کرده است
$password = "verysecret";
if (check_password($hash, $password)) {
echo "Access Granted!";
} else {
echo "Access Denied!";
}
function check_password($hash, $password) {

$full_salt = substr($hash, 0, 29);
// تابع هش را بر روی $password اجرا میکنیم
$new_hash = crypt($password, $full_salt);
// نیتجه درست یا غلط برگردانده میشود
return ($hash == $new_hash);
}

اگر اینو اجرا کنیم Access Granted! را خواهیم دید.
ادامه دارد...

نظرات  (۱)

من پسورد رو به قول شما Hash کردم. مشکلی نداشت... حالا می خوام تو پنل ادمین یوزر و پس کاربران رو ببینم. چه جوری می تونم پسورد Hash شده رو به حالا عادی برگردونم و تو پنا ادمین نمایش بدم !؟

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی