علی فلاح
علی فلاح
خواندن ۵ دقیقه·۴ سال پیش

هش چیست و چقدر امنیت دارد؟ (به زبان ساده)

میدونستید که وقتی تو یه سایت ثبت نام میکنید و یه رمز عبور انتخاب میکنید رمز عبور شما HASH میشه؟

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

حالا ببینم به زبان ساده هش چیه:

هش یعنی درهم سازی. وقتی یه عبارتی رو هش میکنیم اون به یک عبارت با یک اندازه ثابت در میاد. در هش MD5 که درون سایت ها اکثرا استفاده میشه یه عبارت ۱۲۸ بیتی ساخته میشه یه مزیت مهمی که داره اینه که دیگه همیشه مقدار فیلدی که میخواهیم به رمز تخصیص بدیم ثابته.

چجوری هش یک کلمه با هش ۱۰۰ کلمه با هش یک صفحه متن و حتی هش یک فایل همش یه عبارت ۱۲۸ بیتی میشه. (برای اونایی که کامپیوتری نیستن و ۱۲۸ بیت رو درک نمیکنن به صورت اشتباه فرض کنید ۳۲ حرف میشه که شامل ۰ تا ۹ و حروف a تا f هست)

مثلا هش عبارت hello world به هگزا دسیمال به صورت زیر میشه:

5eb63bbbe01eeed093cb22bb8f5acdc3

میتونید عبارت های خودتون رو توی این سایت وارد کنید و مقدار هش شده اش رو ببینید (البته توصیه نمیکنم برای کنجکاوی رمز خودتون رو وارد کنید و ببینید که هش اش چی میشه چون احتمالا این سایت چیزایی که وارد میکنید رو به دیتابیس خودش اضافه میکنه)

برگردیم به سوال چجوری همه ورودی ها به یک عبارت با اندازه ثابت تبدیل میشه؟

کاری که هش انجام میده از نظر ریاضیات یه عملیات غیر قابل برگشت هست و ساده ترین مثال اش باقی‌مانده است.

برای مثال باقی مانده ۱۸ بر ۵ چند میشه؟ ۳

حالا آیا میتونید بگید چی عددی هست که باقی مانده اش بر ۵ سه میشه؟

۱۸؟

خیر جواب غلطه. چون عدد ۸ هم باقی مانده اش به پنج ۳ هست و حتی عدد ۱۳ هم باقی مانده اش ۳ هست جالب اینکه بی نهایت عدد وجود داره که باقی مانده اش بر ۵ سه هست.

این مفهوم برگشت ناپذیری بود. حالا شاید بهتر درک کنید چرا هش به یک مقدار با طول ثابت تبدیل میشه.

البته تابع هش یه تابع بزرگ ریاضیه که خیلی پیچیده تر از باقی مانده است.

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

برخی سایت ها اومدن یه دیتابیس درست کردن و هر عبارت و هش اون عبارت رو ذخیره کردن. این باعث میشه وقتی یه هش داشته باشید با جستجو در این دیتابیس متوجه بشید که چه عبارتی بوده که هش اش این شده.

اما بیایید ببینم که برای اینکه همه هش ها رو ذخیره کنیم به چند تا رکورد نیاز داریم.

در بالا گفتیم بزرگی عبارت هش شده در هش MD5 برابر ۱۲۸ بیت هست. این یعنی ۲ به توان ۱۲۸ حالت که میشود ۳۴۰ میلیارد میلیارد میلیارد میلیارد این یعنی اگر شما میخواهید تمام زوج های (عبارت،هش) رو ذخیره کنید نیاز به این مقدار فیلد برای ذخیره سازی دارید.

یعنی اگر هر عبارتِ داخلِ زوجِ (عبارت،هش) را یک بایت در نظر بگیرید (هرچند که نمیشه یک بایت باشه چون یک بایت نهایتا ۲۵۶ حالت ایجاد میکند اما برای نشان دادن بزرگی این عدد مقدار حداقل آن را بدست میاوریم تا ببینید حداقل به چه فضایی نیاز است) حداقل به ۳۴۰ میلیون میلیارد میلیارد ترابایت فضا نیاز است.

و حال فرض کنید ما توانستیم این مقدار داده را پردازش و ذخیره کنیم اگر بخواهیم در آن جستجوی خطی انجام بدهیم اگر فرض کنیم پردازنده ۳ گیگاهرتز و هر مقایسه در یک کلاک انجام شود یعنی در ثانیه ۳ میلیارد مقایسه انجام شود باید ۳۴۰ میلیارد میلیارد میلیارد میلیارد مقایسه صورت پذیرد که با تقسیم این مقدار به ۳ میلیارد مقایسه در ثانیه به عدد ۱۱۰ میلیارد میلیارد میلیارد ثانیه میرسیم و از تقسیم این عدد بر ۶۰ و ۶۰ و ۲۴ و ۳۶۵ به ۳ هزار میلیارد میلیارد سال میرسیم. یعنی برای جستجوی خطی درون این دیتابیس از زوج های‌(عبارت،هش) نیاز به ۳ هزار میلیارد میلیارد سال داریم.

این عدد نشون میده ذخیره تمام مقادیر ممکن برای هش از نظر حافظه و از نظر پردازش در دنیای واقعیات یک کار ناممکن است.

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

امیدوارم این مقاله در فهم شما درباره موضوع هش، امنیت و کاربردش به شما کمک کرده باشه.







هشhashتابع هشامنیت
توسعه دهنده
شاید از این پست‌ها خوشتان بیاید