توابع هش | Hash Function

هشینگ یا هش کردن به فرایندی گفته می شود که به تولید یک خروجی با اندازه یکسان ، از ورودی هایی با اندازه های متغییر اشاره دارد ، که این فرایند از طریق یکسری فرمول های ریاضیاتی (الگوریتم های هشینگ )  که به توابع هش (Hash Function) معروف هستند انجام می پذیرد.

Hash Function

نکته مهمی که باید مد نظر خود قرار دهید این است که عملکرد توابع هش (فرایند هشینگ) با فرایند رمزنگاری متفاوت است ، اما در مواردی در کنار یکدیگر قرار میگیرند و شاهد توابع هش رمزنگاری شده هستیم ، برای مثال در هسته رمز ارزها میتوان ترکیب این دو فرایند را دید. به لطف توابع هشینگ و توابع رمزنگاری ، بلاکچین و سایر سیستم های توزیع شده توانسته اند، به سطح قابل توجهی از یکپارچگی اطلاعات و امنیت داده ها دست یابند.

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

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

 

تابع هش چگونه کار می کند؟

توابع هش با توجه به نوع الگوریتم و ساز و کار خودشان می توانند خروجی هایی با اندازه های مختلف تولید کنند ، اما اندازه های خروجی برای هر الگوریتم همیشه یکسان است. برای مثال ، الگوریتم SHA-256 فقط میتواند یک خروجی (هش ، دایجست) 256 بیتی تولید نماید در حالی که الگوریتم SHA-1 میتواند یک خروجی 160 بیتی تولید نماید.

برای مثال بیایید هش (دایجست) دو کلمه Sinabahiraie.com و sinabahiraie.com را از طریق الگوریتم هش SHA-256  (الگویی که در بیت کوین استفاده می شود) بدست بیاوریم :

(دقت کنید در دو ورودی داده شده تنها تفاوتی که وجود دارم بین S ابتدا می باشد که یکی حرف کوچک و دیگری حرف بزرگ می باشد)

خروجی هش برای sinabahiraie.com در تابع هش  SHA-256به صورت زیر است :

16e4e61f9bdb8cbf7d9ed5d55a66ae5a40d8ff2d21030f50cb0c931eb1669f63

خروجی هش برای Sinabahiraie.com  در تابع هش  SHA-256به صورت زیر است :

52c6fcbbbe99579e041426e21317fe0efd0ce1bf9ca2a81a33de8a8082f70fdb

توجه داشته باشید که یک تغییر جزئی (حرف اول) منجر به تغییر کلی خروجی و دریافت یک هش کاملا متفاوت می شود. اما از آنجاییکه ما از یک الگوریتم ثابت ( در مثال فوق  SHA-256 ) استفاده کرده ایم در هر دو مورد خروجی دارای یک اندازه یکسان 256 بیتی ( 64 کاراکتری) است ، ( صرف نظر از اینکه مقدار ورودی هرچه می خواهد یا هر اندازه ای باشد) و نکته دیگری که باید مد نظر قراردهید این است که مهم نیست چند بار از این الگوریتم خروجی بگیریم چراکه به ازای ورودی یکسان همیشه خروجی یکسانی دریافت می کنیم.

حال بیایید همین ورودی ها را از طریق الگوریتم هش  SHA-1 اجرا کنیم و نتایج را با هم بررسی کنیم:

خروجی هش برای sinabahiraie.com در تابع هش  SHA-1به صورت زیر است :

d614c4de1c6e5bb0c160abf7fc38065d85fd0170

خروجی هش برای Sinabahiraie.com  در تابع هش  SHA-1به صورت زیر است :

028d125dd2c4a79962c31fad63ae4ff0754e83ee

قابل ذکر است ، که  SHA مخفف کلمات  Secure Hash Algorithms  (الگوریتم های امن هش ) است، که به مجموعه ای از توابع هش رمزنگاری اشاره دارد که شامل گروه های الگوریتمی SHA-0 و SHA-1  و همچنین گروه های الگوریتمی SHA-2 و SHA-3 است. الگوریتم های SHA-256 و SHA-512 و برخی  دیگر از الگوریتم ها جزو خانواده SHA-2 هستند. در حال حاضر ، فقط گروه های SHA-2 و SHA-3 را میتوان جز الگوریتم های هش ایمن بر شمرد.

Hash function

چرا هش و توابع هش برای ما مهم هستند؟

توابع هش عادی به صورت متداول دارای موارد استفاده متعدد و گستره ای هستند ، از جمله می توان به استفاده در فرایند جستجو در پایگاه های داده ، تجزیه و تحلیل پرونده ها و داده های سنگین و بزرگ (Big Data analyses) ، مدیریت داده ها و اطلاعات و بسیاری موارد دیگر ، ازطرف دیگر توابع هش رمزنگاری شده به طور گسترده در برنامه های امنیتی اطلاعات از جمله تایید اعتبار پیام ، اثر انگشت دیجیتال ، تایید پرداخت و بسیاری موارد دیگر  استفاده می شود. به عنوان مثال وقتی صحبت از بیتکوین می شود توابع هش رمزنگاری در زیرساخت ، فرایند استخراج (Mining) و همچنین تولید آدرس ها ، کلید های عمومی (Private Keys)  و کلید های خصوصی (Private Keys) نقش دارند.

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

