MD5 چیست و با آن چه می‌توان کرد؟

در ابتدا، Hash چیست؟

hash خروجی تابعی یک‌طرفه است، برای تولید نوعی اثر انگشت از یک سری داده. منظور از یک‌طرفه بودن تابع Hash این است که نمی‌توان با داشتن خروجی تابع به اصل داده دست یافت (همان‌طور که با داشتن اثر انگشت یک انسان، نمی‌توان آن انسان را از نو تولید کرد!). احتمال اینکه دو داده‌ی متفاوت دو خروجی یکسان از این تابع بگیرند بسیار پایین است، به همین دلیل از الگوریتم‌های متفات این تابع معمولا برای تشخیص درستی داده‌ها استفاده می‌شود. به عنوان مثال اگر از الگوریتم معروف MD5 برای محاسبه‌ی خروجی تابع Hash استفاده کنیم، و کلمه‌ی 'Cat' را به آن بدهیم، خروجی ما همیشه مقدار زیر است:

d077f244def8a70e5ea758bd8352fcd8
چنانچه کلمه‌ی 'Cat'  را به 'Cats' تغییر دهیم، خروجی تابع به شکل زیر تغییر پیدا می‌کند:

0832c1202da8d382318e329a7c133ea0
مقدار داده‌ای که به تابع می‌دهیم، ربطی به سایز خروجی آن ندارد. همچنین تغییر در داده‌، هر چقدر هم که کوچک باشد، خروجی کاملا متفاوتی ارائه خواهد کرد.

MD5 چیست؟

MD5 یا Message-Digest algorithm 5
پر استفاده‌ترین، تابع رمزنگاری Hash است. از این تابع در بسیاری از نرم‌افزارهای حفاظت اطلاعت استفاده می‌شود و همچنین کاربرد زیادی در تشخیص درستی داده‌ها دارد. خروجی این تابع مقداری 128 بیتی‌است که معمولا به صورت یک عدد هگزادسیمال ۳۲ رقمی ارائه می‌شود. به خروجی تابع MD5 Hash یک داده، MD5 Checksum آن داده گفته می‌شود.

چگونه MD5 Checksum یک عبارت را محاسبه کنیم؟

ساده‌ترین راه برای این کار مراجعه به این آدرس، نوشتن عبارت مورد نظر و فشردن دکمه‌ی Calculate MD5 است، اما نرم‌افزار‌های زیادی هم برای محاسبه‌ی این مقدار نوشته شده است. همچنین اگر شما برنامه‌نویس هستید، توابع متفاوتی برای استفاده در زبان‌های مختلف برنامه‌نویسی وجود دارد. با این حال شبه‌کد محاسبه‌ی این مقدار را می‌توان در ویکیپدیا یافت.

MD5 Hash و فایل‌ها:

محاسبه‌ و مقایسه‌ی خروجی تابع MD5 Hash فایل‌ها روشی است برای تعیین دست نخورده بودن، و یا سالم بودن یک فایل. همچنین از MD5 Checksum می‌توان برای یافتن فایل‌های مشابه استفاده کرد. به عنوان مثال تصور کنید که قصد دارید مقداری از اطلاعات خود را برای یکی از دوستان خود کپی کنید. برای اینکار می‌توانید ابتدا MD5 Checksum فایل‌های خود و فایل‌های دوستتان را محاسبه کرده، و سپس فایل‌هایی را که مقدار MD5 Checksum آنها متفاوت است، کپی کنید. با این کار از کپی کردن فایل‌هایی که از قبل در هارد دیسک دوستتان وجود داشته‌ است جلوگیری می‌کنید. همچنین بار دیگر بعد از کپی کردن فایل‌ها می‌توانید با مقایسه‌ی مقدار MD5 Checksum فایل‌های کپی شده با فایل‌های موجود در هارد دیسک خود،‌ از این که فایل‌ها به درستی کپی شده‌اند، مطمئن شوید.
به هنگام دانلود یک فایل‌، در بسیاری از سایت‌های اینترنتی مقدار MD5 Checksum فایل هم ذکر می‌شود تا پس دانلود، بتوان از سلامت فایل مطمئن شد. به عنوان مثال اغلب سایت‌های ارائه دهنده‌ی توزیع‌های لینوکس، مقدار MD5 Checksum فایل‌های ایزوی توزیعشان را نیز ذکر می‌کنند تا پیش از رایت آنها بر روی سی‌دی، بتوان از سلامت فایل دانلود شده مطمئن شد.

چگونه MD5 Checksum یک فایل را (در لینوکس) محاسبه کنیم؟

برای محاسبه‌ی MD5 Checksum یک فایل از ابزار md5sum استفاده می‌شود. این برنامه به صورت پیش‌فرض در اکثر توزیع‌های لینوکس موجود است. تصور کنید قصد محاسبه‌ی این مقدار برای فایلی به نام file.txt را دارید. برای این کار یک ترمینال باز کنید و دستور زیر را وارد کنید:

md5sum file.txt

همه چیز در مورد md5sum:

ابزار md5sum چند قابلیت دیگر هم دارد. برای محاسبه‌ی md5sum چند فایل به صورت همزمان، می‌توانید نام فایل‌ها را یکی پس از دیگری به عنوان آرگومان‌های دستور md5sum بنویسید:

md5sum text1.txt text2.txt
خروجی این دستور چیزی شبیه به این است:
9ff460edc32f6a59fd0e612162c8d7e7  text1.txt
bbee0ebbbb53235666b515c5d0c2c3ab  text2.txt
ستون اول مقدار MD5 Checksum و ستون دوم نام فایل‌هاست.
بدیهی است می‌توان MD5 Checksum فایل‌ها را با استفاده از دستور زیر در یک فایل جداگانه ذخیره کرد:

md5sum text1.txt text2.txt > mymd5sums
با این کار فایلی به نام mymd5sums با محتوایی برابر خروجی دستور در فولدر جاری ایجاد می‌شود. از این فایل می‌توان بعدا برای چک کردن تطابق مقدار MD5 Checksum‌های موجود در این فایل، با مقدار به دست آمده از فایل‌ها استفاده کرد. برای این کار از دستور زیر استفاده می‌شود:
md5sum -c mymd5sums
خروجی دستور بالا چیزی شبیه به این است:
text1.txt: OK
text1.txt: OK
چنانچه مقدار به دست آمده از یکی از فایل‌ها با عدد موجود در فایل mymd5sums تطابق نداشته باشد، خروجی به شکل زیر می‌باشد:
one.txt: FAILED
two.txt: OK
md5sum: WARNING: 1 of 2 computed checksums did NOT match
می‌توان به صورت دستی نیز فایلی مشابه فایل mymd5sums ایجاد نمود و از آن فایل برای مقایسه‌ی مقدار MD5 Checksumهای فایل‌های متفاوت ایجاد کرد. فقط دقت کنید که هر سطون باید با دو بار فشردن کلید Space از هم جدا شوند.
همچنین می‌توان به جای استفاده از یک فایل، از خروجی استاندارد یک دستور دیگر برای مقایسه‌ استفاده کرد. به عنوان مثال:

echo '9ff460edc32f6a59fd0e612162c8d7e7  text1.txt' | md5sum -c -
دستور بالا، مقدار md5checksum فایل text.txt را با مقدار پایپ شده از دستور echo مقایسه می‌کند. دقت کنید که به جای نام فایل، این بار از -(خط تیره) استفاده شده است.

و در انتها...

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