PKIs و AD CS – قسمت اول

بگذارید با هم به گذشته ها برویم، در زمان های دور هنوز ایمیل و اینترنت و تلفن و شرکت های پستی و… به وجود نیامده بودند و پیشینان ما از چاپار برای انتقال اطلاعات استفاده می کردند. اما این چاپار ها همواره تهدیدی برای امنیت اطلاعات به شمار می آمدند. چرا که یک دزد ساده هم می توانست اطلاعات را به دست آورد، آن را تغییر دهد و ممکن بود چاپار از ترس جان خود از فاش شدن یا تغییر اطلاعات چیزی نگوید. بنابراین حکومت ها اقدام ساخت مکانیسمی برای تضمین صحت اطلاعات کردند. یکی از این روش ها مهر و موم است. همچنین آن ها از روش های دیگری هم استفاده کردند تا اگر اطلاعات به واسطه ای افتاد بدون استفاده باشد. روش هایی همچون نوشتن با آب پیاز یا موادی که در برابر حرارت نمایان می شوند، استفاده از لغات رمز و یا به صورت کلی الفبایی خود ساخته همگی روش هایی برای آن بودند که چنانچه نامه مورد تهدید قرار گرفت، اطلاعات به سادگی افشا نشود. حکومت های دیگر هم بی کار نمی مانند و تلاش می کردند تا روش رمزنگاری حریف را به دست اورند و بتوانند به اطلاعات دسترسی پیدا کنند گاهی اوقات هم موفق می شدند. دزدی اطلاعات یکی از عوامل مهم در سقوط حکومت ها است و خواهد بود. همانطور که دیدم مکانیسم های رمزنگاری یا کلید عمومی، مکانیسم های جدیدی نیستند و فقط چهره ی آنها تغییر کرده حال این مکانیسم ها اصلا چه چیزی هستند؟ قصد داریم به روش دست پیدا کنیم که چنانچه اطلاعات به دست دشمن افتاد نتواند آن را متوجه شود، نتواند اطلاعات غلط مشابهی برای دوستان ما ارسال کند و به عبارت دیگر اطلاعات برای او بدون استفاده شود تا انگیزه دستبرد به اطلاعات کاهش یابد و اگر خطری اطلاعات را تهدید کرد، اطلاعات فاش نشوند. در اینجا با استفاده از کلیدهایی اطلاعات را قفل می کنیم و به دنبال چیدمانی مناسب از کلیدها و قفل ها هستیم. رمزگشایی به بازکردن قفل و رمزنگاری به بستن این قفل می  گوییم.
مسئله بد آن است که اگر حریف بتواند اطلاعات را رمز گشایی کند در واقع کلید را برای باز کردن اطلاعات به دست آورده، حال چگونه می توان دانست که در چه زمانی حریف توانسته کلید را به دست آورد؟ قطعا تنها راهکاری که به ذهن می رسد آن است که هر یک یا چند نامه را با یک کلید برای مقصد بفرستیم. اما این کار هم از لحاظ اقتصادی هزینه بر است هم زمان را افزایش می دهد. در ضمن ابداع مکانیسم های مناسب رمزنگاری اصلا کاری ساده نیست که بتوان آن را با دفعات زیاد تکرار کرد. از طرف دیگر امنیت ارسال کلید هم مطرح می شود. داستان ما از اینجا آغاز می شود. تصور کنید که یکی از شهر  های کشور شما در سال ۲۰۰ قبل از میلاد توسط دشمن محاصره نظامی شده و شما به عنوان پادشاه قصد دارید تا اطلاعات مربوط به حمله نیروی های کمکی را به شهردار آن شهر ارسال کنید تا سربازان آن شهر هم در زمان خاص دست به حمله بزنند. اگر این اطلاعات را بدون هیچ مهر و موم و رمزنگاری ارسال کنید که ممکن است به دست حریف بی افتد بنابراین ناچار به استفاده از این روش ها هستید. بنابراین آن را در یک صندوق قرار می دهید. شما صندوق هایی دارید که نامه های خود را در آن قرار می دهید و ان را قفل می کنید. کلید این قفل را فقط شما و شهرداران دارند. ممکن است کلید شما آشکار شده باشد و عملیات شما با شکست رو به رو شود. از طرف دیگر ممکن کلید جدیدی بسازید و کلید را توسط چاپار دیگری ارسال کنید. حال اگر هر دو چاپار دستگیر شود امنیت تمام کشور شما به مخاطره خواهد افتاد. فکر می کنید  روش بهتری برای ارسال اطلاعات وجود دارد؟ تاج و تخت شما همه در گرو این مسئله است، پیش از خواندن پاراگراف بعدی روشی پیدا کنید در غیر این صورت شما از دشمن خواهید باخت!!!
فرض کنید روشی وجود دارد که تقریبا یک طرفه باشد، به این معنی که رمزنگاری اطلاعات آسان است اما رمزگشایی آن دشوار، بنابراین همه می توانند اطلاعات را رمزنگاری کنند اما نمی توانند آن را رمزگشایی کنند. دو کلید مختلف در دسترس است یک کلید برای رمزنگاری اطلاعات و دیگری برای رمزگشایی. رسیدن به کلید رمز گشایی از طریق کلید رمزنگاری تفریبا غیرممکن است یا اگر بخواهیم بهتر بگوییم، باید بگوییم دشوار است. حال در پایتخت که شما در آن حضور دارید، دو کلید مخصوص به خود دارید که عبارت اند از کلید CEK و CDK (کوتاه شده ی Capital Encryption Key و Capital Decryption Key که البته دو واژه ای است که خودم آن ها را ساختم) با کلید CEK می توان اطلاعات را قفل کرد یا رمزنگاری کرد و با کلید CDK می توان قفل را باز کرد یا رمز گشایی کرد. به عبارت دیگر قفلی در اختیار دارید که با یک کلید فقط قفل می شود و با یک کلید دیگر فقط باز می شود. شما کلید CEK را در اختیار تمامی شهرداران قرار می دهید. حال هر زمان که شهرداری می خواهد به شما پیغامی ارسال کند آن را با CEK که خاص شما و پایتخت است رمزنگاری می کند اما نمی تواند آن را رمزگشایی کند چرا که CDK را ندارد و همچنین شهرداران دیگر هم چون فقط CEK را دارند و به CDK دسترسی ندارند نمی توانند اطلاعات را به دست آورند. با استفاده از همین مکانیسم می توان کلید های متعددی درست کرد و تمامی شهر ها دو کلید رمزنگاری و رمزگشایی مخصوص خود را داشته باشند. اکنون کلید های رمزنگاری را در دسترس همدیگر قرار می دهیم تا هر کسی، با هر کس دیگری که خواست بتواند ارتباط رمزنگاری شده داشته باشد اما فقط کسی که پیغام برای او صادر شده می توانند اطلاعات را رمزگشایی کند، دقت کنید که حتی خود نویسنده ی پیام هم نمی تواند اطلاعات را رمزگشایی کند با آنکه از محتوای پیام آگاه باشد. حال برای اطمینان بیشتر شما می خواهید کلید های خود را عوض کنید، با مشکل خاصی رو به رو نیستید فقط کافی است دو کلید جدید بسازید و کلید رمزنگاری خود را در اختیار همه قرار دهید. البته ممکن است که کلید رمزنگاری شما توسط حریف دزدیده شود و حریف اطلاعات تقلبی برای شما ارسال کند که با ترکیب این مکانیسم با مکانیسم های تشخیص هویت می توان صحت ارسال کننده را نیز علاوه بر صحت دریافت تایید کرد. به عبارت دیگر در این روش هیچ اهمیتی ندارد که اطلاعات شما به  دست حریف می افتد یا خیر تنها نکته مهم آن است که اطلاعات در زمان مناسب به شهر محاصره شده برسد. برای این کار شاید چند شوالیه زیرک داشته باشید که بتوانند خط محاصره را در هم بشکنند و پیغام را برسانند، شما یک نسخه از پیغام را به تمام آن شوالیه ها می دهید تا اگر چند نفر از آنها کشته یا اسیر شدند باز هم نسخه ای وجود داشته باشد که به دست شهردار برسد. به کلید رمزنگاری که در دسترس همگان است، کلید عمومی و به کلید رمزگشایی که امیدواریم فقط یک نفر داشته باشد کلید خصوصی می گوییم.
همانطور که دیدید در مکانیسم کلید عمومی/ کلید خصوصی مشکل قابل توجهی وجود دارد و آن پیام های جعلی است. تصور کنید حریف برای شهردار پیام جعلی ارسال کند که این پیام از طرف پادشاه یعنی شما صادر شده و دستور می دهد که تسلیم شوند و شهر را در اختیار حریف قرار دهند. از آنجا که حریف از مکانیسم رمزنگاری شما آگاه است و کلید عمومی را دارد، با کلید عمومی اطلاعات را رمزنگاری می کند و آن را برای شهردار ارسال می کند. حال باید مکانسیمی پیدا کنیم که با استفاده از الگوریتم موجود راه حلی ارائه شود. فرض کنید اسم خودتان را یعنی پادشاه به صورت یک متن رمزنگاری شده است، توجه کنید که تصور می کنیم متنی به رمز در آمده و حاصل “پادشاه” است، اکنون با استفاده از کلید رمز گشایی که کلیدی است که فقط خودتان آن را در اختیار دارید، آن را رمزگشایی می کنید بدیهی است که احتمالا نتیجه، متن دارای مفهومی نیست چرا که پادشاه داری مفهوم بود. حال این متن بی مفهوم را در پایان نامه خود اضافه کنید. دیگر لازم نیست که نامه را امضا کنید و آن را مهر بزنید چرا که این همان امضای شما است. به این امضا ما، فعلا امضای دیجیتال می گوییم. تمام متن را با استفاده از کلید رمزنگاری شهرداری که شهرش در حال محاصره است رمزنگاری کنید و توسط شوالیه ها ارسال کنید. وقتی شهردار پیغام را دریافت می کند با استفاده از کلید رمزگشایی خود که فقط خودش به آن دسترسی دارد می تواند متن را رمزگشایی کند و آن را بخواند. تمام متن خوانا خواهد بود به غیر از امضای شما، شهردار می تواند با استفاده از کلید رمزنگاری شما، متن امضای شما را (با استفاده از CEK ) رمزنگاری کند و به عبارت پادشاه، که یک عبارت با مفهوم است، برسد. حال اطمینان دارم شما پادشاه باهوش متوجه شدید که تنها کسی که می تواند متنی را تولید کند که در هنگام رمزنگاری اسم شما شود، فقط خود شما هستید، چرا؟ باید جمله گذشته را اصلاح کنیم، در واقع این بار با کلید خصوصی شما رمزنگاری می کنید و با کلید عمومی رمزگشایی می کنید چرا که باید فقط یک نفر بتواند بنویسد پادشاه اما همه باید بخوانند پادشاه.
همواره با استفاده از کلید عمومی رمزنگاری می کردیم، اما این بار برای آنکه کلید خصوصی تنها در دست یک فرد است و قصد داریم از هویت آن فرد آگاه شویم، با استفاده از کلید خصوصی رمزنگاری می کنیم، هرچند در مکانیسم بدون امضا کاربرد کلید خصوصی، رمزگشایی بود اما در این مکانیسم دیدم که کلیدها مهره هایی هستند که می توانیم با آنها بازی کنیم و مکانیسم های جدیدی بسازیم. اما همچنان شما پادشاه باهوش ایراد جالبی بر این روش می گیرید، به نظر شما ایراد کجاست و با چه بازی با این مهره ها می توان مشکل را حل کرد؟ اگر پیش از آنکه حدس زده باشید پاراگراف بعدی را بخوانید شما از حریف شکست خورده اید!!!
پیام شما به شهردار چنین چیزی بود:
“ به نام خدایان
ما سپیده دم حمله می کنیم شما در سپیده دم دروازه اصلی را باز کنید و حمله کنید تا خط محاصره شکسته شود.
شاینسشمیتسشکتیسهباهبسیبمیسمتبیستنبیسن”
این متنی است که شما نوشته اید و هنوز با کلید رمزنگاری شهردار آن را رمز نکرده اید. آن متن مسخره ی انتها هم امضای شما است. حال حریف (واسطه یا the man in the middle) یکی از نامه هایی که توسط شوالیه ها ارسال شده را به دست می آورد. پیامی که او می تواند بخواند، چنین است:
ستیمنشتینششنیشتسیسش
نسشتیمنتسشیسشتیسشخیسشخیداسشایدشتایشیتسشیشسیهسشتیمهسشتیهسشتیشستیسشتیمسشتیمهصتشسشتدیتشسدی
شاینسشمیتسشکتیسهباهبسیبمیسمتبیستنبیسن
همانطور که می بیند تمام پیام به رمز شده و نا مفهوم است اما امضای شما تغییر نکرده چرا که امضا با استفاده از کلید عمومی شهردار رمزنگاری نمی شود. اکنون حریف می تواند با نوشتن یک پیام جدید و افزودن امضای شما یک پیام جعلی به شهردار ارسال کند. برای حل این مشکل شما پادشاه باهوش چه فکری دارید؟ راه های مختلفی می توان یافت یکی از آن ها این است که تابعی بسازیم که یک رشته بلند و طولانی را جایگزین یک رشته ی کوچک کند، که این تابع شرایط خاصی باید داشته باشد، و اکنون روی آن قسمت کوچک شده را امضا می کنیم. دقیقا همانند کارت های شناسایی سربازانتان که قسمتی از مهری که روی کارت زدید روی عکس سرباز هم است چرا که امکان تعویض عکس از بین برود و شانس جعل شدن کارت شناسایی هم کم شود. البته می توانستیم که تمام نامه را امضا کنیم اما به دلایلی از جمله آنکه باید امضای بزرگی می کردیم و زمان می برد، از چنین تابعی استفاده می کنیم. اکنون محتوای نامه و امضای نویسنده به هم گره خرده.

