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

توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل می‌شود!تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا می‌کنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم.با کمال تشکرداریوش تصدیقیکانال تلگرام: 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 داریم که تعدادی از آن‌ها را فهرست می‌کنیم:MD5SHA1SHA256 در خصوص فایل‌ها معمولا از این الگوریتم استفاده می‌شودSHA384SHA512فلسفهبا استفاده از نکات فوق، سالهاست که از تابع 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-7https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil#-hashfileپایان