Dariush Tasdighi - داریوش تصدیقی
Dariush Tasdighi - داریوش تصدیقی
خواندن ۶ دقیقه·۵ سال پیش

اطمینان از صحت (سلامت) فایلی که دریافت و یا دانلود کرده‌ایم!

توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل می‌شود!
تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا می‌کنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم.
با کمال تشکر
داریوش تصدیقی
کانال تلگرام: IranianExperts@
شماره تلفن همراه: ۰۹۱۲۱۰۸۷۴۶۱
نشانی پست الکترونیکی: DariushT@GMail.com
فیلم‌های آموزشی https://www.aparat.com/DariushT
آدرس سایت‌ها: https://WebsiteAnalytics.ir - http://IranianExperts.ir - http://Date2Date.ir
نسخه مقاله: ۱.۰ - تاریخ بروزرسانی: ۱۳۹۹/۰۲/۰۵

آموزش HASH

تابع HASH تابعی است که دارای دو ویژگی مهم می‌باشد:

  • اول آن‌که تابع معکوس ندارد.

توجه: خیلی از افراد از جمله بالا چنین تصور می‌کنند که این تابع و الگوریتم بکار رفته در آن، یک پدیده Undocumented و یا محرمانه می‌باشد! نه اصلا این‌گونه نیست! اگر در داخل گوگل جستجو نماییم، سورس‌کدهای بسیار زیادی که با زبان‌های برنامه‌نویسی مختلف مانند C, JavaScript, CSharp, Python و غیره بدست می‌آید. نکته این است که این الگوریتم بر اساس سری فوریه بدست آمده و ماهیت آن به گونه‌ای است که اگر داده ورودی، که می‌تواند یک عدد، یک متن، یک فایل و غیره باشد، را به عنوان ورودی به آن وارد کنیم و در نهایت HASH آن‌را بدست آوریم، حتی در صورتی که سورس‌کد و الگوریتم نیز در دسترس باشد، نمی‌توانیم از HASH بدست آمده، مجددا به عدد، متن و یا فایل مورد نظر برسیم.

توجه: نکاتی در خصوص سایت‌ها و یا ابزارهایی که HASH یک عدد یا متن را به آن‌ها داده و عدد یا متن مورد نظر را به ما نمایش می‌دهند وجود دارد که یا در این مقاله و یا در مقاله دیگری به آن خواهم پرداخت.

توجه: بعضی از الگوریتم‌های HASH، مانند MD5، ضعف‌ها و یا Bug هایی دارد که یا در این مقاله و یا در مقاله دیگری به آن خواهم پرداخت.

  • دوم آن‌که به ازای هر X و Y:
X <> Y => H(X) <> H(Y)

نکته: عبارت فوق، بدین معنا است که اگر دو چیز (دو عدد، دو متن، دو فایل و غیره) با هم فرق داشته باشند، قطعا HASH آن‌ها متفاوت خواهد بود. در خصوص فایل‌ها می‌توان گفت که حتی اگر یک بیت (BIT) با هم فرق داشته باشند، قطعا آن دو فایل با هم متفاوت هستند.

نکته: در منطق (Logic) قانونی داریم که می‌گوید دو عبارت ذیل کاملا یکسان می‌باشند:

P => Q ~Q => ~P

با توجه به نکته فوق، می‌توان نتیجه گرفت دو عبارت ذیل نیز کاملا یکسان می‌باشند:

X <> Y => H(X) <> H(Y) H(X) = H(Y) => X = Y

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

نکته: ما الگوریتم‌های مختلفی در خصوص HASH داریم که تعدادی از آن‌ها را فهرست می‌کنیم:

  • MD5
  • SHA1
  • SHA256 در خصوص فایل‌ها معمولا از این الگوریتم استفاده می‌شود
  • SHA384
  • SHA512

فلسفه

با استفاده از نکات فوق، سالهاست که از تابع HASH استفاده‌های زیادی می‌شود. در ذیل به دو نمونه از آن‌ها می‌پردازیم:

  • اول) HASH کردن گذرواژه‌ها (Password) در بانک‌های اطلاعاتی.
  • دوم) قرار دادن HASH فایل‌های حجیم در سایت‌ها (که موضوع اصلی این مقاله است!)

