رمزنگاری HTTPS به بیان ساده !

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

اگر از خواندن این مقاله دنبال ساخت پروتوکل بعدی HTTPS هستید، اشتباه آمدید، کبوترهای نامه‌رسان کافی نیستند! در غیر این صورت یک چای دبش برای خودتان بریزید و لذت ببرید!

کبوتر نامه بر!

همه فعالیت‌هایی که شما در اینترنت انجام می‌دهید (از خواندن این مقاله گرفته تا خرید از آمازون و آپلود عکس‌های مختلف) در ارسال و دریافت پیام‌هایی از و به یک سرور خلاصه می‌شود.

این به نظر یک مقدار انتزاعی می‌آید، پس تصور کنید که این پیام‌ها که گفته شد توسط کبوتر نامه‌بر جابجا می‌شوند. شاید این قیاس به نظرتان بی‌اساس و شخصی بیاید اما به من اعتماد کنید! روش HTTPS همین‌طور کار‌ می‌کند، فقط اندکی سریع‌تر.

همچنین به جای این که درباره سرورها، کاربران و هکرها صحبت کنیم، از وِیس استفاده می‌کنیم. شاید بار اولتان باشد که درباره رمزنگاری می‌شنوید



اولین ارتباط ساده

اگر ویس بخواهد پیامی به من بدهد، آن را به پای کبوتر می‌بندد و برای من می‌فرستد. من هم دریافت می‌کنم به همین سادگی می‌خوانم.

اما اگر هکر در این بین کبوتر ویس را بگیرد و نامه را عوض کند چه؟ روح من هم از این تغییر خبر ندارد.

این همان روندی‌است که در ارتباط با سایت‌هایی که از HTTP استفاده می‌کنند رخ می‌دهد. پس بهتر است در فضای HTTP رمز کارت بانکیمان را هیچ‌وقت استفاده نکنیم.

یک رمز مخفی

هر چه باشد ویس و من مهارت‌هایی داریم! آن‌ها با هم قراری می‌گذارند که پیام‌هایشان را با یک رمز مخفی بنویسند. آن‌ها هر حرف را با ۳ حرف بعدی در ترتیب حروف الفبا جابجا می‌کنند. مثلاً الف←ت، ب←ث، پ←ج. پس عبارت رمزی «جپته هرگپ» به عبارت «پیام مخفی» رمزگشایی می‌شود.

به این روش الگوریتم کلید متقارن (symmetric key cryptography)می‌گویند چون اگر بدانید چطور رمزگذاری کنید، می‌دانید چطور رمزگشایی هم بکنید. شیوه رمز بالا به رمز سزار معروف است اما به طور روزمره از رمزهای پیچیده‌تر اما مشابهی استفاده می‌شود.

چطور درباره کلید رمز تصمیم می‌گیریم؟

روش کلید متقارن خیلی امن و مفید است اگر کسی جز فرستند و گیرنده از کلید رمزگشایی آن خبر نداشته باشد. مثلا در رمز سزار، کلید همان تعداد حرفی‌ست که باید به جلو برویم تا به حرف اصلی برسیم. در مثال ما کلید ۳ بود اما می‌توانست ۴ یا ۱۲ هم باشد.

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

این یک مثال مرسوم از روش هک حمله‌ی مرد میانی (Man in the Middle Attack) است و تنها راه جلوگیری از آن، تغییر همزمان کلیدهاست.

کبوترهایی که جعبه می‌برند

ویس و من یک راه بهتر برای حفاظت پیام‌ها پیدا کردیم. وقتی ویس می‌خواهد پیامی را به من بفرستد این مراحل را می‌رود:

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

به این ترتیب هکر نمی تواند تغییری در نامه بدهد چون کلید را ندارد. همین روند وقتی که من می‌خواهم با ویس صحبت کند طی می‌شود.

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

به بیان فنی، صندوق را کلید عمومی (Public Key) و کلید باز کردن آن را کلید خصوصی (Private Key) می‌گویند.

چطور به صندوق اطمینان کنم؟

اگر دقت کنید هنوز یک مشکل هست. وقتی من صندوق باز را دریافت می‌کنم چطور می‌توانم مطمئن باشد که صندوق را ویس فرستاده؟ از کجا معلوم بین راه هکر صندوق را عوض نکرده باشد؟

ویس تصمیم می‌گیرد که روی صندوق را امضا کند تا وقتی به دست من می‌رسد، اطمینان دهد که از او رسیده.

ممکن است فکر کنید چطور من امضای ویس را برای بار اول می‌شناسم؟ پرسش به جاییست! ویس و من هم همین مشکل را داشتیم و تصمیم گرفتیم صندوق‌ها را پادشاه امضا کند.

پادشاه را همه می‌شناسند و ضمناً قابل اعتماد هم هست. پادشاه امضایش را به همه نشان داده و همه هم می‌دانند که او فقط صندوق‌هایی را امضا می‌کند که مربوط به افراد قانونی و درست باشد.

پادشاه فقط در صورتی صندوق‌های ویس را امضا می‌کند که مطمئن شود خود ویس آن امضا را می‌خواهد. پس هکر نمی‌تواند به نیابت از ویس یکی از صندوق‌هایش را به امضای شاه برساند چون شاه حتما اصالت و شناسنامه‌ی او را چک می‌کند. در این صورت رامین هم متوجه کلاه‌برداری خواهد شد.

اگر بخواهیم فنی بررسی کنیم، پادشاه اینجا مرجع صدور گواهی دیجیتال (Certification Authority) است و مرورگری که شما همین الآن استفاده می کنید، از قبل امضای بسیاری از این مراجع را با خود دارد.

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

صندوق‌ها سنگین هستند!

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

آن ها تصمیم گرفتند که روش صندوق (رمزنگاری عمومی) را فقط زمانی استفاده کنند که می‌خواهند کلیدی را برای رمزنگاری به روش متقارن (مانند رمز سزار) انتخاب کنند.

به این ترتیب آن‌ها هم خدا را دارند و هم خرما را! هم اطمینان‌بخشی روش رمزنگاری عمومی را دارند و هم سرعت بهینه‌ی روش رمزنگاری متقارن را نگه می‌دارند.

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

حالا شما می‌دانید که HTTPS (که اول آدرس سایت‌های مهم دیده می‌شود) چطور کار می‌کند و از زرنگی ویس و رامین هم با خبر شدید! با خیال راحت چای بنوشید :)

** آنچه خواندید ترجمه‌ای بود از مقاله‌ی «HTTPS explained with carrier pigeons»، نوشته‌ی آندریا زانین که در بلاگ free code camp سایت مدیوم منتشر شده است. برای فهم بهتر، اسامی و ماجرا به ویس و من و هکر و پادشاه تغییر پیدا کرده‌اند.