تفاوت Encryption , hashing , encoding قسمت دوم


تا به اینجای کار یک دیدِ کلی از رمزنگاری پیدا کردیم . در ادامه به hashing functions می پردازیم .

یکی از اصلی ترین نیاز های جوامع بشری این است که بتوانند بین چیزهای مختلف فرق بگذارند . توانایی تشخیص دقیق افراد از یکدیگر یکی از اساس قانون و برقرای عدالت می باشد . فرض کنید معیاری برای تشخیص دقیق انسان ها از یکدیگر نبود . آنوقت افراد با ویژگی های ظاهری شبیه به هم میتوانستند هرکاری را به اسم فردی دیگر انجام دهند بدون در نظر گیری عواقب آن .

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

امضایِ نقاشِ بزرگ ؛ وینست ون گوک
امضایِ نقاشِ بزرگ ؛ وینست ون گوک


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

همین مثال را در ارتباطات بین کامپیوتر های بررسی کنیم . فرض کنید یک سِروِر در نقطه ی A قرار داره . افراد از نقاط مختلف میتونن به این سرور درخواست بزنند و سرور در جواب برای اون ها یک فایل ویدئویی که حاوی فیلم سینمایی The Dark Knight هست رو بفرسته . یک سیستم در نقطه ی B درخواست رو میزنه و سرور هم در جواب براش این فایل رو میفرسته . حالا سوالی که پیش میاد اینه که اون فرد B از کجا بفهمه که این فایلی که روی سیستمش دانلود شده همون فایلی هست که روی سرور قرار داده شده ؟ چرا که ممکنه یک نفر در این بین محتویات دیتا رو تغییر داده باشه و فرضا یک ویروس خطرناک رو به دیتای مذکور اضافه کرده باشه .


اینجاست که hash به کمک ما میاد .

توابعِ hash توابعی هستند که دارای ویژگی های زیر باشند
1) اولین و اصلی ترین ویژگی آنها باید این باشد که یک طرفه باشند . یعنی با داشتن دیتای هش شده و تابعِ هش ، نشه به دیتای اولیه رسید . برعکس رمزگذاری که با داشتن دیتای انکریپت شده و کلید میشد به دیتای اولیه ( plain text ) رسید ، در هش این اتفاق نباید بیفته .
2) توابع هش باید سریع باشند.یعنی نباید تولید دیتای هش شده زمان زیادی ببره.
3) هیچ دو ورودی غیر یکسانی نباید خروجی یکسان داشته باشند ( بسیار مهم ) .
4) مهم نیست که دیتای ورودی که به تابع هش داده میشه اندازه اش چقدر باشه ، در هر صورت خروجی ای که تابعِ هش تولید میکنه باید اندازه اش یه مقدارِ ثابت ( فیکس ) باشه . یعنی چه یک بایت به عنوان ورودی بهش بدیم چه 10 گیگابایت فرقی نداره ، در هر صورت تابع هش فرضا یه خروجی به طولِ 256 بایت تولید میکنه برامون.
5) با یک تغییر کوچک در ورودی ، خروجی به مقدار خیلی زیادی فرق میکنه . البته همونطور که توی مورد شماره ی 4 گفتم اندازه یا طولِ خروجی فرقی نمیکنه ، فقط خودِ محتویات هش تغییر میکنن . مثال
Mahdi. ------------> تابعِ هش ------------> qndq1wkWDc57nbni
Mahdi! ---------------> همون تابعِ هش -----------> iglw97aww0QQQacg
فرایندِ هش کردنِ دیتا
فرایندِ هش کردنِ دیتا


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

یک استفاده ی دیگه از هش : توی ارتباطات کامپیوتری پسورد ها نقش خیلی مهمی دارند و بدون اون ها عملا امنیتی وجود نداره . یکی از مشکلاتی که هست اینه که فرضا شما قراره به یک وبسایت یه درخواست (request) بفرستید و توی اون درخواست پسوردتون رو وارد کردید . خوب با این شرایط ، حتی با وجود اینکه دیتای شما رمزگذاری شده ، اگر یه نفر بتونه یه جوری دیتای شما رو به سرقت ببره یا به کلید رمز دسترسی پیدا کنه ، اون وقت پسورد شما هم به سرقت میره و کلی مشکلاتِ دیگه به وجود میاد . چاره ی این مشکل هم hash می باشد . چطوری ؟

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

توابع معروفِ هش :

SHA256 , SHA512 , MD5

اما encoding , decoding چیست ؟

از لحاظی تئوری انکدینگ مثل رمزگذاری عمل میکنه ، یعنی اینکه الگوریتم هاش دو طرفه هستند . اما هدفش برقراری امنیت در ارتباطات نیست . انکدینگ صرفا به فرآیند تبدیلِ داده به یک استاندارد متفاوت هست برای مثال حتی تبدیل مبنا هم نوعی انکدینگ به حساب میاد یا حتی کد های اَسکی (ASCII) هم که کارکتر های مختلف رو به عددی در مبنای دو تبدیل می کنه هم نوعی encoding هست . همونطور که گفته شد هدف از انکد کردن دیتا ، مخفی سازی اون دیتا نیست ؛ چون اصلا برای اینکار ما ازش استفاده نمیکنیم و الگوریتم هاش به راحتی قابل دیکود (decode ) کردنه و بیشتر جهت این استفاده میشه که داده هامون رو متناسب با شرایط کنیم . مثلا متد انکودینگِ base64 میاد و استاندارد یا محتویات فایل رو یع تغییر کوچیک میده تا این دیتا هنگام عبور از شبکه توسط مودم ها و روتر ها به عنوان یک دستور شناخته نشن و مشکلی به وجود نیار

متد های انکدینگ معروف :

UTF8 , base64 , ASCII




جمع بندی تفاوت hashing , encryption :

1) هدف از رمز گذاری ، مخفی کردنِ فایل و برقراری امنیت می باشد اما هش کردن با هدف چک کردن درستی و اصل بودنِ دیتا ها استفاده میشه

2) توابع و الگوریتم های رمزنگاری دوطرفه هستند و با داشتن کلیدِ رمز و دیتای رمزگذاری شده میتوان به دیتای اصلی ( plain text ) رسید . اما توابع هش یک طرفه هستند و با دانستن تابعِ هش و دیتای هش شده نمیتوان به دیتای اصلی رسید .

3) در رمزگذاری ، دیتای رمزگذاری شده اندازه اش متناسب با دیتای ورودی می باشد ، یعنی فرضا هرچقدر دیتایی که میخواهیم رمزگذاری اش کنیم بیشتر باشد ، اندازه و حجم دیتای رمزگذاری شده هم بیشتر میشود . اما در هش متناسب با تابع استفاده شده برای هش ، این مقدار خروجی ثابت می باشد . فرضا اگر تابع هش قرار باشد خروجی ای 32 بیتی تولید کند ، فرقی ندارد که یک فایل ویدئویی 2 گیگابایتی را هش کنید یا یک متنه یک خطه ، در هر دو حالت رشته ای که به عنوان هش تولید میشود 32 بیت دارد .

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

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

بدرود .