تابع هش وهشینگ چیست؟
هش کردن یا هشینگ به فرآیندی گفته میشود که در آن یک عملگر ریاضی به نام …
خانه »
در این مقاله به کمک کارشناسان سایت ارز دیجیتال به بررسی تابع هش وهشینگ بپردازیم.
هش کردن یا هشینگ به فرآیندی گفته میشود که در آن یک عملگر ریاضی به نام «تابع هش» (Hash Function)، دادههای ورودی مانند حروف و اعداد و تصویر و … را به خروجی رمزگذاری شده تبدیل میکند. به تابع هش، «تابع درهمساز» نیز گفته میشود.
به عنوان مثال یک تابع هش میتواند کلمه «سلام» را دریافت کند و به عنوان خروجی این عبارت را تحویل بدهد:
«bda1fa48345336618741fd2c4bc02809eb099c49a9b02fb5056401ab6d4dc3e6»
به خروجیِ تابع هش، «هش» (Hash) میگویند و به این عمل یعنی استفاده از تابع هش برای ایجاد هش، هش کردن یا «هشینگ» (Hashing) گفته میشود.
حالا بیایید ببینیم فرآیند هش کردن یا به اصطلاح هشینگ چگونه انجام میشود.
هر کسی که در رمزنگاری و ریاضیات تخصص داشته باشد، میتواند با استفاده از این علوم برای خود تابع هش بسازد. در حال حاضر انواع زیادی تابع هش وجود دارد و آن را به روشهای گوناگونی میتوان ساخت اما در اینجا قصد داریم به عنوان نمونه نحوه کار الگوریتم شناخته شده SHA-256 را توضیح بدهیم که پرکاربردترین تابع هش دنیاست.
توابع هش معتبر، هر مقدار ورودی را تبدیل به یک رشته متنی با طول ثابت میکنند.
برای تابع هشِ استاندارد اهمیتی ندارد که ورودی شما چقدر بزرگ یا کوچک است. خروجی همیشه دارای طول ثابت خواهد بود. این مساله زمانی اهمیت پیدا میکند که با تعداد زیادی داده و اطلاعات سر و کار داشته باشید. بنابراین، اساسا به جای رهگیری و ذخیره دادههای ورودی که میتوانند بسیار زیاد و بزرگ باشند، میتوانید تنها هش را ذخیره کنید و آن را ردیابی کنید.
همچنین استفاده از یک خروجی با طول ثابت سبب افزایش امنیت میشود، چون کسی که سعی در رمزگشایی هش داشته باشد، نمیتواند با دیدن خروجی تشخیص دهد که ورودی ما به چه صورت بوده است.
تابع هش رمزنگاری
یک تابع هش رمزنگاری نوع خاصی از توابع هش بوده که دارای ویژگیهای منحصر به فردی است. ویژگیهای این نوع هش سبب میشود برای هویتسنجی و برقراری امنیت بسیار مناسب باشد. از این نوع تابع هش برای ساخت امضاهای دیجیتال و صحتسنجی استفاده میشود و میتوان با آن به اصطلاح «اثر انگشت دیجیتال» ساخت. یک تابع هش رمزنگاریِ امن باید ویژگیهای زیر را داشته باشد:
۱- قطعی و معین بودن
تابع هش به ازای یک ورودی مشخص، خروجی ثابت و مشخصی را به شما تحویل میدهد. فرقی نمیکند که شما چند مرتبه و یا در چه زمانی آن ورودی را به تابع هش دادهاید؛ تحت هر شرایطی خروجی ثابت است. این ویژگی از اهیمت بالایی برخوردار است، زیرا اگر هر بار هشهای مختلفی را تحویل دهد، آنگاه ردیابی و پیگیری اطلاعات غیرممکن خواهد بود.
مثلا اگر کلمه «سلام» را هزاران بار در تابع هش وارد کنیم باز هم هش این کلمه ثابت است.
۲- محاسبه سریع
تابع هش باید بتواند هش ورودی را به سرعت محاسبه کند. اگر این فرآیند به اندازه کافی سریع نباشد، سیستم ناکارآمد خواهد شد.
توابع هش رمزنگاری، توابعی یک طرفه هستند. تابع یکطرفه به تابعی گفته میشود که برای هر ورودی، خروجی به راحتی قابل محاسبه است، اما بهدست آوردن پیشتصویرِ خروجیِ متناظر با یک ورودیِ تصادفی، غیرعملی است.
به عبارت دیگر، در یک تابع هش استاندارد، ساخت خروجی از ورودی به راحتی قابل انجام است اما پیدا کردن ورودی از خروجی بسیار دشوار است. دقت داشته باشید از واژه دشوار و غیرعملی به جای واژه «غیرممکن» استفاده شده است. به مثال زیر توجه کنید.
تصور کنید که ما اعدادی بین ۱ تا ۶ داریم و به صورت تصادفی و مخفیانه، یکی از این اعداد را هش میکنیم. خب حالا چگونه میتوانید تعیین کنید که عدد اصلی چه بود؟ از آنجایی که توابع هش همیشه معین است، هش ورودیهای خاص همیشه یکسان خواهد بود. بنابراین تمام کاری که باید انجام دهید این است که هش اعداد ۱ تا ۶ را با هشی که ساخته شده است، مقایسه کنید و به این ترتیب عدد اصلی را بیابید.
اما این سازوکار زمانی امکانپذیر است که تعداد دادههای شما کم باشد. اگر با حجم عظیمی از اعداد سروکار داشته باشید، آنگاه چه خواهید کرد؟
فرض کنید شما با یک هش ۱۲۸ بیتی سر و کار دارید. تنها راه پیدا کردن داده ورودی اصلی استفاده از روش «جستجوی جامع» است. جستجوی جامع که به آن جستجوی خام و بیخردانه (brute-force method) نیز گفته میشود، اساسا به این معنی است که شما باید همینطور دادهها را امتحان کرده و آن را با خروجی مقایسه کنید و این مراحل را تا جایی که هش ورودی و هش هدف با یکدیگر تطابق پیدا کنند، ادامه دهید.
خب اگر از این روش استفاده کنید چه اتفاقی میافتد؟
- بهترین حالت ممکن: شما در اولین تلاش خود، جواب را پیدا کنید. برای اینکه این اتفاق بیافتد به معنای واقعی کلمه باید خوششانسترین فرد در تمام هستی باشید. احتمال رخ دادن چنین اتفاقی تقریبا به صفر میل میکند.
- بدترین حالت ممکن: شما پاسخ را در سعی و خطای دفعه (۱-۱۲۸)^۲ام بیابید. در واقع یعنی در آخرین شانس خود جواب را پیدا کنید.
- حالت میانگین: جواب را جایی در آن وسطها پیدا کنید. بنابراین پس از ۱۲۷^۲ = ۲/(۱۲۸)^۲ بار. برای اینکه درک واضحی از این عدد داشته باشید، باید بدانید که ۱۲۷^۲برابر است با ۳۸^۱۰× ۱.۷ و پیدا کردن عدد از بین این همه احتمال با کامپیوترهای امروزی احتمالا هزاران سال زمان خواهد برد.
بنابراین همانطور که پیشتر نیز عنوان شد، یافتن پیشتصویرِ خروجیِ متناظر با یک ورودیِ تصادفی با استفاده از حدس دادهها امکانپذیر است اما بسیار بسیار زمانبر خواهد بود به طوری که هیچ توجیهی برای این کار وجود ندارد.