آشنایی با تفاوت‌های Hashing ،Encrypting ،Encoding و Obfuscation


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

اِنکودینگ
Encoding هدفش تبدیل دیتا از یک نوع به نوع دیگر است و این تبدیل فرمت باید به نحوی انجام شود که دیتای مذکور بدون آنکه خراب شود، در سیستم‌های مختلف قابل‌استفاده باشد. به عنوان مثال، حروف و کاراکترهای موجود در یک ایمیل و یا کاراکترهای موجود در صفحات وب پس از اینکه به دادۀ باینری معادل‌شان تبدیل شدند، می‌توانند توسط سیستم‌های مختلف ارسال و دریافت شوند. در این مثال، منظور از انکودینگِ کاراکترها به صورت اعداد باینری به هیچ عنوان محرمانه ماندن اطلاعات نیست بلکه هدف این است که این کارکترها بتوانند به طور مناسبی بر اساس نیاز سیستم‏‌های مختلف مورد استفاده قرار بگیرند.

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

برای دیکود کردن به هیچ‌گونه Key (کلید) نیازی نیست و تنها با استفاده از همان الگوریتمی که بواسطهٔ آن عمل اِنکود انجام می‌شود، می‌توان دیتا را دیکود کرد و از الگوریتم‌های اِنکودینگ رایج نیز می‌توان ASCII ،UNICODE ،URL ENCODING و BASE64 را نام برد (واقعیت این است که الگوریتم‌های فوق‌الذکر جداولی هستند که با استفاده از آن‌ها معادل کاراکترها پیدا می‌شود و اساساً هیچ پروسهٔ پیچیده‌ای وجود ندارد.)

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

به عبارتی، هدف از اِنکریپشن، فارغ از اینکه دیتای مد نظرمان به چه صورتی قرار است استفاده شود، این است که دیتای ارسالی تنها توسط مصرف‌کننده یا مصرف‌کننده‌هایی که مد نظر ما هستند قابل‌استفاده باشد. در واقع، اِنکریپشن دیتا را به نحوی تبدیل به دیتای دیگر می‌کند که تنها فرد یا افراد خاصی از طریق کلیدی که در اختیار دارند قادر به بازیابی دیتای اصلی باشند (الگوریتم‌های AES ،Blowfish و RSA نمونه‌هایی از الگوریتم‌های اِنکریپشنی هستند که مورد استفاده قرار می‌گیرند.)

عملیات اِنکریپشن بر روی دیتای اصلی یا به اصطلاح Plaintext، با استفاده از یک الگوریتم پیچیده و یک کلید انجام می‌شود که نتیجۀ این عملیات تولید دیتای رمزنگاری‌شده یا به اصطلاح Ciphertext می‌باشد (به صورت مشابه، عملیات بازیابی Decryption نامیده می‌شود.) به طور کلی، آنچه در اینجا حائز اهمیت است اینکه کلید مذکور باید محرمانه و تنها در اختیار افرادی باشد که قرار است Plaintext را از روی Ciphertext بازیابی کنند.

هَشینگ
Hashing با هدف محافظت از مفهوم Data Integrity به معنی «اصالت داده» یا «تمامیت داده» است. به عبارتی، دیتا اینتگریتی به این معنا است که اگر تغییری در دیتای اصلی به وجود آمد، فردی که قرار است از آن استفاده کند متوجه این تغییر بشود و دریابد دیتایی که در دست دارد دیگر دیتای اصلی نیست (از الگوریتم‌های معروف هَشینگ می‌توان SHA-3 و MD5 را نام برد.) از لحاظ فنی، هَشینگ ورودی دلخواه را دریافت کرده و یک اِسترینگ با طول ثابت تولید می‌کند که به طور کلی الگوریتم‌های هَشینگ باید ویژگی‌های زیر را داشته باشند:

- با ورودی‌های یکسان باید خروجی‌های یکسان تولید شود.
- با ورودی‌های متفاوت نباید خروجی یکسان تولید شود.
- بازیابی دیتای ورودی از روی دیتای خروجی غیرممکن باشد.
- هر تغییری هرچند اندک در ورودی، منجر به تغییر قابل‌توجهی در خروجی شود. به عبارت دیگر اگر دو دیتای ورودی داشته باشیم که تفاوت اندکی با یکدیگر داشته باشند، خروجی‌های‌ آن‌ها باید تفاوت زیادی با یکدیگر داشته باشند.

