مردم VPN را «سیستمی که از رمزنگاری کلید عمومی استفاده می‌کند» توصیف می‌کنند و بعد تصور می‌کنند هر بسته با گواهی سرور قفل می‌شود. این تصویر به شکلی غلط است که هنگام خواندن یک فایل پیکربندی یا یک ضبط بسته اهمیت دارد. نیمه‌ی کلید عمومی در VPN درباره اثبات این است که همتا کیست و توافق بر ماده‌ی محرمانه؛ نیمه‌ی متقارن همان چیزی است که واقعاً از ترافیک محافظت می‌کند، بسته به بسته، در تمام عمر نشست.

دو نیمه طول عمر، حالت‌های خرابی و چیزهایی که می‌توانید با خیال راحت منتشر کنید متفاوت دارند. وقتی آن‌ها را جدا کنید، پرسش‌هایی مثل «آیا RSA 2048 از AES-128 ضعیف‌تر است» دیگر گیج‌کننده نیستند، چون هرگز قابل مقایسه نبودند.

سه عملیاتی که با هم اشتباه گرفته می‌شوند

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

دست‌دادن‌های VPN بیشتر از دو مورد اول استفاده می‌کنند. گواهی کلید رمزنگاری نیست؛ بیانیه‌ای امضاشده است که نامی را به یک کلید عمومی پیوند می‌دهد و به طرف دیگر اجازه می‌دهد تصمیم بگیرد به کلیدی که تازه دریافت کرده اعتماد کند یا نه. مثلاً برپایی کلید در TLS 1.3 بر توافق کلید (EC)DHE به‌علاوه امضاهای گواهی استوار است، نه بر رمزنگاری نشست با کلید عمومی سرور.

دست‌دادن در واقع چه چیزی تولید می‌کند

در یک دست‌دادن مدرن، هر طرف یک جفت کلید گذرا می‌سازد، نیمه‌های عمومی را مبادله می‌کند و یک راز مشترک محاسبه می‌کند که هرگز از سیم عبور نمی‌کند. آن راز سپس از یک تابع مشتق‌سازی کلید می‌گذرد تا کلیدهای جداگانه برای هر جهت، به‌علاوه nonceها و ماده‌ی IV موردنیاز لایه‌ی رکورد، تولید شود. WireGuard این کار را با ساخت مبتنی بر Noise انجام می‌دهد؛ TLS 1.3 آن را با HKDF روی رونوشت دست‌دادن انجام می‌دهد.

اعتبارنامه‌ی بلندمدت — گواهی و کلید خصوصی، یا یک کلید ثابت WireGuard — همان تبادل را احراز هویت می‌کند. در رونوشت امضا می‌کند یا با آن مخلوط می‌شود تا غریبه‌ای نتواند دست‌دادن را به جای همتا کامل کند. پس از آن، اعتبارنامه کار هر بسته را انجام نمی‌دهد. اگر انجام می‌داد، هر بسته به یک عملیات کلید خصوصی نیاز داشت و یک تونل شلوغ به کندترین عملیات در پشته محدود می‌شد.

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

چرا داده‌های انبوه از کلیدهای متقارن استفاده می‌کنند

رمزهای متقارن حجم را خوب تحمل می‌کنند: AES-GCM یا ChaCha20-Poly1305 هر بسته را با کلیدی که از پیش در حافظه است پردازش می‌کنند، سرآیند را احراز هویت می‌کنند و یک شمارنده را افزایش می‌دهند. طرف گیرنده nonce و برچسب احراز هویت را بررسی می‌کند و هر چیزی را که شکست بخورد یا تکرار شود دور می‌اندازد. این برای اجرا با سرعت خط روی سخت‌افزار معمولی به‌قدر کافی ارزان است و همان ساخت، محرمانگی و یکپارچگی را در یک گذر می‌دهد.

ساخت همان جایی است که بیشتر اشتباهات پیاده‌سازی در آن زندگی می‌کنند. nonce تکراری در GCM محرمانگی و اصالت را همزمان می‌شکند، بنابراین پروتکل‌ها برای هر جهت کلید مشتق می‌کنند و یک شمارنده یا دوره‌ی صریح نگه می‌دارند. اگر ضبط بسته‌ای می‌خوانید و طول متن رمزشده با متن ساده به‌علاوه یک سرباز ثابت مطابقت دارد، لایه‌ی متقارن کار می‌کند، نه یک عملیات کلید عمومی برای هر بسته.

طول عمر، تجدید کلید و محرمانگی رو به جلو

کلیدهای نشست برای منقضی شدن‌اند. TLS 1.3 به پیام KeyUpdate اجازه می‌دهد کلیدهای ترافیک را بچرخاند؛ WireGuard پس از زمان یا تعداد پیام پیکربندی‌شده نشست را تجدید می‌کند و کلید قدیمی را برای مدتی کوتاه برای بسته‌های در راه نگه می‌دارد. OpenVPN کلیدهای کانال داده‌اش را طبق برنامه دوباره مذاکره می‌کند و reneg-sec فاصله را کنترل می‌کند.

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

خواندن تنظیمات و عیب‌یابی بدون مخلوط کردن اشیا

در عمل شما یک پروتکل کامل و ابتدایی‌های پشتیبانی‌شده‌اش را انتخاب می‌کنید، نه اینکه پروتکل خودتان را سرهم کنید. کلید --tls-crypt در OpenVPN کانال کنترل را محافظت می‌کند؛ کانال داده از رمزهای متقارن مذاکره‌شده استفاده می‌کند. ورودی‌های PrivateKey و PublicKey در WireGuard ماده‌ی هویت‌اند، در حالی که کلیدهای انتقال آن به‌صورت داخلی مشتق می‌شوند. خواندن آن فیلدها به‌عنوان همان نوع راز به خطاهایی مثل چسباندن کلید عمومی جایی که کلید خصوصی تعلق دارد می‌انجامد.

ماده‌ی عمومی را از خصوصی جدا نگه دارید. گواهی، کلید عمومی WireGuard و اثر انگشت برای اشتراک در یک تیکت ایمن‌اند. کلید خصوصی، کلید از پیش اشتراک‌شده و کلید نشست صادرشده این‌گونه نیستند. وقتی قدرت‌ها را مقایسه می‌کنید، درون یک نوع مقایسه کنید: شناسه‌ی منحنی بیضوی، اندازه‌ی پیمانه‌ی RSA و اندازه‌ی کلید AES چیزهای متفاوتی را تحت فرض‌های متفاوت می‌سنجند. مشخصات TLS 1.3 مرجع مفیدی است برای اینکه دو لایه چگونه کنار هم قرار می‌گیرند، حتی وقتی تونل شما TLS نیست.

مقالات مرتبط