محمد حسن پزشکیان
عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

تفاوت میان Lookup Table و Rainbow Table چیست ؟ به زبان ساده

در این مطلب میخوایم بررسی کنیم تفاوت میان Lookup Table یا Hash Table و Rainbow Table

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

در حقیقت ، پسورد ها به صورت هش ذخیره میشوند و از اونجایی که هش برگشت پذیر نیست ، تنها راهی که میشه به پسورد اصلی پی برد اینه که بیاییم و از کلماتی که احتمالش هست پسورد باشه هش بگیریم و این هش هارو با اون هش پسورد اصلی که نمیدونیم چیه مقایسه کنیم ، اگر یکی از این هش ها با اون هش پسورد اصلی یکسان بود میفهمیم که پسورد همونه و فقط کافیه بریم توی اون لیست و ببینیم این هش متعلق به چه پسوردیه و پسوردو پیدا میکنیم ، برای اینکه بیشتر درک کنید ، بامن همراه باشید :

تفاوت میان Lookup Table و Rainbow Table چیست ؟ به زبان ساده

مثلا در عکس بالا ما یه سری پسورد به دست آوردیم (دامپ کردیم) مربوط به کاربرایی به نام های علی ، سارا و جواد ، که پسورد این ها هش شده و ما میخوایم بفهمیم پسورد این ها چی بوده ، پس میاییم و یه لیست متشکل از حروف ، کلمه ، عدد و... درست میکنیم و از همشون هش میگیریم و با این ها مقایسه میکنیم (به این لیست میگن Lookup Table یا Hash Table) :

تفاوت میان Lookup Table و Rainbow Table چیست ؟ به زبان ساده

حالا میاییم و عمل مقایسه رو انجام میدیم :

تفاوت میان Lookup Table و Rainbow Table چیست ؟ به زبان ساده

در این حمله وقتی ما مقایسه میکنیم ، کلماتی که هش گرفتیم خیلی کمه و به طبع اگر لیست بلند تری داشته باشیم احتمال کرکمون بیشتر میشه ، وقتی دوتا از هشا یکی در بیاد ، ما از روی کلمه ای که بقل هش ها هست و ازشون هش گرفته شده میفهمیم پسورد چی بوده

حالا

فک کنید شما میخواید از یه لیستی هش بگیرید که متشکله از حروف کوچک/بزرگ ، اعداد ، نماد ها ، و ترکیبشون باهم ... حالا فک کنید از همه اینا میخواید هش بگیرید ، طبق الگرتیم md5 اگر بخوایم حساب کنیم ، هر هش میشه 32 کاراکتر ، اگر طبق خانواده شا بخوایم حساب کنیم تا 128 کاراکتر هم میرسته :

تفاوت میان Lookup Table و Rainbow Table چیست ؟ به زبان ساده

همونطور که میبینید ، ما فقط تازه 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 و Rainbow Table چیست ؟ به زبان ساده

همونطور که در عکس میبینید من امدم اول Lookup Table شو کشیدم و رنگیش کردم که بفهمید چه قسمت هاییش رو ما نیاز داریم ، بعد که اون قسمتا جدا میشن از بقیه هش ما یه جدول رنگین کمانی داریم که خودتونم مستحضر هستید (وقتی میگیم رنگین کمان واقعا رنگی نیستن ها ، اسمشونه ، منظور یه قسمت از هشه که رنگیش میکنیم و مشخص میشه و از بقیه هش جدا میشه :) و مورد دوم هم من جدول بالا رو برای یه سری کلمات رسم کردم و فقط الگرتیم md5 شونو در نظر گرفتم ، شما برای بقیه الگریتم ها هم فرض کنید ...)

حالا این لیست به صورت زنجیر (chain) وار به هم وصل میشن ، یعنی عبارت مورد نظر و هش اون عبارت ، حالا عبارت بعدی و هش اون ، و هشی که در ادامه عبارت میاد فقط 5 حرف اولش مد نظر هست و کل عبارت هش نمیاد !

مثال:

123:202cb9;admin:21232f;qwe:76d802;pass:1a1dc9 ...

حالا واسه ادامه این لیست یا chain ما یه بحث داریم در روش rainbow tables که به دو نوع تقسیم میشه :

  1. ساخت زنجیر و لیست بر اساس عدد
  2. ساخت زنجیر و لیست بر اساس عدد و حرف

توی این دوتا مورد، مورد اول در 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 نباشه ، چون اگر باشه کل هش عوض میشه :)

اگر سوالی، ابهامی ، انتقادی یا پیشنهادی بود حتما بامن در میون بگذارید ، خوشحال میشم 😉


محمد حسن پزشکیان
محمد حسن پزشکیان

عاشق امنیت و نفوذ ، رد تیم و دوستدار بزن بکش :)

کارشناس تست نفوذ سنجی ، علاقه مند به امنیت تهاجمی و رد تیمینگ | عضو انجمن بین المللی ورزش های رزمی کشور آلمان و دارای احکام بین المللی و داخلی کمربند مشکی در سبک های کیوکوشین ، هاپکیدو ، کیک بوکسینگ و چند تام قهرمانی کشوری

نظرات