فرض کنید که یک فایل حجیم (مثلا فایل iso مربوط به Ubuntu Linux) به دست ما رسیده است، که یا آن را از دوستمان و با استفاده از یک فلش دریافت کرده‌ایم و یا آن‌را از سایت Ubuntu دانلود کرده‌ایم. در ضمن به هر دلیلی، دل‌چرکین هستیم! یعنی یا به دوستمان و یا به روش دانلود کردن دوستمان و یا فلش وی و یا ویروسی بودن یا نبودن فایل، اطمینان نداریم و یا به اینترنت خودمان و روش دانلود خودمان شک داریم! به طور خلاصه نمی‌دانیم که آیا این فایل دقیقا همان فایلی است که در سایت Ubuntu قرار (وجود) دارد یا خیر؟ طبعا اگر مجددا این فایل حجیم را دانلود نماییم، باز هم این شک از بین نمی‌رود! و مجددا ممکن است با خود بگوییم که آیا این فایل دقیقا با فایلی که در سایت وجود دارد یکی است یا خیر؟ آیا ممکن است که حتی یک بیت (BIT) از این فایل درست دانلود نشده باشد؟

این‌جاست که این مقاله به ما کمک می‌کند!

واقعیت آن است که اکثر سایت‌ها که فایل‌های مهم و یا حجیمی دارند، در کنار لینک دانلود فایل، یک عبارت که به CheckSum و یا Hash فایل معروف است، درج می‌کنند. لذا ما می‌توانیم پس از دانلود فایل، با یک برنامه، HASH فایل دانلود شده را بدست آورده و با عبارت Hash ای که در سایت درج شده است، مقایسه نماییم. در صورتی که این دو عبارت یکسان بودند، یعنی دو فایل (فایلی که در سایت مذکور قرار دارد و فایل دانلود شده) دقیقا یکسان بوده و حتی یک بیت (BIT) هم با هم تفاوت ندارند!

برنامه‌هایی که به طور پیش‌فرض در ویندوز ۱۰ قرار دارند و ما می‌توانیم با استفاده از آن‌ها HASH یک فایل را بدست آوریم

استفاده از برنامه certutil

برای اجرای این برنامه، نیاز به پنجره Windows Command Prompt داریم. این پنجره را باز کرده، سپس به مسیری می‌رویم که فایل مورد نظر (فایلی که می‌خواهیم HASH آن‌را بدست آوریم) در آن‌جا قرار دارد. حال دستور ذیل را می‌نویسیم:

certutil -hashfile ubuntu-20.04-desktop-amd64.iso SHA256

پس از مدتی (بسته به حجم فایل، ممکن است کمی طول بکشد!) عبارت HASH فایل در ذیل دستور فوق ظاهر می‌‌شود.

نکته: در عبارت فوق SHA256 الگوریتمی است که می‌خواهیم بر اساس این الگوریتم HASH فایل مورد نظر محاسبه و نمایش داده شود.

استفاده از برنامه Get-FileHash

برای اجرای این برنامه، نیاز به پنجره Windows PowerShell داریم. این پنجره را باز کرده، سپس به مسیری می‌رویم که فایل مورد نظر (فایلی که می‌خواهیم HASH آن‌را بدست آوریم) در آن‌جا قرار دارد. حال دستور ذیل را می‌نویسیم:

Get-FileHash .\ubuntu-20.04-desktop-amd64.iso -Algorithm SHA256

نکته: در عبارت فوق SHA256 الگوریتمی است که می‌خواهیم بر اساس این الگوریتم HASH فایل مورد نظر محاسبه و نمایش داده شود.

مراجع

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-filehash?view=powershell-7

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil#-hashfile

پایان

hashhashingmd5shasha256
محقق، معمار، مشاور، مدرس و برنامه‌نویس حوزه فن‌آوری اطلاعات - تحلیل‌گر و فعال بازار بورس و سرمایه
شاید از این پست‌ها خوشتان بیاید