Encryption و Hash دو اصطلاحی هستند که به جای یکدیگر استفاده میشوند، ولی به اشتباه! آیا شما تفاوت بین این دو را میدانید و اینکه کدام یک را در کجا به کار ببرید؟ در این مقاله قصد داریم به بررسی تفاوتهای اساسی بین هَش و اِنکریپشن و اینکه هر یک را در چه موقعیتهایی میتوان استفاده کرد بپردازیم.
Hashing چیست؟
Hashing به بیان ساده عبارت است از تبدیل یک عبارت ورودی به یک عبارت خروجی ولی یک خروجی که دیگر قابل تبدیل به ورودی اولیه نیست و طبق یکسری الگوریتمهای خاص، مقدار هَش محاسبه شده و این مقدار همیشه به ازای یک ورودی خاص، یکتا است. نتیجهٔ عمل هَش یک مجموعه کاراکتر با طول ثابت است که با تغییر کوچکی در استرینگ ورودی، تغییرات زیادی در نتیجهٔ خروجی حاصل خواهد شد. بهترین الگوریتمهای هَشینگ برای این طراحی شدند که امکان پیبردن به استرینگ اصلی که هَش شده است غیرممکن باشد.
آشنایی با محبوبترین الگوریتمهای Hashing
MD5: یکی از معروفترین الگوریتمهای هَشینگ، MD5 است. این الگوریتم یک استرینگ 16بایتی به عنوان خروجی ایجاد میکند که معمولاً به شکل یک رشتهٔ 32 عددی نمایش داده میشوند. اخیراً چندین آسیبپذیری در MD5 کشف شده است و Rainbow Table آنها منتشر شده که به افراد اجازه میدهد که به استرینگ اصلی دسترسی پیدا کنند؛ البته این آسیبپذیری در صورتی است که از Salt (مجموعه بیتهای تصادفی که هرچه طولشان بیشتر باشد برای عملیات هَشینگ بهتر است) بهخوبی استفاده نشده باشد (به خاطر داشته باشیم که Rainbow Table به جداولی گفته میشود که مقادیر مختلفی همچون لیست پسوردهای مختلف یا ... را به صورت هَش شده نگاهداری میکنند و باعث سریعتر شدن عملیات پیدا کردن پسورد میشوند).
به عنوان مثال، نتیجهٔ هَش شدن استرینگی همچون sokanacademy در زبان برنامهنویسی پایتون عبارت است از a8e8cb2fa7cf9e2d15f545292d2ad997 که در نمونه کد زیر به خوبی نشان داده شده است:
import hashlib
hash_object = hashlib.md5(b'sokanacademy')
print(hash_object.hexdigest())
SHA: به طور کلی، سه نوع الگوریتم SHA وجود دارد که عبارتند از SHA-1 ،SHA0 و SHA-2. الگوریتم SHA-0 به دلیل وجود آسیبپذیری به ندرت مورد استفاده قرار میگیرد و این در حالی است که خطاها و آسیبپذیریهای SHA-0 در نسخهٔ SHA-1 اصلاح شدهاند. SHA-1 بیشترین استفاده را در بین الگوریتمهای SHA دارد و یک رشتهٔ 20بایتی به عنوان خروجی تولید میکند. SHA-2 هم شامل یک مجموعهٔ 6 عضوی از الگوریتمهای هَشینگ است؛ SHA-256 و نسخههای بالاتر برای مواقعی که امنیت بسیار مهم است توصیه میشوند (همچنین لازم به ذکر است که SHA-256 رشتهٔ 32بایتی تولید میکند).
چه مواقعی Hashing باید مورد استفاده قرار گیرد؟
Hashing یک روش ایدهآل برای ذخیره کردن پسورد است به این دلیل که الگوریتمهای هَشینگ ذاتاً یکطرفه هستند؛ با ذخیره کردن پسورد به صورت هَش شده، برای افرادی که به اطلاعات هَش شده دسترسی دارند بسیار مشکل است تا بتوانند از روی مقدار هَش، به استرینگ اصلی دسترسی پیدا کنند.
هنگامی که شما یک پسورد را به صورت هَش شده ذخیره میکنید، در زمان ورود به سیستم که کاربر پسورد خود را وارد میکند، این پسورد به هَش تبدیل شده و با هَش ذخیره شده به عنوان پسورد کاربر که قبلاً در دیتابیس ذخیره شده است مقایسه میشود؛ اگر هر دو با هم برابر بودند که کاربر به عنوان کاربر مجاز شناخته شده و امکان دسترسی به سیستم به او داده میشود ولی در صورت برابر نبودن پسورد ورودی با مقدار هَش ذخیره شده، امکان دسترسی کاربر به سیستم وجود نخواهد داشت.
هَشینگ برای موقعیتهایی که میخواهید ورودی کاربر را با مقدار ذخیره شده مقایسه کنید ولی نمیتوانید مقدار ذخیره شده را به فرم ساده و بدون هَش (به دلایل امنیتی) ذخیره کنید بسیار خوب است. در موارد دیگر میتوانید از هَش برای بررسی صحت کارتهای اعتباری که توسط کاربر وارد میشوند نیز استفاده کنید یا حتی میتوانید مقدار هَش یک فایل را با مقدار هَش تولید شده توسط سازندهٔ آن فایل مقایسه کنید و مطمئن شوید فایل دستکاری نشده است (برای کسب اطلاعات بیشتر، به مقالهٔ منظور از MD5 ،SHA-1 و SHA-256 در کنار فایلهای دانلودی چیست؟ مراجعه نمایید).
Encryption چیست؟
رمزنگاری وظیفهٔ تبدیل دادهها به فرم غیرقابل خواندن را برعهده دارد اما این در حالی است که طول استرینگ رمزنگاری ثابت نیست. تفاوت اصلی بین اِنکریپشن و هَشینگ این است که چنانچه شما به کلیدی خاص دسترسی داشته باشید، امکان Decrypt (دکیپت یا رمزگشایی) کردن استرینگی که به صورت رمز درآمده است را خواهید داشت.
به طور کلی، دو نوع اصلی Encryption وجود دارد که عبارتند از الگوریتمهای رمزنگاری متقارن و الگوریتمهای نامتقارن. در الگوریتمهای متقارن برای رمزنگاری و رمزگشایی تنها یک Key (کلید) لازم است ولی در الگوریتمهای نامتقارن، یک کلید برای رمزنگاری نیاز است که تحت عنوان Public Key شناخته میشود و کلید دیگری هم برای رمزگشایی تحت عنوان Private Key مورد نیاز است. Public Key برای افرادی ساخته شده است که میخواهند برای ما پیام رمز شده بفرستند و Private Key برای رمزگشایی پیام رمز شده استفاده میشود.
الگوریتمهای محبوب رمزنگاری
AES: هنگامی که صحبت از رمزنگاری متقارن به میان میآید، الگوریتم AES یک استاندارد طلایی به حساب میآید و برای بیشتر موارد توصیه میشود (توصیه میشود هنگام استفاده از این الگوریتم، از کلیدهای 256بیتی استفاده کنید).
PGP: الگوریتم PGP هم محبوبترین الگوریتم در زمینهٔ رمزنگاری نامتقارن است.
چه موقع باید از رمزنگاری استفاده نمود؟
رمزنگاری زمانی باید مورد استفاده قرار گیرد که بخواهیم متنی که ارسال میکنیم را بعداً رمزگشایی نماییم. برای مثال، فرض کنید میخواهید یک پیام محرمانه برای دوستتان بفرستید؛ در چنین شرایطی باید پیام خود را رمزنگاری نمایید تا کسی به سادگی امکان خواندن متن پیام را در بین راه نداشته باشد. همچنین پیام باید به فرمی ارسال شود که قابل رمزگشایی شدن باشد نه این که فقط رمز شده باشد که در این صورت غیرقابل استفاده خواهد بود.
اگر شما زمانی به این نتیجه رسیدید که Encryption ضروری است، نخست باید تصمیم بگیرید از الگوریتمهای متقارن استفاده کنید یا از الگوریتمهای نامتقارن؛ الگوریتمهای متقارن کارایی و سرعت بهتری را نسبت به الگوریتمهای نامتقارن دارند همچنین استفاده از الگوریتمهای متقارن سادهتر از استفاده از الگوریتمهای نامتقارن میباشد، ولی به هر حال کلید باید توسط سیستم و کاربر و نرمافزار شناخته شده باشد که در بعضی مواقع این موضوع باعث بالا رفتن ریسک پخش شدن کلید در میان کاربرانی میشود که نباید از این موضوع اطلاع داشته باشند.
اگر میخواهید برای شخصی در آن طرف کرهٔ زمین پیام محرمانهای ارسال کنید، قبل از آنکه بخواهید پیام محرمانه ارسال کنید، نخست باید یک روش امن برای تبادل کلید اختصاصی با شخص مد نظر پیدا کنید. اگر شما کانالی امن سراغ دارید که کلید خود را از طریق آن ارسال نمایید، میتوانید پیام رمز شده را هم از همان طریق ارسال نمایید (افراد زیادی که در این زمینه کار میکنند برای خلاص شدن از سختیهای مربوط به اشتراک کلید، نخست کلید خود را به وسیلهٔ Public Key برای شخص مورد نظر ارسال میکنند سپس برای ادامهٔ ارتباط، از روش رمزنگاری متقارن استفاده میکنند).