تاریخچه هش کردن

یک تابع هش عمومی نوع خاصی از عملکرد برنامه نویسی است که برای نقشه برداری از داده های اندازه دلخواه به داده های استفاده می شود یک اندازه ثابت. توابع هش از نیاز به فشرده کردن داده ها به منظور کاهش میزان حافظه مورد نیاز برای ذخیره پرونده های بزرگ. محبوب ترین مورد استفاده برای یک تابع هش مربوط به یک ساختار داده خاص دیگر به نام a است میز هش, که به طور گسترده ای برای جستجوی سریع داده ها استفاده می شود. توابع Hash با شناسایی هر دو هش دقیقاً یکسان به جستجوی جدول یا پایگاه داده کمک می کنند.

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

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

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

اصل کبوترخانه

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

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

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

در حالی که توابع هش دقیقاً از نگهداری پایگاه داده نشأت گرفته اند & نیازهای مدیریتی ، که بیش از هر چیز سرعت را ترجیح می دهند ، سودمندی آنها به سرعت پیشرفت می کند. شاخه خاصی از توابع هش که از حریم خصوصی ، امنیت پشتیبانی می کند, & شفافیت به زودی وارد این حوزه شد. شاخه ای از توابع هش که همچنان مورد توجه این مقاله خواهد بود: توابع هش رمزنگاری.

هش کردن رمزنگاری

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

عملکرد هش علامت گذاری

یک تابع هش رمزنگاری عمومی دارای دو ورودی است: پیامی که قرار است فشرده شود یا هش (x) & یک کلید (کلید) عمومی که نشان دهنده خروجی ثابت هش ما با حروف عددی است. نتیجه هش شده ما هضم یا هضم پیام (x *) نامیده می شود. این به صورت زیر است:

H (s ، x) = x *

بیایید نگاهی به این علامت گذاری بیندازیم و از طریق مثال واقعی هش کردن یک رشته با استفاده از یک تابع هش قبلاً استاندارد به نام MD5. بگویید ما می خواهیم از MD5 برای ایجاد “Hello World!” استفاده کنیم. رشته ما همچنین می دانیم که به طور پیش فرض MD5 همیشه یک رشته 128 بیتی (0 ثانیه) را خروجی می دهد & 1) این علامت گذاری به شرح زیر است:

H (128 ، x) = ed076287532e86365e841e92bfc50d8c

در واقع ، اگر جلو بروید & تهیه کنید عملکرد هش MD5 “سلام به جهان!” خودتان باید دقیقاً همان هش حاصل را ببینید. عالی. حالا بیایید به جلو برویم و نماد را برای یک برخورد تنظیم کنیم. علاوه بر متغیرهای قبلی H ، s ، x, & x * اکنون پیام دوم (x ’) را معرفی می کنیم. از نظر عددی ، هنگام هش کردن دو پیام مجزا (x) یک برخورد رخ می دهد & x ’) دقیقاً همان هضم پیام (x *) را نتیجه می دهد:

اگر H (128 ، x) = H (128 ، x ’) باشد ، گفته می شود که تابع هش ما (x) در x برخورد می کند & ایکس’.

ما اکنون علامت گذاری برای استاندارد برجسته فعلی رمزنگاری عملکرد هش را تنظیم کرده ایم. اگر یک دشمن بتواند (از نظر محاسباتی) باعث برخورد شود, یک عملکرد هش دیگر عملاً ایمن در نظر گرفته نمی شود.

بستن افکار تا دفعه بعد

آخرین تعریف ریاضی جایی است که جذابیت catch-22 برای عملکرد هش زندگی می کند. توابع هش از نیاز به فشرده سازی نشات گرفته است & داده های یکنواخت استاندارد را برای راحتی ذخیره سازی تولید کنید ، به این معنی که آنها رشته های شبه a را از بین می برند طول ثابت. با این حال به منظور ایجاد یک کاملاً مقاوم در برابر برخورد تابع هش ، هر پیام (x) باید دارای یک خروجی هش شده از طول ورودی. بدون هش های با طول ثابت ، توانایی استفاده از آنها را به عنوان یک ساختار داده مناسب از دست می دهیم ، اما با اختصاص یک طول ثابت ، عملکرد هش خود را کاملاً بدون برخورد ارائه نمی دهیم.

PS – من مطمئن هستم که برخی از شما کوکی های هوشمند متوجه شده اید که در مثال MD5 ما یک عملکرد هش را مشخص کرده ایم که یک رشته طول را برمی گرداند 128, با این حال “سلام به جهان!” هش بازگشت 32 رشته کاراکتر عددی دفعه بعد برگرد & ما بیشتر به توابع هش خواهیم پرداخت تا توضیح دهیم که این اختلاف از کجا ناشی شده است.