در این مطلب میخوایم بررسی کنیم تفاوت میان Lookup Table یا Hash Table و Rainbow Table
در حقیقت ، پسورد ها به صورت هش ذخیره میشوند و از اونجایی که هش برگشت پذیر نیست ، تنها راهی که میشه به پسورد اصلی پی برد اینه که بیاییم و از کلماتی که احتمالش هست پسورد باشه هش بگیریم و این هش هارو با اون هش پسورد اصلی که نمیدونیم چیه مقایسه کنیم ، اگر یکی از این هش ها با اون هش پسورد اصلی یکسان بود میفهمیم که پسورد همونه و فقط کافیه بریم توی اون لیست و ببینیم این هش متعلق به چه پسوردیه و پسوردو پیدا میکنیم ، برای اینکه بیشتر درک کنید ، بامن همراه باشید :
مثلا در عکس بالا ما یه سری پسورد به دست آوردیم (دامپ کردیم) مربوط به کاربرایی به نام های علی ، سارا و جواد ، که پسورد این ها هش شده و ما میخوایم بفهمیم پسورد این ها چی بوده ، پس میاییم و یه لیست متشکل از حروف ، کلمه ، عدد و... درست میکنیم و از همشون هش میگیریم و با این ها مقایسه میکنیم (به این لیست میگن Lookup Table یا Hash Table) :
حالا میاییم و عمل مقایسه رو انجام میدیم :
در این حمله وقتی ما مقایسه میکنیم ، کلماتی که هش گرفتیم خیلی کمه و به طبع اگر لیست بلند تری داشته باشیم احتمال کرکمون بیشتر میشه ، وقتی دوتا از هشا یکی در بیاد ، ما از روی کلمه ای که بقل هش ها هست و ازشون هش گرفته شده میفهمیم پسورد چی بوده
حالا
فک کنید شما میخواید از یه لیستی هش بگیرید که متشکله از حروف کوچک/بزرگ ، اعداد ، نماد ها ، و ترکیبشون باهم ... حالا فک کنید از همه اینا میخواید هش بگیرید ، طبق الگرتیم md5 اگر بخوایم حساب کنیم ، هر هش میشه 32 کاراکتر ، اگر طبق خانواده شا بخوایم حساب کنیم تا 128 کاراکتر هم میرسته :
همونطور که میبینید ، ما فقط تازه 512 بیت شا2 و شا 3 رو حساب کردیم ، یعنی شا 2 و 3 هرکدوم (224 - 256 - 384 - 512) بیت میتونن باشن ، ما فقط 512 شون رو حساب کردیم
فرض کنید در لیست شما کلمه apple هست و ازش میخواد هش گرفته بشه ، اگر بخوایم جمع بزنیم ، 5 کاراکتر برای کلمه apple و 246 کاراکتر برای هش هاش باید ما حساب کنیم که به عبارتی 269 کاراکتر میشه که ما ذخیره میکنیم ، اونم فقط برای یه عبارت 5 حرفی کوتاه مثل apple ، حالا شما حساب کن میخوای از حروف کوچیک/بزرگ ، اعداد نماد ها وترکیبشون از 1 کاراکتری تا 10 کاراکتری هش بگیری ، باید چندین ترابایت هارد درایو کنار بزاری و این اصلا منطقی ، و بعضأ شدنی نیست !!
اینجاست که ما کاربرد جداول رنگین کمانی با Rainbow Tables رو حس میکنیم ، جداول رنگین کمانی جداولی هستن ، عینا مشابه Lookup Tables ولی با این تفاوت که بجای ذخیره کل اون هش ، میان و 6 کاراکتر اولشو ذخیره میکنن :
همونطور که در عکس میبینید من امدم اول Lookup Table شو کشیدم و رنگیش کردم که بفهمید چه قسمت هاییش رو ما نیاز داریم ، بعد که اون قسمتا جدا میشن از بقیه هش ما یه جدول رنگین کمانی داریم که خودتونم مستحضر هستید (وقتی میگیم رنگین کمان واقعا رنگی نیستن ها ، اسمشونه ، منظور یه قسمت از هشه که رنگیش میکنیم و مشخص میشه و از بقیه هش جدا میشه :) و مورد دوم هم من جدول بالا رو برای یه سری کلمات رسم کردم و فقط الگرتیم md5 شونو در نظر گرفتم ، شما برای بقیه الگریتم ها هم فرض کنید ...)
حالا این لیست به صورت زنجیر (chain) وار به هم وصل میشن ، یعنی عبارت مورد نظر و هش اون عبارت ، حالا عبارت بعدی و هش اون ، و هشی که در ادامه عبارت میاد فقط 5 حرف اولش مد نظر هست و کل عبارت هش نمیاد !
مثال:
123:202cb9;admin:21232f;qwe:76d802;pass:1a1dc9 ...
حالا واسه ادامه این لیست یا chain ما یه بحث داریم در روش rainbow tables که به دو نوع تقسیم میشه :
- ساخت زنجیر و لیست بر اساس عدد
- ساخت زنجیر و لیست بر اساس عدد و حرف
توی این دوتا مورد، مورد اول در 90 درصد اوقات استفاده میشه ولی من هردو رو توضیح میدم:
1. در این مورد وقتی از کلمه ای هش گرفته میشه ، مثل "123" هشی که از این گرفته میشه این عبارت هست
202cb962ac59075b964b07152d234b70
حالا در این روش ما میاییم و از سه عدد اول (مثلا) دوباره هش میگیریم ، یعنی میایم و حروف رو از عبارت "202cb9" حذف میکنیم و عدد 202 میمونه و ما میاییم ازش هش میگیریم و میرسیم به
854d6fae5ee42911677c739ee1734486
دوباره میاییم و 3 رقم اول رو برمیداریم ، یعنی باز حروف رو از "854d6f" حذف میکنیم و حدد 854 میمونه و ازش دوباره هش میگیریم و میرسیم به
f7e9050c92a851b0016442ab604b0488
و باز میریم سراغ سه رقم اول یعنی 905 و همین طور ادامه پیدا میکنه و میرسیم به عبارات دیگه و زنجیر ما اینطوری میشه:
123:202cb9;202:854d6f;854:f7e905;
که مثلا در عبارت بالا : یک جدا کنندس بین عبارت اصلی و 5-6 رقم اول هش اون عبارت و ; یه جداکنندس بین عبارت قبلی و هشش و عبارت بعدی و هشش (البته به صورت مثال گفتم که درک کنید وگر ن حتما ; و : نیستن
نکته دیگه ایم که هست ایه که هروقت این لیست به عدد 123 یا همون مقدار اولیه و شروع لیست رسید ، تولیدش متوقف میشه
2. در این روش ما هم از حرف هش میگیریم هم از عدد ، برای مثال میاییم و از عدد 123 هش میگیریم:
202cb962ac59075b964b07152d234b70
و اینبار حروفو حذف نمیکنیم بلکه از حروف و عدد باهم هش میگیریم ، مثلا از 6 عبارت اول "202cb9" :
13481522d0e3e96e42c0b862ec7fb1c8
که هشش میشه عبارت بالا ، حالا 6 تا کارکتر اول رو دوباره هش میگیریم "13481522" که میشه این عبارت پایین
b23b9e119906e4f0d8034ae094773008
دوباره از این 6 تا "b23b9e"هش میگیریم که میشه این :
cca2ece7f42f4a9f90502a5296aa2a31
و همینطور ادامه میدیم که برسیم به 123 یا هش 123 و لیست زنجیره ای ما اینطوری میشه :
123:202cb9;202cb9:134815;134815:b23b9e;b23b9e:cca2ec;...
و تفاوت بین این دوتا روش اینه که شما در روش اول فقط یه جدول رنگین کمانی دارید که فقط عدده ! و پسورد تارگت هم اگر فقط عدد باشه امکان کار کردن جدول هست ولی در روش دوم اگر کاربر مقادیر رندوم انتخاب کرده باشه یا از حروف استفاده کرده باشه میشه پسوردشو کرک کرد
یادتون باشه من فقط اینجا از md5 استفاده کردم ، شما هم md5 بزنید هم بقیه الگریتمایی که بالا 128 هستن :)
به صورت خلاصه و برای جمع بندی : اینم از فرق بین این دوتا جدول، به صورت خلاصه Rainbow Table آمد که ما در فضای کمتری مقدار بیشتری هش بتونیم ذخیره کنیم
نکته 1 : بر فرض محال اگر موقع مقایسه هش ها ، دوسه تا مقدار در جدول رنگین کمانی ما یکسان در آمد با هش پسورد اصلی ، کارمون خیلی راحت تره ، کافیه بریم و از اون دوسه مقدار هش بگیریم و هش های کاملشو مقایسه کنیم ، پس ما یا 99% میتونیم یه هش دامپ شده (هش پسورد اصلی) رو کرک کنیم یا چند مورد مشابه در میاد که میشه هش کامل شونو حتی دستی گرفت و مقایسه کرد :)
نکته 2 : همیشه دقت کنید موقع گرفتن هش ، اخر اون عبارتتون هیچوقت return نباشه ، چون اگر باشه کل هش عوض میشه :)
اگر سوالی، ابهامی ، انتقادی یا پیشنهادی بود حتما بامن در میون بگذارید ، خوشحال میشم 😉