توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل میشود!
تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا میکنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم.
با کمال تشکر
داریوش تصدیقی
کانال تلگرام: IranianExperts@
شماره تلفن همراه: ۰۹۱۲۱۰۸۷۴۶۱
نشانی پست الکترونیکی: DariushT@GMail.com
فیلمهای آموزشی https://www.aparat.com/DariushT
آدرس سایتها: https://WebsiteAnalytics.ir - http://IranianExperts.ir - http://Date2Date.ir
نسخه مقاله: ۱.۰ - تاریخ بروزرسانی: ۱۳۹۹/۰۲/۰۵
تابع HASH تابعی است که دارای دو ویژگی مهم میباشد:
توجه: خیلی از افراد از جمله بالا چنین تصور میکنند که این تابع و الگوریتم بکار رفته در آن، یک پدیده Undocumented و یا محرمانه میباشد! نه اصلا اینگونه نیست! اگر در داخل گوگل جستجو نماییم، سورسکدهای بسیار زیادی که با زبانهای برنامهنویسی مختلف مانند C, JavaScript, CSharp, Python و غیره بدست میآید. نکته این است که این الگوریتم بر اساس سری فوریه بدست آمده و ماهیت آن به گونهای است که اگر داده ورودی، که میتواند یک عدد، یک متن، یک فایل و غیره باشد، را به عنوان ورودی به آن وارد کنیم و در نهایت HASH آنرا بدست آوریم، حتی در صورتی که سورسکد و الگوریتم نیز در دسترس باشد، نمیتوانیم از HASH بدست آمده، مجددا به عدد، متن و یا فایل مورد نظر برسیم.
توجه: نکاتی در خصوص سایتها و یا ابزارهایی که HASH یک عدد یا متن را به آنها داده و عدد یا متن مورد نظر را به ما نمایش میدهند وجود دارد که یا در این مقاله و یا در مقاله دیگری به آن خواهم پرداخت.
توجه: بعضی از الگوریتمهای HASH، مانند MD5، ضعفها و یا Bug هایی دارد که یا در این مقاله و یا در مقاله دیگری به آن خواهم پرداخت.
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 داریم که تعدادی از آنها را فهرست میکنیم:
با استفاده از نکات فوق، سالهاست که از تابع HASH استفادههای زیادی میشود. در ذیل به دو نمونه از آنها میپردازیم:
فرض کنید که یک فایل حجیم (مثلا فایل iso مربوط به Ubuntu Linux) به دست ما رسیده است، که یا آن را از دوستمان و با استفاده از یک فلش دریافت کردهایم و یا آنرا از سایت Ubuntu دانلود کردهایم. در ضمن به هر دلیلی، دلچرکین هستیم! یعنی یا به دوستمان و یا به روش دانلود کردن دوستمان و یا فلش وی و یا ویروسی بودن یا نبودن فایل، اطمینان نداریم و یا به اینترنت خودمان و روش دانلود خودمان شک داریم! به طور خلاصه نمیدانیم که آیا این فایل دقیقا همان فایلی است که در سایت Ubuntu قرار (وجود) دارد یا خیر؟ طبعا اگر مجددا این فایل حجیم را دانلود نماییم، باز هم این شک از بین نمیرود! و مجددا ممکن است با خود بگوییم که آیا این فایل دقیقا با فایلی که در سایت وجود دارد یکی است یا خیر؟ آیا ممکن است که حتی یک بیت (BIT) از این فایل درست دانلود نشده باشد؟
اینجاست که این مقاله به ما کمک میکند!
واقعیت آن است که اکثر سایتها که فایلهای مهم و یا حجیمی دارند، در کنار لینک دانلود فایل، یک عبارت که به CheckSum و یا Hash فایل معروف است، درج میکنند. لذا ما میتوانیم پس از دانلود فایل، با یک برنامه، HASH فایل دانلود شده را بدست آورده و با عبارت Hash ای که در سایت درج شده است، مقایسه نماییم. در صورتی که این دو عبارت یکسان بودند، یعنی دو فایل (فایلی که در سایت مذکور قرار دارد و فایل دانلود شده) دقیقا یکسان بوده و حتی یک بیت (BIT) هم با هم تفاوت ندارند!
برای اجرای این برنامه، نیاز به پنجره Windows Command Prompt داریم. این پنجره را باز کرده، سپس به مسیری میرویم که فایل مورد نظر (فایلی که میخواهیم HASH آنرا بدست آوریم) در آنجا قرار دارد. حال دستور ذیل را مینویسیم:
certutil -hashfile ubuntu-20.04-desktop-amd64.iso SHA256
پس از مدتی (بسته به حجم فایل، ممکن است کمی طول بکشد!) عبارت HASH فایل در ذیل دستور فوق ظاهر میشود.
نکته: در عبارت فوق SHA256 الگوریتمی است که میخواهیم بر اساس این الگوریتم HASH فایل مورد نظر محاسبه و نمایش داده شود.
برای اجرای این برنامه، نیاز به پنجره Windows PowerShell داریم. این پنجره را باز کرده، سپس به مسیری میرویم که فایل مورد نظر (فایلی که میخواهیم HASH آنرا بدست آوریم) در آنجا قرار دارد. حال دستور ذیل را مینویسیم:
Get-FileHash .\ubuntu-20.04-desktop-amd64.iso -Algorithm SHA256
نکته: در عبارت فوق SHA256 الگوریتمی است که میخواهیم بر اساس این الگوریتم HASH فایل مورد نظر محاسبه و نمایش داده شود.
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil#-hashfile
پایان