یکی از مهمترین و اولین چالش هایی که در پیاده سازی یک پیام رسان(مثل بیشتر نرم افزارهای موبایلی با تعداد کاربر بالا) باید در نظر داشته باشید بحث امنیت و جلوگیری از لو رفتن متن پیام های ارسالی و دریافتی است.
من برای پیاده سازی چتزی شروع کردم به خواندن پروتکل های موجود و اینکه مسنجرهای معروف دنیا هر کدام از چه پروتکل هایی استفاده میکنند.
بطور مثال معماری ساختار رمزنگاری و تامین امنیت پیام های واتساپ رو از اینجا میتونید ببینید. یا پروتکل و روش هایی که سیگنال که یک پیام رسان برای چت دونفره امن می باشد را از اینجا میتوانید ببینید. اما برمیگردیم به سراغ تلگرام خودمان(!) که از نظر امنیت هم یکی از بهترین اپلیکیشن های دنیاست.
تلگرام برای رمزنگاری و تامین امنیت پیام ها از یک پروتکل ترکیبی خودساخته به نام MTProto استفاده میکند که ظاهرا با وجود جوایز گرانبهایی که تلگرام تعیین کرده تا به حال کسی نتوانسته آنرا هک کند.
دو ورژن از این پروتکل ارسال و دریافت پیام توسط تلگرام منتشر شده است که در حال حاضر تقریبا تمام نسخه های این اپلیکیشن از ورژن دو استفاده میکنند.
این پروتکل نه تنها روی اپلیکیشن های موبایلی بلکه روی اپلیکیشن های تحت وب و دسکتاپ هم جواب میدهد البته نه همه بخش های آن! ما هم در نهایت انتخابمان برای رمزنگاری پیام ها در چتزی چیزی جز MTProto نبود. بنظرمان این روش از دیگر روش های موجود کارامدتر و امن تر بود به اضافه اینکه با توجه به دسترسی به کدهای باز کلاینت های تلگرام براحتی هرجایی از منطق رمزنگاری را متوجه نشدیم میتوانستیم با مرور کدهای سمت کلاینت تا حد زیادی به روش انجام کار پی ببریم.
MTProto الگوریتم جدید و عجیب غریبی ندارد در واقع ترکیبی از یکسری روش های مرسوم گذشته است که با ترتیب و تنظیم جدیدی کنار هم قرار گرفته اند و تضمین میکنند که پیامی که بین کلاینت و سرور ردوبدل میشود تحت هیچ شرایطی قابل خواندن شدن توسط شخص ثالث نیست.
بنظرم قبل از اینکه با این پروتکل آشنا شوید نیاز است برخی مطالب پایه رمزنگاری مثل تبادل کلید، تبادل کلید دیف-هلمن،رمزنگاری RSA و استاندارد رمزنگاری پیشرفته AES را تا حدی مسلط باشید.
البته ذکر این نکته ضروری است که خود من گاهی برخی از این الگوریتم ها رو فراموش میکنم یا اینکه مثلا چی کدوم بود! ولی اگر یکبار منطق هر کدوم رو یاد بگیرید و درک کنید حتی اگه اسم یا کارکردشون رو فراموش کنید با یک نگاه سطحی سریع یادتون میافته داستان از چه قرار بود. در نتیجه خیلی نگران حجم زیاد،پیچیده و فرار این مطالب نباشید.
در MTProto ابتدا با استفاده از پروتکل RSA و DH هردو سمت سرور و کلاینت به یک کلید رمزنگاری مشترک میرسند که از دسترس شخص ثالث در امان است. از آن به بعد با استفاده از این کلید مشترک کلیه پیام ها رمز میشود و ارسال میشود. این بسته رمز شده کاملا امن است و رمز آن تا به حال شکسته نشده است.
در هر بسته پیام ارسالی علاوه بر Encrypted Data یک Message Key و AuthKey Id هم داریم که از اولی در فرایند ایجاد کلید متقارن و همچنین به عنوان یکجور Checksum استفاده میشود که مطمئن شویم بسته بصورت کامل و درست بدست ما رسیده و از دومی هم برای اینکه همان ابتدای ماجرا متوجه شویم که بسته توسط چه کاربری ارسال شده است استفاده میکنیم.
همانطور که پیش تر توضیح دادم و احتمالا خودتان هم متوجه شده اید کلید مشترک رمزنگاری برای هر کاربر منحصر بفرد است در نتیجه سرور وقتی میخواهد یک بسته را باز کند(Decrypt & Decode) با استفاده از AuthkeyId ارسالی در بسته ابتدا کلید کاربر مورد نظر را از دیتابیس دریافت میکند و سپس اقدام به باز کردن بسته میکند. در این فرایند اگر Message key ارسالی اشتباه تولید شده باشد کلید AES تولید شده قادر به باز کردن بسته ارسالی نخواهد بود و فرایند به خطا میخورد!
اگر میخواهید در مورد MTProto و امنیت در تلگرام بصورت تخصصی تر بدونید پیشنهاد میکنم این ویدئو رو یوتیوب ببینید.
در ادامه به سراغ TL Language میروم و بازهم از چالش هایمان در تولد و رشد پیام رسان چتزی خواهم نوشت.