هر کسی که تا به حال کد جاوا اسکریپت نوشته باشد ، می داند که این زبان open source (منبع باز) است. منبع باز بودن یک زبان برنامه نویسی هم محاسنی دارد و هم معایبی. یکی از معایب منبع باز بودن این است که همه می توانند ، کد شما را ببینند و از آن استفاده کنند و این یعنی کپی رایت هیچ معنی ای ندارد. شاید برای بعضی ها مشکلی نداشته باشد که کد هایشان را در اختیار همه بگذارند ، اما ممکن است شما دوست نداشته باشید کد هایتان برای همه قابل فهم باشد. برای حل این مشکل ما نیاز داریم کد های خود را Encryption (رمزگذاری) یا obfuscation (مبهم) کنیم.
تفاوت رمزگذاری و مبهم کردن کد (Encryption Or Obfuscation)
مثال می زنم:
- شما به دوستتان می گویید از این به بعد وقتی به تو گفتم "هر چه بادا باد" یعنی "بیا برویم بسکتبال بازی کنیم". این یعنی رمزگذاری.
- ولی وقتی با دوستتان به زبان زرگری صحبت می کنید (در زبان زرگری فقط تغییراتی در همین صحبت کردن معمولی ایجاد می شود که فهم آن برای همه ممکن نیست) در اصل دارید سخنانتان را مبهم می کنید.
مثال های خوبی بود!
در برنامه نویسی هم این موضوع صدق می کند. رمزگذاری یعنی تغییر دادن کد ها بر اساس یک رمز ثابت یا متغیر. ولی مبهم کردن یعنی تغییر ظاهر دادن آن ها.
مزیت رمزگذاری نسبت به مبهم کردن
- رمزگذاری امنیت بیشتری دارد و به سادگی قابل رمزگشایی نیست. حتی برنامه نویس های حرفه ای هم نمی توانند به راحتی آن را بفهمند ؛ زیرا در اصل تلفیقی از مبهم کردن و استفاده از برنامه نویسی سمت سرور است.
مزیت های مبهم کردن نسبت به رمزگذاری
- امنیت مبهم کردن پایین است و برای برنامه نویسان حرفه ای خیلی راحت قابل فهم است.
- مبهم کردن خیلی ساده تر است و کدنویسی خیلی کم تری دارد.
- مبهم کردن نیاز به هاست اختصاصی و برنامه نویسی سمت سرور ندارد و با همان جاوا اسکریپت به راحتی قابل پیاده سازی است.
توجه: شاید تعداد مزیت های مبهم کردن از رمزگذاری بیشتر باشد ، ولی این نشان دهنده بهتر بودن آن نیست.
نکته: از آنجایی که زبان جاوا اسکریپت یک زبان متن باز است ، مخفی کردن آن به طور 100% امکان پذیر نیست. هر چقدر هم که ما کد ها را مبهم و رمزگذاری کنیم ، در نهایت برای این که مروگر بتواند از آن استفاده کند باید به شکل معمول تبدیل شود. این موضوع یعنی بالاخره کد ها نمایان می شوند و برنامه نویسان با تجربه می توانند آن را به دست بیاورند.
پیشنهاد می کنم قبل از ادامه دادن مطلبی که درباره ی چگونگی ارتباط سرور و مرورگر است را مطالعه کنید. (لینک مطلب)
رمزگذاری چگونه انجام می شود؟
یک نمونه از رمزگذاری در سایت ها که بر روی اطلاعات ارسالی به سرور و دریافتی از آن انجام می شود ، پورت 443 یا همان https است. با استفاده از این پورت ، اطلاعات ارسالی توسط سرور در ابتدای راه رمزگذاری می شوند و هنگامی که به دست کاربر می رسند ، با استفاده از رمزی مشخص ، رمزگشایی می شوند. این کار کمک می کند تا اگر اطلاعات رد و بدل شده بین کاربر و سرور در بین راه توسط هکر ها لو رفت ، هکر نتواند از آن اطلاعات استفاده کند.
رمزگذاری برای اسکریپت های جاوا اسکریپت هم به همین شکل است. یعنی در سمت سرور ، کد ها توسط مدیر هاست ، رمزگذاری می شوند تا هکر نتواند در صورت دسترسی به سرور از کد ها سر در بیاورد. هنگامی که قرار است کاربری در صفحه ی سایت ، از آن اسکریپت استفاده کند ، کد ها با استفاده از رمز مشخص شده ، رمزگشایی می شوند و به کاربر ارسال می شوند.
با برنامه نویسی پیچیده تر می توان مشخص کرد که همه ی اسکریپت به صورت یکجا به کاربر داده نشود و هر بار فقط قسمتی از کد که لازم است از سرور به کاربر داده شود.
مبهم کردن چگونه انجام می شود؟
مبهم کردن با استفاده از همان جاوا اسکریپت قابل انجام است. در مبهم کردن ، کد به صورت یک مقدار string (رشته) وارد برنامه ای می شود. در آن برنامه روی کاراکتر تغییراتی انجام می شود. مثلا می توان در مقادیر binary (دو دویی) مربوط به هر کاراکتر تغییراتی ایجاد کرد و آن را با مقدار جدید جایگزین کرد. با این کار کد ما که بسیار قابل فهم و شبیه جاوا اسکریپت بوده ، تبدیل به کاراکتر هایی نامفهوم می شود که حتی ممکن است کاراکتر هایی به غیر از کاراکتر های زبان انگلیسی را در خود داشته باشد.
تا اینجای کار به نظر مبهم کردن امن تر از رمزگذاری است. اما این طور نیست.
اولین دلیل این است که در این روش ، در همان ابتدای کار کل اسکریپت به کاربر داده می شود. این یعنی کاربر می تواند هر چقدر که دوست دارد روی کد ها تغییرات ایجاد کند تا بالاخره به مقدار واقعی آن ها دست پیدا کند.
دومین دلیل هم این است که شما برای این که اسکریپت را برای کاربران از حالت مبهم خارج کنید ، لازم دارید برنامه ای با زبان جاوا اسکریپت بنویسید که مقدار مبهم را به صورت رشته دریافت کند و تمام کاراکتر ها را به حالت اول برگرداند تا برای مرورگر قابل فهم باشد. این یعنی این که شما مجبورید ، مسئله و راه حل آن را به کاربران بدهید.
با این که از توضیح درباره ی کد ها اصلا خوشم نمی آید اما مجبور شدم این مطلب را کاملا به صورت توضیحی و بدون کد بنویسم تا مقدمه ای برای موضوع رمزگذاری (encryption) و مبهم کردن (obfuscation) باشد. در مطالب بعدی همین مبحث را با مثال و کد بررسی خواهم کرد.