Rainbow Table یک جدولِ ازپیش محاسبه شده (Precomputed) است. اما در این جداول چه چیزی از پیش-محاسبه شده است و چه فایدهای دارد؟
رموزعبور یک سیستم درون یک پایگاهداده ذخیره میشوند. اما این ذخیره سازی بصورت خام (Plain Text) نیست. برای مثال اگر پسورد ویندوز شما Madeiniran باشد، ویندوز Madeiniran را درون پایگاهداده مربوط به رمزها ذخیره نمیکند. پس چگونه ذخیره میکند؟ ابتدا Madeiniran را به یک تابع هش (Hash Function) میدهد، تابع هش آن را تبدیل به یک هش میکند و سپس هش تولید شده بجای Madeiniran درون پایگاهداده ذخیره میکند. یعنی اگر Madeiniran پسورد ویندوز شما باشد عبارت F83D2FC5311B33F13960BDC5B3981F65 هش آن خواهد بود و این عبارت بجای Madeiniran درون پایگاهداده ذخیره میشود. توابع هش رمزنگاری را در "تابع هش یا Hash Function چیست و چه کاربردی دارد؟" مورد بررسی قرار دادیم و گفتیم که در زمینه رمزنگاری بسیار پرکاربرد هستند.
مروری بر توابع هش رمزنگاری
توابع هش به اصطلاح یک طرفه هستند یعنی عملیاتی که برروی ورودی انجام میدهند عموما ساده هستند، اما حرکت کردن در خلاف جهت تابع (اینکه بفهمیم خروجی که در اختیار داریم، حاصل چه ورودیهایی بوده است) بسیار دشوار و هزینهبر است. برای مثال، ضرب دو عدد اول 10 رقمی. ضرب دو عدد اول 10 رقمی عملیات بسیار سادهای است که در زمان کمی توسط کامپیوتر معمولی قابل انجام است. اما اینکه بخواهیم از روی خروجی، بفهمیم کدام دو عدد اول در یکدیگر ضرب شدهاند که این نتیجه را دادهاند، بسیار دشوار و زمانبر است.
در دنیای کامپیوتر نیز رموز عبور به همین شکل ذخیره میشوند. مثلا اگر پسورد شما Madeiniran باشد، با یک عملیات ساده (مثل ترکیب چند عمل شیفت، ضرب، جمع و ...) آن را تبدیل به یک هش میکنند و سپس هش را درون پایگاهداده ذخیره میکنند.
تولید هش از روی یک عبارت مثل Madeiniran بسیار ساده است، چون یک سری عملیات ساده ضرب و جمع میباشد. برای مثال هش NTLM متناظر با Madeiniran عبارت F83D2FC5311B33F13960BDC5B3981F65 که به سادگی توسط این لینک قابل محاسبه است.
اما اگر به شما عبارت F83D2FC5311B33F13960BDC5B3981F65 را بدهند و بگویند که رمزعبور را پیدا کنید، کار شما دشوار است! مگر اینکه قبلا این هش را دیده باشید! یعنی قبلا پسورد Madeiniran را به تابع هشی که در ویندوز استفاده میشود، داده باشید و Hash متناظر با آن را دیده باشید.
برای فهم بهتر، فرض کنید به شما عدد 1,665,924,922,469 را دادهاند و از شما دو عددی را میخواهند که حاصل ضرب آن مساوی با 1,665,924,922,469 است. چنین کاری خیلی دشوار است! مگر اینکه قبلا مقاله "تابع هش یا Hash Function چیست و چه کاربردی دارد؟"را خوانده باشید و به یاد داشته باشید که در آن جا 572387 و 2910487 را در هم ضرب کردیم و حاصل برابر 1,665,924,922,469 شد!
Rainbow Table چیست و چه کاربردی دارد؟
کاربرد Rainbow Table این است که مقادیر هش (Hash Value) را در خود ذخیره میکند. یعنی چندین و چند بار تابع هش را اجرا میکند و خروجی آن را در جدول ذخیره میکند. یعنی یک ستون عبارت خام است و روبروی آن، هش معادل.
این کار به این امید انجام میشود که در صورت مواجه با یک هش، مقدار خام معادل با آن درون جدول وجود داشته باشد.
در صورت وجود هش مورد نظر در جدول، در یک زمان بسیار کم، پسورد خام معادل با آن مشخص میشود!
نکته مهم در مورد Rainbow Table این است که مقادیر هش از قبل تولید شدهاند و زمان پیدا کردن پسورد معادل با یک هش (در صورت وجود در جدول) بسیار ناچیز است.
پس Precomputed بودن نکته اساسی درمورد این جدول است!