پایان

به علت آنکه این داستان سرانجام خوبی داشته باشد اضافه می کنم که شما پادشاه باهوش توانستید با درایت خود شهر را آزاد و دشمنان را شکست دهید. می دانم از این خبر خیلی خوشحال می شوید.
پیشرفت ریاضیات توانسته تا امروز بتوانیم توابع قوی بسازیم و مکانیسم و متد های مختلفی برای رمزنگاری خلق کنیم که هریک برتری های خاص خود را دارند. آنچه که خواندید یک مطلب علمی نبود و فقط برای درک آسان تر مطالب PKIs در قالب یک داستان بیان شده بود امیدوارم در نقاطی که داستان شما را به حدس زدن و فکر کردن دعوت می کرد، این کار را انجام داده باشید. در ادامه به بررسی علمی تر PKIs می پردازیم. بدیهی است که در گذشته نمی توانستند از چنین روش های رمزنگاری پیچیده ای استفاده کنند.
در تمام سازمان های مدرن Public Key Infrastructures یا PKIs یکی از اجزای اصلی زیرساخت شبکه است. تقریبا به طریقی در هر سازمانی از یک Public Key (کلید عمومی) استفاده شده. مثلا در امنیت شبکه ی بیسیم یا VPN یا برای امنیت یک وب سایت. در واقع در دنیای امروز با نگاه کردن به هر گوشه ای می توان به خوبی Public Key ها را دید. امروزه کمتر سازمانی است که به بهبود های امنیتی بی نیاز باشد یکی از بهترین راهکارها در اکثر سناریو ها استفاده از Certificate ها است. یک PKI (زیرساخت کلید عمومی) ترکیبی از تکنولوژی رمزنگاری (Encryption) با چند سرویس و برنامه است که برای امن تر کردن ارتباطات خاص به کار می رود. از PKI می توان در موارد زیر بهره جست:
۱٫ افزایش قابلیت اطمینان: می توان از زیرساخت های کلید عمومی برای امن تر کردن اطلاعات در وضعیت انتقال یا نگه داری استفاده کرد.
۲٫ حفظ صحت و تمامیت اطلاعات : می توان از  PKI در Digital Sign استفاده کرد و با این روش مشخص می شود آیا واسطه ای اطلاعات را ویرایش کرده یا اطلاعات دست نخورده است. (The man in the middle)
3.تصدیق: زیرساخت کلید عمومی مکانیسم های متعددی جهت تعیین هویت دارد. به عنوان مثال پروتکل فرآیند authenticate شدن با پروتکل hash، همانند (Secure Hash Algorithm 1 (SHA1
4. عدم انکار : ارسال کننده‌ی پیام نمیتواند ارسال پیام را انکار کند به دلیل اینکه امضای او همراه نامه است.
به عنوان یک مثال ساده وقتی با استفاده از پروتکل Secure Hypertext Transfer Protocol یا Https وب سایتی را مشاهده می کنید یک گواهی نامه SSL در پشت صحنه وجود دارد، این گواهی نامه در واقع سندی است بر آنکه شما دقیقا روی همان وب سایتی که باید باشید هستید. زمانی که این گواهی نامه باز بینی شود می توان اطلاعاتی مثل Server Name و مرجع صادر کننده ی مجوز را مورد بررسی قرار داد. به مثال دیگری توجه کنید، سازمان A، با سازمان B روابط اقتصادی خوبی دارد و اطلاعات محرمانه ای بین این دو سازمان رد و بدل می شود. معمولا این اطلاعات به سادگی با یک ایمیل منتقل می شوند. بدیهی است که افرادی که این کلیت را بدانند می توانند با استفاده از اطلاعات تقلبی مشکل ساز باشند. بنابراین نیاز است تا اطمینان داشته حاصل شود که اطلاعات صحیح و سالم و از طرف سازمان دیگر به سازمان اول ارسال شده.
دو الگوریتم مختلف برای رمزنگاری وجود دارد، روش متقارن (Symmetric) و روش غیر متقارن  (asymmetric). در روش متقارن تنها از یک کلید استفاده می شود و مسئله حفظ امنیت کلید، فاش شدن الگوریتم، امکان پیام های تقلبی و… را حاصل می شود البته این به معنی نامناسب بودن این روش نیست هرکدام از این دو روش کاربرد های خاص خود را دارند و در شرایط مختلف راهکارهای مختلفی اندیشیده می شود. کلیدها چیزی غیر از صفر و یک نیستند. سیستم رمزنگاری مبتنی بر PKIs از دو کلید استفاده می کند. همانطور که دیدید یک کلید کلید عمومی است که برای همگان قابل دسترس می تواند باشد و کلید دیگر کلید خصوصی است که فقط در اختیار شخص دارنده است. البته امنیت هر دوی این کلید ها نیز باید حفظ شود. هرچند گاهی لازم است کلید عمومی واقعا در دسترس همگان باشد اما در اکثر سناریوها می توان دسترسی به کلید را محدود کرد هرچند اگر دسترسی غیرمجاز به کلید صورت گیرد جای هیچ ترسی وجود ندارد چرا که از روش های امنیتی پیچیده ای استفاده کرده ایم. به صورت کلی وقتی نیازی به دسترسی به کلید وجود ندارد، شما چرا آن را در اختیار دیگران قرار دهید. فرض کنید منزل خود را عوض کرده اید، با اینکه دیگر نمی توان با کلید های منزل قبلی وارد منزل جدید شد، چه دلیلی وجود دارد که کلید های منزل قبلی را به دشمن خود تحویل دهید؟ زمانی که اطلاعاتی با استفاده از کلید عمومی رمزنگاری می شوند، فقط شخصی می تواند اطلاعات را رمزگشایی کند که کلید جفت آن کلید عمومی را داشته باشد به عبارت دیگر باید یک کلید خصوصی داشته باشد تا بتواند اطلاعات را رمزگشایی کند. به هر دو کلید عمومی و کلید خصوصی، جفت کلید می گوییم. در رمزنگاری متقارن، از آنجا که یک کلید بیشتر در اختیار نداریم، آن کلید را باید به مقصد از طریق یک کانال امن ارتباطی ارسال کنیم. از آنجایی که تمامی مقصد ها و مبداء دارای این کلید هستند به این کلید Shared Key یا کلید به اشتراک گذاشته شده می گوییم.
کلیدهای مربوط به PKIs به شیوه متفاوتی از کلمه های عبور در کامپیوتر ها ذخیره می شوند. در ابتدا یک کلید خصوصی تولید می شود که یک عدد دو دو یی (باینری) است. این کلید توسط دارنده ی خود نمی تواند انتخاب شود و به صورت خودکار و اتفاقی انتخاب می شود. سپس یک کلید عمومی متناظر با کلید خصوصی صادر می شود. طول رشته ی یک کلید هم می تواند متفاوت باشد بدیهی است که رشته های طولانی تر زمان پردازش بیشتری نیاز دارند و همچنین حجم فایل رمزنگاری شده بیشتر می شود اما امنیت محکم تری را فراهم می آورند. امضای دیجیتال هم یکی از عناصر این مکانیسم است. از امضای دیجیتال برای تایید هویت یک فرد استفاده می کنیم. امضای دیجیتال عبارتی است که با استفاده از کلید خصوصی رمزنگاری می شود و با کلید عمومی رمزگشایی می شود (برخلاف اطلاعات)
الگورتیم هایی وجود دارد که آنها را Message Digest و یا Hash می گوییم. الگوریتم های hash الگوریتم هایی هستند که اطلاعات را به صورت نامفهوم تبدیل می کنند.گروهی از این الگوریتم ها فقط یکطرفه هستند به این الگوریتم های One-way hash algoritms. از لحاظ ریاضی احتمال آنکه بتوان از عبارت نا مفهوم به عبارت مفهوم رسید بسیار کم است و از لحاظ کامپیوتری زمان آنکه بتوان از عبارت نا مفهوم به عبارت مفهوم رسید بسیار زیاد است (معمولا چندین قرن) با این روش امضا های متفاوتی با اطلاعات ارسال خواهد شد با اینکه محتوا یکسان است. ممکن است جفت کلیدی که برای امضا ها استفاده می شود با جفت کلیدی که برای رمزنگاری اطلاعات استفاده شود متفاوت باشد. این امر دو مزیت دارد؛ اول آنکه معمولا عمر کلید امضا ها بیشتر می شود و دوم انکه امنیت محکم تر می شود. یک مثال ساده در خصوص الگوریتم های یک طرفه و دو طرفه می تواند توابع Y=X+2 و Z=X^2 باشد. در تابع y با داشتن خروجی ۴ می توان به ورودی ۲ پی برد در حالی که در تابع z نمی توان منحصرا یک ورودی را پیدا کرد. البته بدیهی است که الگوریتم های hash بسیار پیچیده تر از این هستند. در اینجا متذکر که می شوم که امنیت نسبی است.