تابع هش و هشینگ چیست؟ -بخش اول

۱۲ آبان ۱۳۹۸۲٬۸۲۱بازدید
تابع هش و هشینگ چیست؟ -بخش اول

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

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

هش کردن یا هشینگ به فرآیندی گفته می‌شود که در آن یک عملگر ریاضی به نام «تابع هش» (Hash Function)، داده‌های ورودی مانند حروف و اعداد و تصویر و … را به خروجی رمزگذاری شده تبدیل می‌کند. به تابع هش، «تابع درهم‌ساز» نیز گفته می‌شود.

به عنوان مثال یک تابع هش می‌تواند کلمه «سلام» را دریافت کند و به عنوان خروجی این عبارت را تحویل بدهد:

«bda1fa48345336618741fd2c4bc02809eb099c49a9b02fb5056401ab6d4dc3e6»

به خروجیِ تابع هش، «هش» (Hash) می‌گویند و به این عمل یعنی استفاده از تابع هش برای ایجاد هش، هش کردن یا «هشینگ» (Hashing) گفته می‌شود.

تابع هش و هشینگتابع هش ورودی را می‌گیرد و تبدیل به یک رشته متنی با طول ثابت می‌کند.

حالا بیایید ببینیم فرآیند هش کردن یا به اصطلاح هشینگ چگونه انجام می‌شود.

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

توابع هش معتبر، هر مقدار ورودی را تبدیل به یک رشته متنی با طول ثابت می‌کنند.

تابع هش و هشینگ چیست؟هش کردن عبارات با استفاده از تابع هش SHA-256

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

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

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

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

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

۱- قطعی و معین بودن

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

مثلا اگر کلمه «سلام» را هزاران بار در تابع هش وارد کنیم باز هم هش این کلمه ثابت است.

۲- محاسبه سریع

تابع هش باید بتواند هش ورودی را به سرعت محاسبه کند. اگر این فرآیند به اندازه کافی سریع نباشد، سیستم ناکارآمد خواهد شد.

۳- تابع یک طرفه

تابع هش و هشینگ چیست؟تابع هش رمزنگاری یک طرفه است

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

به عبارت دیگر، در یک تابع هش استاندارد، ساخت خروجی از ورودی به راحتی قابل انجام است اما پیدا کردن ورودی از خروجی بسیار دشوار است. دقت داشته باشید از واژه دشوار و غیرعملی به جای واژه «غیرممکن» استفاده شده است. به مثال زیر توجه کنید.

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

اما این سازوکار زمانی امکان‌پذیر است که تعداد داده‌های شما کم باشد. اگر با حجم عظیمی از اعداد سروکار داشته باشید، آنگاه چه خواهید کرد؟

فرض کنید شما با یک هش ۱۲۸ بیتی سر و کار دارید. تنها راه پیدا کردن داده ورودی اصلی استفاده از روش «جستجوی جامع» است. جستجوی جامع که به آن جستجوی خام و بی‌خردانه (brute-force method) نیز گفته می‌شود، اساسا به این معنی است که شما باید همینطور داده‌ها را امتحان کرده و آن را با خروجی مقایسه کنید و این مراحل را تا جایی که هش ورودی و هش هدف با یکدیگر تطابق پیدا کنند، ادامه دهید.

خب اگر از این روش استفاده کنید چه اتفاقی می‌افتد؟

  • بهترین حالت ممکن: شما در اولین تلاش خود، جواب را پیدا کنید. برای این‌که این اتفاق بیافتد به معنای واقعی کلمه باید خوش‌شانس‌ترین فرد در تمام هستی باشید. احتمال رخ دادن چنین اتفاقی تقریبا به صفر میل می‌کند.
  • بدترین حالت ممکن: شما پاسخ را در سعی و خطای دفعه (1-128)^2ام بیابید. در واقع یعنی در آخرین شانس خود جواب را پیدا کنید.
  • حالت میانگین: جواب را جایی در آن وسط‌ها پیدا کنید. بنابراین پس از 127^2 = 2/(128)^2 بار. برای این‌که درک واضحی از این عدد داشته باشید، باید بدانید که 127^2برابر است با 38^10× 1.7 و پیدا کردن عدد از بین این همه احتمال با کامپیوترهای امروزی احتمالا هزاران سال زمان خواهد برد.

بنابراین همان‌طور که پیش‌تر نیز عنوان شد، یافتن پیش‌تصویرِ خروجیِ متناظر با یک ورودیِ تصادفی با استفاده از حدس داده‌ها امکان‌پذیر است اما بسیار بسیار زمان‌بر خواهد بود به طوری که هیچ توجیهی برای این کار وجود ندارد.

۴- هر تغییر در ورودی، هش را به طور کامل تغییر می‌دهد

حتی اگر تغییری بسیار کوچک در داده ورودی ایجاد کنید، بازتاب این تغییر کوچک در هش بسیار قابل توجه خواهد بود.

تابع هش و هشینگ چیست؟

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

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

