امنیت ریاضیات است

در پاییز 1995، در سال دوم تحصیلم بعنوان یک دانشجو در دانشگاه Simon Fraser، یک دورهء درسی بنام Math 242 داشتم که عنوانش «آشنایی با تحلیل» بود. این یک دورهء اجباری برای دانشجویان ریاضی بود (و هنوز هست)، و به دلایل خیلی خوبی اغلب بعنوان «دوره ای که مشخص میکند آیا شما مدرک ریاضی را خواهید گرفت» توصیف میشود، و نخستین دوره ای است که دقت و سختگیری ریاضی را جدی میگیرد. آیا درس حسابان سال اول را که مباحث دنباله ها، سری ها، همگرایی، پیوستگی توابع، حد را در خود داشت بیاد دارید؟ این دوره ای است که شما یاد میگیرید هرچیزی را که فکر میکنید از پیش میدانید اثبات کنید.

در نیمسالی که من این دوره را گرفتم، رتبهء میانگین در امتحان میان ترم 29 درصد بود. سه نفر از دانشجویان (شامل خودم)، از یک کلاس حدودا 40 نفره، رتبهء بالاتر از 50 درصد گرفتند. من نمره های دقیق نیم سال های دیگر را نمیدانم، اما فکر میکنم آن توزیع رتبه چیز غیرعادی ای نبود.

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

این چیزی است که Bruce Schneier «ذهنیت امنیتی» مینامد — و همهء ریاضیدان ها آن را دارند. در نخستین فصل تز دکترای من، یک صفحه را به اثبات قضیه ای درمورد توزیع اعداد اول اختصاص دادم (این قضیه که بین ‎x و x * (1 + 2 / log(x))‎ حداقل x / log(x)^2 عدد اول وجود دارد؛ یعنی حداقل نصف تعداد مورد انتظار). من این را تنها بخاطر این انجام ندادم چون از آن خوشم می آمد، بلکه آن را انجام دادم چون بدون آن نمیتوانستم یک محدودهء خطا برای الگوریتم تصادفی خودم را ثابت کنم. بیشتر دانشمندان علوم رایانه بسادگی دستان خود را تکان میدهند و این فرض متداول را بعنوان پیشفرض قرار میدهند که اعداد اول به شکل تصادفی رفتار میکنند؛ اما با آموزش ریاضی که من دیده بودم، یک اثبات میخواستم که بر روی فرض های خارجی بنا نشده باشد.

Knuth بخاطر این گفته که «مراقب باگ ها در کد بالا باشید؛ من تنها ثابت کرده ام که آن درست است، اما آن را امتحان نکرده ام» مشهور است، و من با بیان ضمنی اینکه یک اثبات درستی برای اطمینان از اینکه کد درست عمل خواهد کرد کافی نیست مطلقا موافقم؛ اما، مهم است که ماهیت باگ هایی را که از چشم کسی که اثبات را مینویسد فرار میکنند مورد توجه قرار دهیم. این باگ ها — که من فرض میکنم باگ های بالقوه ای بوده اند که Knuth درمورد آنها هشدار میداد — بیشتر اشتباهاتی هستند موقع انتقال ایده ها از مغز به کیبورد: بطور مثال جا انداختن یک سمیکالن یا پرانتز، یا قاطی کردن نام دو متغییر. این باگها براحتی با حداقل میزان تست کردن پیدا میشوند. بنابراین نه تست و نه اثبات به تنهایی خیلی موثر نیستند، و در ترکیب هر دو است که تاثیر به حداکثر میرسد.

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

Bruce Schneier درست میگوید که امنیت نیازمند یک ذهنیت غیرعادی است؛ و درست میگوید که دانشکده های علوم کامپیوتر جای خوبی برای آموزش دادن این ذهنیت نیستند. اما او در اشتباه است که این ذهنیت نمیتواند آموزانده شود: اگر شما میخواهید کسی امنیت را درک کند، کافیست او را به مدت چهار سال به دانشکدهء ریاضی یک دانشگاه بفرستید.

منبع: http://www.daemonology.net/blog/2008-03-21-security-is-mathematics.html

————————————————

جالبه امروز به این مقاله برخورد کردم که خیلی خوب چیزی رو که بنده بارها میخواستم بیان کنم و به دیگران بفهمونم بیان کرده.
درواقع در امنیت، از ذهنیت و روشهای ریاضی باید استفاده بشه (تاجای ممکن)، چون ماهیتا اینطور هست و نیاز به چنین تفکر و روشهایی داره. تجربه های بسیار در طول سالها هم گواهی هستن بر این واقعیت!

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

امنیت مثل برنامه نویسی معمولی نیست و از روی کار کردن یا نکردن ظاهریش نمیشه متوجه درستی اون شد. هرچند حتی برنامه ها و الگوریتم های غیرامنیتی هم ممکنه نیاز به اثبات داشته باشن چون بدون اثبات همیشه ممکنه چیزهایی و حالت های خاصی از زیر دست در رفته باشه، ولی بهرحال برنامه نویسی معمولی فیلدی هست که آدمهای بدون تخصص و ذهنیت و روش ریاضی هم میتونن درش کار کنن و برنامه های کاربردی و مفیدی تولید کنن، وگرنه که امروز اینقدر برنامه نویسی خوب نداشتیم! اما بحث امنیت، و زیر شاخهء فوق تخصصی اون یعنی رمزنگاری، کاملا متفاوت است، و بخاطر همین ما متخصصان امنیت واقعی کم داریم، و متخصصان رمزنگاری واقعی هم خیلی کم داریم!

البته حتی در دنیای امنیت و رمزنگاری هم، اثبات های کامل و قاطع در خیلی موارد وجود ندارن، و فرض هایی پایه ای داریم که بدون اثبات پذیرفته میشن، چون کسی نتونسته تا اونجا پیش بره و همه چیز رو اثبات کنه، ولی خب بهرحال این فرض ها محدود و حداقلی هستن، و مواردی هستن که سالها در معرض دید و بررسی همگان بوده و کسی نتونسته در اونها خلل چندانی وارد کنه. اما همیشه امکانش هست یه زمانی معلوم بشه یکی از این فرضها غلط بوده، و راه دور زدن/شکستنش هم ممکنه پیدا بشه، و اونوقت بستگی به مواردی که امنیتشون بر اون فرض بنا شده، یعنی اینکه اساسی بودن و میزان گستردگی و اهمیت کاربردهای استفاده شده از اون فرض چقدر باشه، ممکنه یک فاجعهء امنیتی در مقیاس جهانی بوجود بیاد! ولی خوشبختانه تاحالا فاجعه ای خیلی بزرگ در مقیاس جهانی رخ نداده، شاید یکی به این دلیل که کشف ضعف ها و شکسته شدن الگوریتم ها هم معمولا به کندی و در طول زمان رخ میدن و فرصت عکس العمل و تغییر وجود داره. ضمنا در چنان شرایطی معمولا رمزنگارها و ریاضیدان ها میتونن کمک کنن و راهکارها و روشهای جدید و جایگزینی رو که بقدر کافی قابل استفاده باشن ارائه بدن (هرچند از خسارت هایی که در زمان حال رخ میده شاید نتونن زیاد جلوگیری کنن).

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>