با ترکیب مفاهیم Hashing و Authentication می‌توان یک ناظر قوی درست کرد که نشان دهد آیا پیام ارسالی توسط فرستنده تغییر کرده است یا خیر که این تَسک بدین صورت انجام می‌شود که فرستنده ابتدا پیام ارسالی‌ خود را هَش می‌کند سپس با استفاده از کلید خصوصی‌ خود آن را امضاء (اِنکریپت) می‌کند. وقتی که گیرنده پیام را به همراه امضای فرستنده دریافت می‌کند، ابتدا امضاء را با استفاده از کلید عمومی فرستنده باز می‌کند تا هشِ پیام را به دست بیاورد سپس پیام دریافتی را هَش کرده و این دو هَش را با هم مقایسه می‌کند و در صورتی که هر دو یکسان باشند، می‌توان نتیجه گرفت که پیام دست‌نخورده است و توسط همان فرستنده‌ای که انتظارش را داریم ارسال شده است.

آبفاسکیشن
Obfuscation بر روی دیتا بدین منظور انجام می‌شود تا فهم آن دشوار شده و به سختی بتوان آن را کپی کرد و یا مورد سوء‌استفاده قرار داد. یک کاربرد بسیار متدوال انجام آبفاسکیشن بر روی سورس‌کدهای اپلیکیشن‌های مختلف است که هدف از این کار جلوگیری از تکثیر غیرمجاز محصولی است که به روش مهندسی معکوس قابلیت بازتولید داشته باشد.

باید به این نکته اشاره شود که آبفاسکیشن در زمینۀ مراقبت از دیتا به اندازۀ اِنکریپشن قوی نیست اما می‌تواند به صورت یک مانع عمل کند. همان‌طور که در اِنکودینگ می‌توانیم عمل عکس را انجام دهیم و دیتای اصلی را بازیابی کنیم، در آبفاسکیشن نیز در بیشتر موارد این امکان وجود دارد.

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

شاید این سؤال در مورد آبفاسکیشن مطرح شود که «چه موقع به جای اِنکریپشن از آبفاسکیشن استفاده می‌شود؟» که در پاسخ به این سؤال می‌توان گفت که آبفاسکیشن و اِنکریپشن در واقع دو کاربرد جدا دارند به طوری که هدف از اِنکریپشن این است که فردی که کلید ندارد قادر به بازیابی دیتای اصلی نباشد اما در آبفاسکیشن هدف این است که استفاده از دیتای اصلی برای یک کاربر (که این کاربر می‌توان انسان، کامپیوتر یا هر چیزی باشد) دشوار و برای کاربری دیگر راحت و آسان باشد. مثلاً پس از انجام آبفاسکیشن بر روی سورس‌کد یک اپ موبایل، فهم سورس‌کد و استفاده از آن برای انسان سخت می‌شود اما همان کد برای سیستم‌عامل به راحتی قابل‌استفاده است.

جمع‌بندی
در اِنکودینگ امکان استفاده از دیتا از کسی گرفته نمی‌شود و برای انجام عمل معکوس آن به راحتی می‌توانیم به همان صورت که عملیات اِنکودینگ را انجام دادیم، عملیات دیکودینگ را انجام دهیم و اساساً برای این منظور نیازی به کلید نداریم اما در اِنکریپشن محرمانه بودن دیتا حفظ می‌شود و  فردی که قرار است به دیتای اصلی دسترسی داشته باشد، باید از یک کلید برخوردار بوده که این کلید نیز محرمانه است و در اختیار همه قرار نمی‌گیرد. هَشینگ کمک می‌کند که «اصالت دیتا» مورد ارزیابی قرار بگیرد به این صورت که اگر تغییری هرچند ناچیز در دیتای اصلی صورت بگیرد، این تغییر منجر به تغییری واضح و آشکار در خروجی هَشینگ می‌شود و آبفاسکیشن برای گنگ و مبهم کردن و ایجاد مانع در فهم یکسری دیتا مورد استفاده قرار می‌گیرد که این کار اغلب در مورد سورس‌کدهای برنامه‌های کامپیوتری و به منظور جلوگیری از مهندسی معکوسِ آن‌ها و هرگونه سوء‌استفاده به کار گرفته می‌شود.

منبع


محمدرضا نوشادروان