همچنین در بحث ارزهای دیجیتال، این ویژگی باعث برقراری یکی از مهم‌ترین اصل‌های بلاک چین یعنی «تغییرناپذیری» می‌شود که در ادامه بیشتر در مورد آن می‌خوانید.

۵- مقاوم در برابر تصادم

با توجه به این‌که A و B دو ورودی متفاوت تابع هش هستند و (H(A و (H(B نیز به ترتیب هش‌های متناظر با آن‌ها، احتمال این‌که این دو خروجی با یکدیگر یکسان باشند عملا غیرممکن است. این بدان معناست که هر ورودی، هش منحصر به فرد خود را دارد.

نمونه‌هایی از توابع هش

الگوریتم‌های هش زیادی برای رمزنگاری داده وجود دارند. در ادامه به چند مورد از شناخته‌شده‌ترین و پرکاربردترین آن‌ها اشاره خواهد شد.

MD5

الگوریتم هش MD که مخفف عبارت «Message Digest» به معنی «خلاصه پیام» است، در سال ۱۹۹۱ توسط رونالد ریوِست و به عنوان جایگزینی برای تابع هش پیشین این خانواده یعنی MD4 طراحی شد. الگوریتم MD5، تابع هشی است که به صورت گسترده مورد استفاده قرار می‌گیرد و هش ۱۲۸ بیتی تولید می‌کند.

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

SHA

الگوریتم هش ایمن (Secure Hash Algorithm) که به اختصار آن را SHA می‌نامند، مجموعه‌ای از الگوریتم‌هاست که توسط موسسه ملی استاندارد و فناوری (NIST) ایالات متحده و دیگر ارگان‌های امنیتی ایجاد شد و توسعه یافت. SHA-0 اولین الگوریتم از خانواده SHA است که در سال ۱۹۹۳ توسعه پیدا کرد. اما مدتی پس از انتشار به دلیل نقص قابل توجهی که در آن کشف شد، جای خود را به نسخه‌ی جدیدتر و اصلاح‌شده‌ی SHA-1 داد.

SHA-1 یک تابع هش ۱۶۰ بیتی است که به الگوریتم MD5 شباهت دارد. از طرفی دیگر الگوریتم SHA-1 شباهت بسیار زیادی به SHA-0‎ نیز دارد ولی در اصل ایرادهایی اساسی که در نسخه 0 وجود داشته و سبب ضعف این الگوریتم شده بود را برطرف نمود. این الگوریتم توسط آژانس امنیت ملی ایالات متحده (NSA) و با هدف این‌که بخشی از الگوریتم امضای دیجیتال باشد طراحی شد. در سال ۲۰۰۵ رخنه‌های امنیتی در این الگوریتم تشخیص داده شد، که نشان از نفوذپذیری احتمالی آن داشت. از آن زمان بود که نیاز به یک الگوریتم بهتر در این حوزه احساس شد.

نسخه‌های متفاوت الگوریتم SHAنسخه‌های متفاوت الگوریتم SHA

الگوریتم هش ایمن بعدی، SHA-2، متشکل از ۶ تابع هش با مقادیر هش متفاوت ۲۲۴، ۲۵۶، ۳۸۴ و ۵۱۲ بیتی است که نام‌های آن‌ها نیز با توجه به مقادیر هش انتخاب شده است؛ SHA-224، SHA-256، SHA-384، SHA-512، SHA-512/224 و SHA-512/256. این الگوریتم‌ها در طول با یکدیگر متفاوتند.

الگوریتم شناخته‌شده‌ی SHA-256 در بلاک چینِ بیت کوین هم استفاده می‌شود. علاوه بر این، از این الگوریتم در TLS ،SSL ، PGP، SSH، توسعه چندمنظوره پست الکترونیک اینترنت/امن و IPsec یا همان ایمن‌سازی پروتکل اینترنت استفاده می‌شود.

آخرین عضو از خانواده الگوریتم هش ایمن، SHA-3 است که در سال ۲۰۱۵ توسط NIST منتشر شد. این الگوریتم در سال ۲۰۱۲ در جریان رقابت و مسابقه‌ای عمومی در رابطه با طراحی الگوریتمی جدید به عنوان برترین الگوریتم برگزیده شد. SHA-3 در واقع زیرمجموعه‌ای از خانواده گسترده‌تری به نام Keccak است.

RIPEMD

RIPEMD که مخفف عبارت «RACE Integrity Primitives Evaluation Message Digest» است، همانند الگوریتم SHA مجموعه‌‌ای از توابع هش است که در بلژیک و توسط گروه تحقیقاتی COSIC در سال ۱۹۹۶ توسعه یافت. آن‌ها این مجموعه الگوریتم را در واکنش به ضعف امنیتی که در RIPEMD مشاهده شد، طراحی کردند. در طراحی این الگوریتم از اصول به کار رفته در MD4 استفاده شده است و عملکردی مشابه با SHA-1 دارد.

طول هش توابع این خانواده متفاوت است و دارای مقادیر ۱۲۸، ۱۶۰، ۲۵۶ و ۳۲۰ بیتی است. تاکنون حمله موفقی به RIPEMD-160 گزارش نشده است. نسخه ۲۵۶ و ۳۲۰ بیتی این توابع نیز سطح امنیتی بالاتری ندارند، بلکه تنها امکان بروز تصادم را از بین می‌برند.

Whirlpool

ویرپول، یکی دیگر از توابع هش در دنیای رمزنگاری است. این الگوریتم برای اولین بار در سال ۲۰۰۰ و توسط وینسنت ریمن و پائولو بارتو طراحی شده است. ویرپول بر مبنای نسخه اصلاح شده‌ی استاندارد رمزنگاری پیشرفته (AES) ساخته شده است.

این تابع هش، هر پیامی با طول کمتر از ۲۲۵۶ بایت را دریافت و هشی با اندازه ۵۱۲ بیت (۶۴ بایت) تولید می‌کند. هش ۵۱۲ بیتی الگوریتم ویرپول به صورت اعداد ۱۲۸ رقمی نمایش داده می‌شود.

الگوریتم ویرپول از سال ۲۰۰۰ تاکنون، ۲ بار بازبینی شده است. در اولین بازبینی در سال ۲۰۰۱، S-box را تغییر دادند تا پیاده‌سازی این الگوریتم بر روی سخت‌افزار آسان‌تر شود. در دومین بازبینی (۲۰۰۳)، نقصی در ماتریس انتشار که سبب می‌شد تا امنیت روش پایین‌تر از آن‌چه از آن انتظار می‌رفت باشد، پیدا و برطرف شد. الگوریتم اولیه و اصلی را Whirlpool-0، بازبینی اول Whirlpool-T و نسخه نهایی را Whirlpool نام دارند.

Blake

بلیک یکی از الگوریتم‌هایی است که در رقابت توابع هشی که از جانب موسسه ملی استاندارد و فناوری ایالات متحده (NIST) با هدف انتخاب بهترین تابع هش برای توسعه SHA-3 برگزار شده بود، در بین ۵ الگوریتم برگزیده قرار داشت. این رقابت از سال ۲۰۰۷ آغاز شد و در نهایت در سال ۲۰۱۲ با اعلام Keccak به عنوان برنده به طور رسمی به کار خود پایان داد.

همانند SHA-2، بلیک نیز دارای 2 نوع الگوریتم متفاوت است. یکی از کلمات ۳۲ بیتی استفاده می‌کند و طول هش محاسبه‌شده‌ی آن حداکثر ۲۵۶ بیت است و دیگری از کلمات ۶۴ بیتی استفاده می‌کند با طول هش ۵۱۲ بیت.

اما شناخته‌شده‌ترین عضو خانواده بلیک، Blake2 است که در سال ۲۰۱۲ منتشر شد. هدف از طراحی این الگوریتم معرفی جایگزینی برای الگوریتم‌های پرکاربرد اما آسیب‌پذیر MD5 و SHA-1 در برنامه‌هایی که نیازمند کارایی بالایی بودند بود.

Blake2 خود به دو زیرگروه Blake2b و Blake2s تقسیم می‌شود. گفته می‌شود Blake2 از MD5، SHA-1، SHA-2 و SHA-3 سریع‌تر است و از لحاظ امنیت نیز با SHA-3، یعنی آخرین نسخه الگوریتم هش ایمن برابری می‌کند.

منبع:ارز دیجیتال

امتیاز دادن به خبر

با لایک کردن هر خبر می‌توانید کوین بیشتری جایزه بگیرید

مطالب مرتبط

تحلیل کاربران

soni3168

۱۴ آبان ۱۳۹۸

هش و هشینگ

این گفته یک رابط کاربری ریاضی است که مقدار مورد نظر رو به یک مقدار مورد نظر دیگر نظیر طول و عرض تبدیل میکنه.

Aminblue

۱۳ آبان ۱۳۹۸

تابع هش

من رشته کامپیوتر هستم و این تابع هش رو خوب توضیح داده بود مخصوصا برای کسانی که هیچ اطلاعی نداشتن .

elmira3030

۲۹ آذر ۱۳۹۸

هش

Hashing روشی است که برای بررسی یکپارچگی دیتا از آن استفاده می شود. Hash یک تابع یکطرفه است به این معنی که اگر دو کامپیوتر متفاوت یک دیتا را دریافت کنند و یک تابع hash یکسان را روی آن اجرا کنند باید مقدار hash یکسانی را بدست آورند. 

barogh

۱۳ آبان ۱۳۹۸

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

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

ashamsamani

۱۳ آبان ۱۳۹۸

کدگذاری هشینگ

این توابع خیلی جالب و امن هستند مثل کدهای اسکی و باینری در کامپیتور و برنامه نویسی این نشون دهنده پیشرفت سریع علم بسوی کدگذاری های نوین هستش

Morad1359

۱۳ آبان ۱۳۹۸

آزمایش جامع

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

saeedj22

۱۳ آبان ۱۳۹۸

هش

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

srb

۲۱ آبان ۱۳۹۸

بیت کویین

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

shoeyb_mirzaiee

۱۳ آبان ۱۳۹۸

هش ریت (HashRate) یا هش پاور (Hash Power)

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