در دنیای امنیت اطلاعات(Information security)، اصطلاحاتی مثل فرمت دهی (Encoding) ، رمزنگاری (Encryption) ، هشینگ (Hashing) و مبهم سازی (Obfuscation) بسیار به کار میرن... این تکنیک ها هر کدوم برای اهداف مختلف طراحی شدن و راه ها(الگوریتم ها) مختلفی هم برای پیاده سازی اونها وجود داره. شاید اولش کمی گیج کننده باشه، ولی در واقع هر کدوم از این تکنیک ها کاربرد خاص خودش رو دارن و اصلاً ارتباطی با هم ندارن!
توی این مقاله سعی کردم به زبان ساده توضیح بدم که هر کدوم دقیقاً چیکار میکنن، چه الگوریتم هایی دارن و چرا باید بدونیم که کدوم رو کی استفاده کنیم.
1. فرمتگذاری (Encoding): فقط قالب عوض میشه!
فرض کنید میخواید یه عکس رو توی ایمیل ضمیمه کنید و بفرستید. ولی مشکل اینجاست که پروتکل های ایمیل (مثل SMTP) به طور مستقیم نمیتونن فایلهای Binary مثل عکس رو منتقل کنن، چون این پروتکلها فقط با متن ساده کار میکنن... برای حل این مشکل، شما(یا برنامه) اون عکس رو به یه قالب متنی Base64 تبدیل میکنید که قابل خوندن برای سیستم هایی که فقط متن ساده رو متوجه میشن، باشه. این تبدیل رو فرمت دهی (Encoding) میگن.
فرمت Base64 داده های باینری (مثل عکس و فیلم) رو به یه سری کاراکترهای متنی (از بین 64 کاراکتر مجاز ASCII) تبدیل میکنه. این کار باعث میشه که عکس شما به صورت متنی قابل ارسال باشه و وقتی به مقصد میرسه، باز هم بتونن اون رو به حالت اصلی برگردونن.
- هدف: فقط برای تبدیل داده ها به قالبی که سیستم ها بتونن باهاش کار کنن.
- امنیت: اصلاً امنیتی ایجاد نمیکنه! کسی که داده رو بگیره، می تونه به راحتی اون رو به حالت اولیه برگردونه.
- الگوریتمها: Base64, ASCII, URL Encoding, Unicode, Hexadecimal و...
مثال: وقتی دارید یه فیلم رو به MP3 تبدیل می کنید(که صداش رو در بیارید) دارید Encoding انجام میدید.
مثال عملی:
- فرض کنید یه عکس با نام
photo.jpg
دارید. -
با استفاده از تکنیک Encoding و بکمک الگوریتم Base64، این عکس به یه متن طولانی مثل این تبدیل میشه:
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwkHBgoJCAkLCwoMDxkQDw4ODx4WFxIZJCAm...
- حالا این متن رو میتونید توی ایمیل ضمیمه کنید و بفرستید.
- وقتی گیرنده ایمیل رو دریافت میکنه، میتونه این متن رو دوباره به حالت اصلی (عکس) تبدیل کنه!
2. رمزنگاری (Encryption): دادهها رو امن نگه میداره!
حالا فرض کنید که دارید اطلاعاتی رو ارسال می کنید که واقعاً مهمه و نمیخوایید کسی بتونه اون رو بخونه. اینجاست که رمزنگاری وارد میشه... این تکنیک داده ها رو به صورتی تبدیل میکنه که فقط کسی که کلید مناسب اش رو داره، بتونه اون رو باز کنه.
هدف: حفظ حریم خصوصی و جلوگیری از دسترسی غیرمجاز غریبه ها.
امنیت: بالاست، البته اگه از الگوریتم های خوب و بروز استفاده کنید!
الگوریتمها: AES, DES, RSA, DSA, Blowfish و...
مثال: وقتی از اپلیکیشن بانکی استفاده می کنید، اطلاعات شما با الگوریتم هایی مثل AES یا RSA رمزنگاری میشه تا هیچ کس نتونه اون رو بخونه، حتی بعد سرقت اش!
یا ابزارهای PGP/GPG که برای رمزنگاری های حرفه ای و امن استفاده میشن.
3. هشینگ (Hashing): یک طرفه و برای همیشه!
هشینگ داده ها رو به یه رشته ثابت و منحصر به فرد(Unique) تبدیل میکنه، ولی این تبدیل یک طرفه هست... یعنی اگه داده رو Hash کردید، دیگه نمی تونید اون رو به حالت اولیه برگردونید. این تکنیک معمولاً برای ذخیره سازی کلمات عبور یا اطمینان از یکپارچگی/Integrity داده ها استفاده میشه.
- هدف: ایجاد یه "اثر انگشت دیجیتال" برای داده ها.
- امنیت: اگه از الگوریتم های قوی استفاده کنید، خیلی امنه.
- الگوریتمها:
MD5,SHA1, SHA256, SHA512, RIPEMD, BLAKE و...
مثال: وقتی کلمه عبور خودتون رو توی یه وب سایت هنگام ثبت نام وارد می کنید، سیستم اون رو مستقیم ذخیره نمیکنه. بلکه اول Hash میکنه و بعد ذخیره میکنه. اینجوری حتی اگه کسی اطلاعات رو دزدید، نمیتونه کلمه عبور رو برگردونه.
یا مثلاً کل اطلاعات هارد درایو رو تبدیل به یک رشته Hash میکنن، و اون رشته Hash میتونه برای دست نخوردگی/یکپارچگی اطلاعات اون هارد درایو استفاده بشه.
4. مبهمسازی (Obfuscation): فقط پیچیده میکنه!
اگه میخوایید کسی نتونه کدهای برنامه نویسی پروژه شما رو بفهمه یا ازش سرقت کنه، می تونید از تکنیک مبهمسازی یا همون Obfuscation استفاده کنید... این تکنیک کد یا داده ها رو به شکلی درمیاره که فهمیدنش خیلی سخت بشه. البته این کار امنیت 100% ایجاد نمیکنه، فقط کار رو برای سارق/مهاجم سختتر میکنه.
- هدف: پنهان کردن منطق یا ساختار کد/داده ها.
- امنیت: ضعیفتر از رمزنگاری و هشینگ، اما بهتر از هیچی!
- ابزارها و روشها: ProGuard (برای جاوا)، UglifyJS (برای جاوااسکریپت)، Dotfuscator (برای .NET) و Themida و...
مثال: وقتی یه برنامه نویس میخواد کدش رو منتشر کنه، ولی نمی خواد کسی بتونه اون رو به راحتی تحلیل کنه، از ابزارهایی مثل ProGuard یا Themida استفاده میکنه.
- ابزارهای Hashing در ویندوز: FileVerifier++, HashCheck Shell Extension, certutil, HashCalc, hashcat
- ابزارهای Hashing در گنولینوکس: sha256sum, sha512sum, OpenSSL, hashcat
برای اینکه سریعتر متوجه بشید که هر کدوم چیکار میکنن:
- اگه فقط میخواید داده ها رو به قالب دیگه ای تبدیل کنید، از Encoding استفاده کنید.
- اگه می خواید داده ها رو امن نگه دارید و فقط کسایی بتونن اون رو بخونن که کلیدشو دارن، از Encryption کمک بگیرید.
- اگه میخواید از یکپارچگی و دست نخوردگی دادهها مطمئن بشید یا کلمات عبور رو ذخیره کنید، Hashing بهترین گزینه ست.
- و در آخر، اگه میخوایید کسی نتونه کد یا منطق شما رو بفهمه، از Obfuscation استفاده کنید.
(برای بزرگنمایی کلیک کنید)