یکی از کاربردهای جالب و بسیار مفید توابع هش در زمینه فناوری بلاکچین است. برای مثال در بلاکچین بیتکوین عملیات و فرایند های مختلفی وجود دارد که شامل هش کردن می باشند که بیشتر در پروسه استخراج کاربرد دارند، در حقیقت میتوان گفت که تقریبا تمامی پروتکل های ارزهای رمز نگاری شده (Cryptocurrency)  برای ایجاد پیوند بین داده ها و همچنین فشرده کردن تراکنش ها (در جهت مدیریت حافظه و کاهش حجم داده ها)  و افزودن داده ها به بلاک ها و همچنین ایجاد پیوند و بین بلاک ها ( ایجاد زنجیره ای از بلاک ها که به بلاکچین معروف است) نقشی اساسی و موثر را بر عهده دارند.

 

توابع هش رمزنگاری

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

از نظر فنی ، یک تابع هش رمزنگاری باید دارای سه ویژگی باشد که بتوان آن را ایمن در نظر گرفت ، که در زیر به بررسی آنها می پردازیم:

  • Collision Resistance:

همانطور که بیان شد ، Collision (برخورد) زمانی رخ می دهد که ورودی های متفاوت و متمایز دارای خروجی هش دقیقا یکسانی با یکدیگر باشند، بنابراین میتوان گفت توابع هش در برابر Collision مقاوم هستند تا زمانی که بتوان یک مثال نقض برای آن ها پیدا کرد ، یعنی بتوان حداقل دو ورودی متفاوت  را پیدا کرد که دارای خروجی یکسانی باشند ، توجه داشته باشید که Collision برای همه توابع هش وجود دارد اما چرا که ورودی های احتمالی بینهایت هستند ولی خروجی توابع ممکن است دارای محدودیت هایی باشد. به عبارت دیگر میتوان گفت یک تابع هش در برابر Collision زمانی مقاوم است که پیدا کردن دو ورودی متمایز با خروجی یکسان میلیون ها سال زمان برای محاسبات نیاز دارد. بنا براین علی رغم اینکه شاید بتوان گفت هیچ تابع هش وجود ندارد که بدون Collision باشد ، اما برخی از آنها به اندازه کافی قوی و در برابر Collision مقاوم هستند. ( برای مثال الگوریتم هش مورد استفاده در بیتکوین به نام SHA-256) .

در میان الگوریتم های مختلف خانواده SHA ، گروه های SHA-0 و SHA-1 دیگر ایمن نیستند چراکه Collision برای آنها پیدا شده است.(یعنی ورودی های متمایزی که دارای خروجی یکسانی هستند) ، اما در حال حاضر ، گروه های SHA-2 و SHA-3 در برابر Collision مقاوم در نظر گرفته می شوند.

 

  • Preimage Resistance :

خاصیت Preimage Resistance  را میتوان مربوط به مفهوم توابع یک طرفه  دانست ، و میتوان مفهوم آن را اینگونه برداشت کرد که نتوان یک ورودی خاص را پیدا کرد که دارای خروجی مشخصی باشد. در واقع اگر نتوانیم یک ورودی را پیدا کنیم که بعد از فرایند هش گیری تبدیل به آن خروجی مشخص و مد نظر ما شود.

توجه داشته باشید مفهوم Preimage Resistance  با مفهوم Collision Resistance کاملا متفاوت است ، چرا که در این حالت شخص متهاجم در یک حمله سعی دارد یک ورودی خاص را حدس بزند و شناسایی کند که یک خروجی مشخص را تولید کند اما مهم نیست که از کدام ورودی ها استفاده کرده است. ویژگی Preimage Resistance برای محافظت از داده ها بسیار مهم و ضروری است ، چرا که یک هش ساده از یک پیام ، بدون نیاز به افشای اطلاعات درون پیام میتواند صحت آن را اثبات نماید ، در استفاده عملی از این قابلیت میتوان به استفاده توسط ارائه دهندگان خدمات وب اشاره کرد که هش های تولید شده از رمزهای عبور کاربران را به جای خود رمزهای عبور آنان ذخیره کرده و استفاده می نمایند.

 

Second-preimage resistance :

برای ساده سازی میتوانیم بگوییم که Second-preimage resistance در جایی بین دو ویژگی دیگر قرار دارد و در زمانی حمله Second-preimage رخ می دهد که با داشتن یک خروجی مشخص سعی در شناسایی یک ورودی داشته باشد که همان خروجی را بدست آورد. حمله Second-preimage با هدف یافتن یک Collision صورت می گیرد ، اما به جای آنکه سعی در شناسایی دو ورودی تصادفی که دارای هش یکسان باشند تلاش خود را برای یافتن ورودی می کند که دارای هش یکسان  مطابق با هش موجود تولید شده توسط ورودی دیگری می کند. بنابراین می توان گفت یک تابع هش که در برابر Collision ها مقاوم باشد در برابر Second-preimage نیز مقاوم است.

