این روزها دارم روی پایاننامه ارشد با زیرمجموعهای از موضوع «امنیت در طراحی وب» کار میکنم. به الگوریتم MD5 رسیدم و گفتم بگذار کمی از پایاننامه را اینجا قرار دهم شاید به کار شما بیاید.
اگر از اینترت زیاد فایل دانلود کرده باشید، احتمالاً دیدهاید که برخی سایتها در کنار فایلی که برای دانلود قرار میدهند، یک کد نسبتاً طولانی و عجیب و غریب نیز قرار میدهند. مثلاً اگر برای دانلود VLC به سایت رسمیاش رفته باشید (اینجا) با چنین صحنهای روبهرو میشوید:
شاید با خود فکر کرده باشید که این کد دیگر به چه درد میخورد؟
بحث تخصصی و دانشگاهی آن بسیار طولانی است و دانشجویان رشته IT معمولاً هم در کارشناسی و هم در ارشد با این مباحث سر و کار دارند، اما من اینجا، فقط یک توضیح عامیانه ارائه میکنم.
Hash چیست؟
هش که گاهی اوقات به آن اثر انگشت هم گفته میشود، فرایندی است که یک داده با حجم زیاد را به یک مقدار کوتاه با طول ثابت تبدیل میکند. یعنی اگر شما فایلی با حجم 100 مگابایت به این الگوریتم بدهید، به شما یک کد 32 رقمی تحویل میدهد. حتی اگر یک داده بسیار کوتاه مثل «Hello» را هم به آن بدهید، باز یک کد 32 رقمی تحویل خواهد داد.
به طور خیلی ساده، این الگوریتم بیتهای خاصی از داده را انتخاب میکند و طی یک سری عملیات ریاضی یک کد مختص آن داده به دست میآورد. (البته این الگوریتمها پیچیدهتر از آن هستند که تصور میکنید، اما به بیان ساده همین کار را میکنند)
چند نکته:
- کدی که تحویل داده میشود، مثل یک اثر انگشت برای آن فایل یا داده است!
یعنی هیچ فایل یا داده دیگری این کد را به دست نخواهد آورد. پس فکر میکنم مشخص شد که آن کدی که سایتها در کنار فایل دانلودی مینویسند به چه درد میخورد؟
شما یک فایل حجیم دانلود میکنید و احتمالاً با پیغام خطا مواجه میشوید. میخواهید ببینید که این خطا به خاطر ناقص دانلود شدن آن فایل است و یا اینکه فایل سالم است و ویندوز اجازه نصب نمیدهد؟ کافیست شما هم فایلی که دانلود کردهاید را هش کنید و ببینید آیا کدی که به دست میآید همان کدی است که سایت سازنده ارائه کرده است؟ اگر یکی بود که فایل به درستی دانلود شده وگرنه، باید فایل را مجدداً دانلود کنید!
و یا اینکه میخواهید بدانید که فایلی که برای دانلود گذاشته شده، همان فایلی است که شما دارید؟ (مثلاً بارها شده من یک فایل را از چندین سایت دانلود کردهام و متوجه شدهام که همانی است که در سایت قبلی بوده. اگر همه یک کد MD5 از فایل اصلی ارائه میکردند، من با فایلی که داشتم مقایسه میکردم و اگر یکی میبود، مجدداً دانلود نمیکردم!
پیشنهادی به سایتهای دانلودی:
میخواهم همینجا از فرصت استفاده کنم و از همه افرادی که فایلی را (به خصوص فایلهای حجیم را) برای دانلود میگذارند، بخواهم که لطف کنند و یک کد MD5 از آن در کنار فایل قرار دهند تا کاربر در مواقعی که پیغام خطا میبیند، به دانلود خود شک نکند تا مجبور نباشد چندین بار آن فایل را دانلود کند و در نهایت متوجه شود که اصلاً فایل کلاً از ابتدا ایراد داشته!!
مثلاً اگر قرار است فایل firefox.exe را برای دانلود بگذارید، از آن فایل یک MD5 تهیه کنید و زیر آن بگذارید. این کار، چند ثانیه بیشتر طول نخواهد کشید!
اگر این فرهنگ جا بیفتد، چقدر صرفهجویی در ترافیک مصرفی و پهنای باند سایت شما و همینطور ترافیک مصرفی کاربر خواهد شد!
ضمن اینکه اگر فایلی از طرف شما به عنوان مدیر سایت، به درستی آپلود نشده باشد اگر یک کاربر مطمئن باشد که به درستی دانلود کرده و کد MD5 را به شما ارائه کند، شما با کد MD5 فایلی که روی سیستم خودتان است مقایسه میکنید و اگر مشابه نبود، این یعنی اینکه فایل به درستی آپلود نشده!
در زیر لینک دانلود، کد MD5 را قرار دهید و از طرفی یک لینک هم به یک مقاله بدهید با این عنوان «کد MD5 چیست؟» تا کاربر پس از مطالعه بداند که چطور صحت فایل را بررسی کند.
(ما در آفتابگردان سعی خواهیم کرد از این پس، این کار را برای تمام فایلهایی که برای دانلود خواهیم گذاشت انجام دهیم)
- کد هش، برگشتپذیر نیست!
این طبیعیست که از کد هش نمیتوان عبارت اصلی را استخراج کرد. یعنی شما نمیتوانید از آن 32 رقم، کل آن 100 مگابایت داده را به دست آورید!
در اصطلاح گفته میشود: الگوریتم هش نباید معکوسپذیر باشد!
- آیا دو عبارت، کد هش یکسان نخواهند داشت؟
برای اثبات اینکه قطعاً دو عبارت پیدا خواهند شد که کد هش یکسانی داشته باشند، به تصویر زیر دقت کنید:
دایره بزرگ، دادههای قابل تصور است که طبیعتاً بینهایت است. دایره کوچک، محدوده هش MD5 یا SHA-1 است که محدود است به یک تعداد کد 32 رقمی یا بیشتر. شما میخواهید دایره بزرگ را در دایره کوچک جا دهید! مشخص است که حتماً دو داده خواهیم داشت که کد هش یکسان داشته باشند. (Conflict)
البته این تصادم یا برخورد آنقدر احتمالش کم است که میتوان گفت هرگز این اتفاق رخ نمیدهد!
- کد هش برای مخفی نگاه داشتن پسورد کاربران نیز کاربرد دارد
شاید مهمترین کاربرد الگوریتمهای هش، هش کردن پسورد کاربران باشد.
تصور کنید در یک سایت ثبت نام میکنید. به آن اعتماد میکنید و پسوردی که برای ایمیل خود (و یا جاهای دیگر) وارد کردهاید را اینجا نیز وارد میکنید! اگر یک روز این سایت هک شود و یا اینکه مدیر سایت خیانت کند و به پسوردها نگاه کند، پسورد شما به راحتی لو رفته است! و ایمیل و خیلی حسابهای دیگر شما به خطر میافتد. (همیشه پسورد ایمیل خود را نسبت به پسوردی که در جاهای دیگر به کار میبرید، متفاوت انتخاب کنید)
این مشکلی است که پیش از کشف الگوریتمهای هش وجود داشت.
اما اگر سایتی امن باشد، پسورد کاربر را هنگام ثبت نام، به صورت هش شده در دیتابیس خود نگاه میدارد و هنگامی هم که میخواهید لاگین کنید، پسورد شما را هش میکند و این دو عبارت هش شده را با هم مقایسه میکند اگر درست بود، پسورد را درست وارد کردهاید.
اگر آن سایت پسورد را به صورت هششده ذخیره کند، با توجه به اینکه گفتیم که الگوریتمهای هش، برگشتپذیر نیستند، هیچ کس نمیتواند بفهمد پسورد اصلی شما چه بوده
-- اگر سایتی توانست بگوید پسورد شما چه بوده، هرگز امن نیست!
برای اینکه یک سایت را از لحاظ امنیتی تست کنید، فرض کنید پسوردتان را فراموش کردهاید. سایتها معمولاً بخشی دارند به نام «پسوردم را فراموش کردهام» به آنجا بروید و سعی کنید پسوردتان را بازیابی کنید. اگر آن سایت بتواند بگوید پسورد شما چه بوده (مثلاً بتواند پسورد را به ایمیل شما بفرستد) هرگز به آن سایت اعتماد نکنید! مشخص میشود که ناشیترین برنامهنویس را داشته است.
سایتها باید بتوانند پسورد شما را ریست کنند (یعنی بعد از اینکه مطمئن شدند شما صاحب این اکانت هستید، اجازه دهند که پسورد جدیدی انتخاب کنید) نه اینکه بگویند پسوردتان چه بوده!
- یعنی پسوردی که هش شد، هرگز توسط هکرها کشف نخواهد شد؟
در حالت کلی خیر، اما اگر پسورد شما یک پسورد روتین باشد، میتوان آنرا به راحتی فهمید!!
مثلاً یکی از راهها این است که هکرها یک لیست از پرکاربردترین پسوردها پیدا میکنند (مثل 123456 یا 4321 و غیره) آنها را هش میکنند تا کد هش شدهاش به دست آید. حالا بررسی میکنند که کد هش شدهی پسورد شما برابر با کدامیک از این پسوردهای هش شده است!؟ به همین راحتی پسورد شما را کشف میکنند!
این لیست آنقدر بزرگ است که احتمال اینکه پسورد شما یکی از آنها باشد زیاد است!
پس اینکه همه و بارها گفتهاند که پسوردی انتخاب کنید که روتین نباشد و هیچ شخص دیگری استفاده نکرده باشد به همین خاطر است
ابزارهای هش:
- HashTab، ابزاری برای به دست آوردن کد MD5 یک فایل:
اگر میخواهید کد MD5 فایلی را به دست آورید، برنامه جالب HashTab را از طریق لینک زیر دانلود کنید:
پس از نصب، اگر روی فایل مورد نظرتان کلیک راست کرده و Properties را انتخاب کنید، خواهید دید که یک تب جدید به نام File Hashes وجود خواهد داشت که با کلیک روی آن، کد هش MD5 و SHA-1 مربوط به آن فال را خواهید دید.
- ابزار آنلاین برای محاسبه کد هش MD5 و SHA-1 یک عبارت:
در آدرس زیر:
ابزاری آماده کردهایم که با وارد کردن یک عبارت بتوانید کد هش شده آن را ببینید. اگر برنامهنویس باشید، شاید گاهی نیاز پیدا کنید پس آدرسش را به خاطر بسپارید.
مثلاً اگر وارد کنید: 123456 ، خواهید دید:
کد هش شده با الگوریتم md5:
e10adc3949ba59abbe56e057f20f883e
کد هش شده با الگوریتم SHA-1:
7c4a8d09ca3762af61e59520943dc26494f8941b
- توجه: هدف این مقاله، بحث اساسی در مورد هش و بررسی این الگوریتمها نبود چرا که ساعتها توضیح نیاز دارد. امیدوارم توانسته باشم یک توضیح قابل فهم از این مفاهیم جذاب ارائه کرده باشم.
موفق باشید؛
حمید رضا نیرومند