متوسط مقالات

هشینگ چیست؟ آشنایی با فرایند هش کردن

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

هشینگ چیست؟ انگیزه استفاده از آن چیست؟

هشینگ چیست

فرض کنید که فایلی با حجم بسیار بالا در کامپیوتر خود دارید. یک روز دوستتان آلیس به شما مراجعه کرده و ادعا می‌کند که فایل کاملا یکسانی را در کامپیوتر خود دارد.

چگونه چنین ادعایی را اعتبارسنجی می‌کنید؟

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

در طول چند روز بعد‌، دوستان شما باب‌، چارلی و داگ به نزدتان می‌آیند و دوباره همین ادعا را تکرار می‌کنند.

حالا چگونه این ادعاها را بررسی می‌کنید؟

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

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

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

بنابراین‌، اثر انگشت فایل ما در مقایسه با فایل اصلی بسیار کوچک‌تر بوده‌، اندازه ثابتی دارد و در صورت نیاز‌، با سرعت بالایی در دسترس ما قرار می‌گیرد.

بیایید به مثال دوممان بازگردیم و یک راهکار پیشنهاد کنیم:

  • یک فایل اثر انگشت برای سند خود ایجاد کنید.
  • از هر یک از دوستانتان نیز بخواهید تا یک نمونه فایل فشرده از نسخه اصلی سند خود ایجاد کنند.
  • اثر انگشت فایل خود را با نمونه‌های مشابه فایل دوستانتان مقایسه کنید.

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

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

ایده اثر انگشت فایل به بیان بسیار ساده‌ای مفهوم هشینگ را پوشش می‌دهد.

مفهوم هشینگ چیست؟

مفهوم هشینگ

هشینگ در ساده‌ترین شکل خود به معنای پیاده‌سازی کردن تابع هش بر روی برخی از داده‌های ورودی دلخواه و به دست آوردن قطعی یک هش خروجی با اندازه ثابت است که با عنوان Digest نیز شناخته می‌شود.

به عنوان مثال‌:                             H(a) = b

در این مثال‌، H یک تابع هشینگ است (در بخش‌های بعدی با مثال‌های بیشتری در مورد توابع Hashing آشنا می‌شویم‌)‌، و a مقدار ورودی و b هش حاصل شده است.

واقعیت جالب توجه در مورد توابع هشینگ بدین صورت است که مقدار ورودی دلخواه است.

این بدان معناست که می‌توانید مقدار ورودی خود را تنها به صورت حرف a یا بلاکی از رشته متن حاوی محتوای یک کتاب کامل تعیین کنید.

مثال‌های قبلی که تا به اینجا بررسی کردیم تنها شامل متن می‌شد اما از نظر بنیادین هر چیزی می‌تواند به عنوان ورودی (عکس‌، ویدئو‌، صفحه وب‌) به این توابع داده شود. این قانون تا زمانی صادق است که محتوای ورودی ما قابل نمایش به صورت متن (به عنوان مثال به صورت باینری یا دودویی‌) باشد.

خواص توابع هشینگ

برای اینکه تابع هشینگ خوبی داشته باشیم‌، لازم است تا خواص پیش رو در این تابع وجود داشته باشند‌:

۱. به صورت خلاصه‌، پیدا کردن مقدار ورودی باید بسیار دشوار باشد. (مقاومت در برابر پیش تصویر‌)

  • با در نظر داشتن تابع H(x)‌، نباید هیچ راه آسانی برای بازگشتن به مقدار x اولیه وجود داشته باشد.

توجه داشته باشید که توابع هش در قالب «تابع یک طرفه‌» یا «تابع Trapdoor‌» توصیف می‌شوند و این بدان معناست که می‌توانیم مسیر اجرای این تابع را به آسانی طی کنیم اما طی کردن مسیر بر عکس آن کار بسیار پیچیده‌ای محسوب می‌شود.

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

۲. با توجه به میزان ورودی و هش آن‌، یافتن مقدار ورودی دیگری که همان هش را تولید می‌کند کار بسیار دشواری است. (مقاومت در برابر تصویر پردازش نشده دوم)

از آنجایی که فضای انتخاب مقادیر ورودی ما بی‌نهایت است‌، مقادیر زیادی هش یکسان نیز به ما ارائه می‌شود. از طرف دیگر‌، لازم است تا راه آسانی برای یافتن آن مقادیر وجود نداشته باشد.

  • با در نظر داشتن x و H(x)‌، یافتن y باید کار بسیار سختی باشد به صورتی که H(y) = H(x) و y != x‌.

در بخش کاربرد‌ها خواهیم دید که اگر این ویژگی حفظ نشود چه اتفاقاتی رخ می‌دهد.

۳. لازم است تا یافتن دو مقدار ورودی که هش یکسانی را تولید می‌کنند کار دشواری باشد. (مقاومت در برابر برخورد‌)

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

تاریخچه توابع هش

در این بخش به رشد الگوریتم هشینگ و به ویژه خانواده SHA یا همان تابع هش ایمن می‌پردازیم.

MD5 (Message Digest 5)‌: این تابع در اوایل دهه ۱۹۹۰ توسط رونالد ریوست (Ronald Rivest‌) و در قالب تلاشی برای رفع مشکلات موجود در مجموعه تلاش‌های طی عرضه (MID2 و MID4‌) توسعه یافت. این محصول رایگان بود و به سادگی در دسترس همگان قرار گرفت و از همین رو نیز محبوبیت و پذیرش عمومی بالایی پیدا کرد (برای مثال در ویندوز و اندروید مورد استفاده قرار می‌گیرد).

توابع هشینگ SHA

