چه تفاوت‌هایی میان Encryption و Hashing وجود دارد؟

Encryption و Hash دو اصطلاحی هستند که به جای یکدیگر استفاده می‌شوند، ولی به اشتباه! آیا شما تفاوت بین این دو را می‌دانید، و این که کدام یک را در کجا به کار ببرید؟ در این مقاله قصد داریم به بررسی تفاوت‌های اساسی بین هش و انکریپشن و این که هر یک را در چه موقعیت‌هایی می‌توان استفاده کرد بپردازیم. با سکان آکادمی همراه باشید.

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

محبوب‌ترین الگوریتم‌های هش 
- 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 یک روش ایده‌آل برای ذخیره کردن پسورد است، به این دلیل که الگوریتم‌های هشینگ ذاتا یک‌طرفه‌ هستند؛ با ذخیره کردن پسورد به صورت هش شده، برای افرادی که به اطلاعات هش شده دسترسی دارند بسیار مشکل است که بتوانند از روی مقدار هش، به استرینگ اصلی دسترسی پیدا کنند.

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

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

به طور کلی، دو نوع اصلی Encryption وجود دارد؛ الگوریتم‌های رمزنگاری متقارن و الگوریتم‌های نامتقارن. در الگوریتم‌های متقارن برای رمزنگاری و رمزگشایی تنها یک Key (کلید) لازم است ولی در الگوریتم‌های نامتقارن، یک کلید برای رمزنگاری نیاز است که تحت عنوان Public Key شناخته می‌شود و کلید دیگری هم برای رمزگشایی تحت عنوان Private Key مورد نیاز است. Public Key برای افرادی ساخته شده است که می‌خواهند برای ما پیام رمز شده بفرستند و Private Key برای رمزگشایی پیام رمز شده توسط ما استفاده می‌شود.

الگوریتم‌های محبوب رمزنگاری
- AES: هنگامی که صحبت از رمزنگاری متقارن به میان می‌آید، الگوریتم AES یک استاندارد طلایی به‌ حساب می آید و برای بیشتر موارد توصیه می‌شود (توصیه می‌شود هنگام استفاده از این الگوریتم، از کلید‌های 256 بیتی استفاده کنید.)

- PGP: الگوریتم PGP محبوب‌ترین الگوریتم در زمینه رمزنگاری نامتقارن است.

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

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

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

افراد زیادی که دراین زمینه کار می‌کنند برای خلاص شدن از سختی‌های مربوط به اشتراک کلید، نخست کلید خود را به وسیلهٔ Public Key برای شخص مورد نظر ارسال می‌کنند سپس برای ادامهٔ ارتباط، از روش رمزنگاری متقارن استفاده می‌کنند.

در صورتی که سوالی در مورد رمزنگاری یا هشینگ دارید، می‌توانید سوالات خود را در بخش نظرات این مقاله ارسال نمایید.

What is The Difference Between Hashing and Encrypting?

0







  • parsa در تاریخ: 1395/10/29

    با سلام و تشکر از مقاله خوبتون
    اصطلاح hash-key هم که بعضی جاها میگن پس غلطه درسته؟

  • محمد حسین جنتیان در تاریخ: 1395/11/04

    سلام خدمت شما hash-key چند تا معنی می تونه داشته باشه ولی اگه منظورتون اینه که هر دوتا با هم باشه بله غلطه، ولی اگر که معانی دیگه hash-key مد نظرتون باشه اصلا ربطی به موضوع این مقاله نداره. معانی دیگر hash-key : یکی از معانیش اینه # یا نامبر ساین یکی دیگه از معانیش شاید بتونه همون سالت باشه که توی الگوریتم های هشینگ به کار میره.

  • Hamid در تاریخ: 1396/01/09

    سلام. خیلی ممنون از مطلبتون. دو تا سوال داشتم.

    1 - آیا rainbow table صرفا یک دیکشنری است که شامل یک سری رشته و مقادیر هش شده آن رشته هاست ؟

    2 - چه روش های برای اشتراک کلید با ریسک کمتر پیشنهاد میشه ؟

    محمد حسین جنتیان در تاریخ: 1396/01/10

    سلام خدمت شما.
    بله یک جدول که preprocessed است.
    2-رمز نگاری های تو در تو مثل tor.

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