با این حال ، هنوز هم می توان یک حمله preimage را به عملکرد collision-resistant انجام داد زیرا این امر به معنای یافتن یک ورودی واحد از یک خروجی است.

 

کاربرد توابع هش در بحث استخراج رمزارزها (Mining) :

برای بررسی بهتر این موضوع اگرفرایند استخراج بیتکوین را مد نظر قرار دهید ماینرها باید مراحل زیادی را برای تولید یک بلاک ( به اصلاح استخراج یا ماین یک بلاک ) انجام دهند ، که این مراحل شامل استفاده از توابع هش نیز می شود ، از جمله این مراحل میتوان به بررسی مانده والت ها ، اتصال و پیوند دادن ورودی و خروجی تراکنش ها ، ثبت اطلاعات درون بلاک جهت ساخت درخت مرکل و… اشاره کرد. شاید بتوان گفت که یکی از علل اصلی امنیت بالای اطلاعات ثبت شده در بلاکچین استفاده بی شمار ماینر ها از توابع هش برای ایجاد بلاک های جدید و ثبت اطلاعات درون آنان می باشد.

به عنوان مثال یک ماینر برای ایجاد هش بلاک جدید خود باید ورودی های بسیاری را از طریق سعی و خطا بررسی کند ، در واقع ماینر ها در صورتی قادر به اعتبار سنجی بلاک های خود (برای تولید بلاک های جدید) هستند که یک هش خروجی برای بلاک نامزد جدید را تولید کنند که در ابتدای آن یک تعداد صفر مشخص (Nonce) قرارداشته باشد ، در واقع آنقدر باید فرایند هش گیری را به ازای ورودی های مختلف تکرار نمایند که به تعداد صفر های مشخص شده دست بیایند. تعداد این صفرها برای ما همان سختی شبکه ( Difficulty ) می باشد ، مسلما هر چه تعداد آنها بیشتر باشد فرایند هش گیری سخت تر می شود ، که سختی شبکه با توجه به هش ریت (Hashrate) کلی شبکه تعیین و مشخص می شود.

در این حالت می توان هش ریت شبکه را میزان مصرف انرژی رایانه در استخراج بیت کوین دانست ، اگر میزان هش ریت شبکه افزایش یابد پروتکل بیت کوین به طور خودکار سختی استراج را تنظیم می کند ، تا میانگین لازم برای استخراج یک بلوک نزدیک به همان 10 دقیق باقی بماند ، و در طرف مقابل اگر چند ماینر تصمیم به توقف استخراج بگیرند و این کار آنان باعث کاهش قابل توجه میزان  هش شود ، سختی شبکه مجددا تنظیم می شود که فرایند هش گیری و یا همان استخراج ساده تر شود که همان متوسط زمانی تولید هر بلاک در 10 دقیقه حفظ شود.

نکته دیگری که باید مد نظر قرار دهید این است که با توجه به اینکه این امکان وجود دارد ورودی های  متفاوتی ماینر ها پیدا کنند که در ابتدای آنها تعداد مشخصی صفر باشد ، پس برای استخراج یا تولید یک بلاک کافیست که آنها فقط یکی از آنها را پیدا کنند ، و با توجه به اینکه فرایند استخراج بلاک ها در بلاکچین بیتکوین فرایندی پرهزینه می باشد ماینر ها دلیلی برای تقلب نمی بینند چرا که این امر باعث خسارت مالی بسیار زیادی می شود ، و ذکر این نکته هم ضروری می باشد که هرچقدر تعداد ماینرها بیشتر شود امنیت شبکه بالاتر می رود چرا که به توزیع شدگی و عدم تمرکز آن کمک بیشتری می کند.

جمع بندی

در این موضوع که توابع هش یکی از مهمترین و کاربردی ترین ابزار در علوم رایانه ای هستند تردید و یا شکی وجود ندارد و می توان نقطه قوت آنان را در مواجه با حجم عظیمی از داده ها دانست ، به ویژه هنگامی که فرایند هش کردن با رمزنگاری ترکیب می شود.

الگورتیم های هش می توانند بسیار متنوع باشند ، که می توانند امنیت و بررسی صحت اطلاعات را به روش های مختلفی انجام دهند ، به همین دلیل می توان گفت توابع هش رمزنگاری شده جزو اصلی زیرساخت ارزهای رمزپایه هستند. بنابراین شناخت ویژگی ها و مکانیسم های کارکرد آنها مطمئنا برای هرکسی که به فناوری بلاکچین علاقه مند است می تواند مفید باشد.

دیدگاهتان را بنویسید