SHA-0 و SHA-1‌: این توابع هش توسط NSA طراحی شدند و خیلی زود و پس از اینکه در سال ۲۰۰۵ مشخص شد که MD5 از ایمنی لازم برخوردار نیست‌، توسط NIST توسعه یافتند.

SHA-2‌: این تابع هشینگ نیز توسط NSA و در اوایل دهه ۲۰۰۰ طراحی شد. این خانواده از توابع‌، تابع SHA-256 معروف را نیز شامل می‌شوند که امروزه به صورت گسترده‌ای مورد استفاده قرار می‌گیرد. سازمان‌های دولتی آمریکا در سال ۲۰۱۰ و به دلایل امنیتی به SHA-2 روی ‌آوردند. در طول سال‌های بعد‌، بسیاری از مرورگر‌های وب فرایند انتقال به این بستر را دنیال کردند و گواهی‌هایی که از SHA-1 بهره می‌گرفتند را کنار گذاشتند.

SHA-3‌: به منظور بهره‌مند شدن از یک الگوریتم هش قابل اطمینان برای دهه‌های بعدی‌، NIST در سال ۲۰۰۷ یک مسابقه برای یافتن نسل جدیدی از توابع هش که به SHA-3 معروف شد را برگزار کرد.

با وجود اینکه دوره عرضه این توابع یک سال تمام طول کشید و ۶۴ پروپوزال در این راستا ارائه شدند‌، بسیاری از این درخواستنامه‌ها به دلایل امنیتی رد شدند. در نهایت‌، پروژه‌ای تحت عنوان Keccak در سال ۲۰۱۲ و ۵ سال پس از آغاز این مسابقه به عنوان برنده انتخاب شد. همه این رویداد‌ها نشان می‌دهند که طراحی یک الگوریتم هشینگ به هیچ عنوان کار ساده‌ای نیست.

در پایان لازم به ذکر است‌، با وجود اینکه Keccak نقص‌های امنیتی SHA-2 را نداشت‌، اما باز هم از بستر پذیرش عمومی گسترده بسیار دور بود. با این حال‌، این مجموعه توابع امروزه در بستر اتریوم و عنوان مثال به منظور استخراج آدرس از یک کلید عمومی مورد استفاده قرار می‌گیرند.

با توجه به اینکه تهدید جدی در رابطه با SHA-2 وجود ندارد‌، این احتمال وجود دارد که توسعه‌دهندگان وضعیت فعلی را ترجیح داده و به عنوان مثال به استفاده از SHA-256 ادامه دهند.

کاربرد‌های فعلی هشینگ چیست؟

در این بخش به کاربرد‌های کنونی این توابع کاربردی می‌پردازیم و هر کدام از این کاربرد‌ها را توضیح می‌دهیم.

ساختار‌ها و الگوریتم‌های داده (HashTable و HashMaps‌)

مفهوم هشینگ ایده اصلی مورد استفاده در HashMaps (و یا دیکشنری‌های موجود در پایتون‌) و HashSets است تا امکان اندیس‌سازی سریع عناصر فراهم شود.

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

تایید محتوای یک فایل

اگر به این لینک مراجعه کنید و زبان برنامه نویسی Go را دانلود کنید‌، در کنار هر یک از فایل‌ها می‌توانید هش مرتبط با آن را مشاهده کنید.

پس از اینکه این سند را دانلود کردید‌، می‌توانیم آن را هش کنیم و دایجست (Digest‌) یا اثر انگشت فایل حاصل را با همتای ارائه شده آن توسط تیم رسمی Go مقایسه کنیم. این امر تضمین می‌کند که در حال استفاده از یک نرم‌افزار کلاهبرداری نیستیم و قرار نیست تا به عنوان مثال آسیبی به ما برسد.

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

رمزنگاری و بلاکچین (تولید آدرس‌)

بدون اینکه به سراغ جزئیات زیادی برویم باید بگوییم که فرایند هشینگ بر روی عملیات رمزنگاری کلید عمومی و خصوصی نیز انجام می‌شود تا بتوان یک آدرس از کلید عمومی استخراج کرد. به عنوان مثال‌، این ایده در هر دو شبکه اتریوم و بیت کوین و برای دریافت منابع مالی مورد استفاده قرار می‌گیرد.

سخن پایانی

توابع هشینگ برای حفظ امنیت فایل‌ها و اسناد بزرگ مورد استفاده قرار می‌گیرند. این توابع به بیان ساده در راستای فشرده‌سازی فایل‌ها و ایجاد Digest یا اثر انگشت فایل‌ها مورد استفاده قرار می‌گیرند. از جمله خصوصیت‌های مهم توابع Hashing که خانواده SHA را نیز پوشش می‌دهند به عدم امکان بازیابی فایل اصلی از دایجست‌ (چکیده)، عدم امکان به دست آوردن مقدار ورودی اولیه و عدم امکان یافتن مقادیر ورودی که هش یکسان تولید می‌کنند می‌توان اشاره کرد. در حال حاضر هیچ تهدید امنیتی جدی توابع هشینگ SHA-2 را هدف قرار نداده و توسعه‌دهندگان نیز ترجیح می‌دهند تا از توابع این مجموعه مثل SHA-256 بهره ببرند. از هشینگ در بستر کریپتو و بلاک چین نیز در راستای استخراج آدرس از کلید عمومی و رمزنگاری کلید‌های عمومی و خصوصی استفاده می‌شود. نظر شما در رابطه با کاربرد توابع هشینگ چیست ؟ آیا تا به حال به عنوان یک توسعه‌دهنده از این توابع استفاده کرده‌اید؟ چه نواقصی یا الزاماتی را در Hashing مد نظر دارید؟

منبع
blockmagnates

نوشته های مشابه

0 دیدگاه
Inline Feedbacks
View all comments
دکمه بازگشت به بالا