نقل قول نوشته شده توسط negative60 مشاهده تاپیک
با توجه به درخواست بی‌ پاسخ از روند امن سازی و با توجه به ادعا‌های موجود انتظار بالایی وجود داشت و تصور بر این گذاشته شد که از یک تکنیک قوی استفاده شده
منظور من از امنیت بالا، همون AES+HMAC بود. البته قبول دارم اغراق بوده، یعنی مقداری گمراه کننده. منظورم این نبود که برنامم از همه جهت کامل و خیلی پیشرفته است. منظورم همین رمزنگاری متقارن بود که اگر درست انجام بشه و اشتباهی توش نباشه کسی قادر نیست بشکنه. چون در عمل خیلی رمزنگاری هایی که دیگران استفاده میکنن در جزییاتشون ایرادها و اشتباهاتی دارن که باعث میشه امنیتشون به مراتب پایین تر بیاد. مثلا بعضیا MAC ندارن، بعضیا از مدهای ضعیف مثل ECB استفاده میکنن، بعضیا از الگوریتم های ضعیف یا حتی شکسته شده مثل DES استفاده میکنن، بعضیا از پسوردها یا کلیدهای ضعیف استفاده میکنن (چون نسبت به اهمیت و روش محاسبهء میزان امنیت اونا آگاه نیستن)، بعضیا در جزییات دیگری مشکل دارن مثلا در روش اشتقاق کلید اشتباهاتی رو مرتکب میشن، بعضیا از توابع رندوم ناامن استفاده میکنن، خلاصه رمزنگاری در عمل خیلی جزییات داره که باید دربارهء هرکدام اطلاعات کافی داشته باشی و خوب روشن باشی بینش داشته باشی حواست باشه که اشتباهی نکنی. یک علت هم که این مسائل رو تشدید میکنه اینه که خیلی وقتا در کدهای رمزنگاری وقتی اشتباهی میشه، برنامه همچنان کار میکنه و در ظاهر هیچ مشکل و نشانه ای مشاهده نمیشه که فرد بتونه براحتی متوجه اشتباهش بشه؛ فرض مثلا ممکنه شما یه اشتباهی در جایی از کدها و الگوریتم بکنی که باعث بشه کلید شما بجای 128 بیت بشه 64 بیت، در خیلی موارد میبینی برنامه با هیچ مشکلی در ظاهر مواجه نمیشه، و هیچکس هم از روی متن رمز شده نمیتونه بفهمه امنیتش کمتر شده، بطور معمول هیچ ابزار و تست و مثلا اسکنر امنیتی هم برای اینطور مسائل وجود نداره و استفاده نمیشه. افراد غیرمتخصص احتمال اشتباهاتشون در این زمینه واقعا زیاده، و اینو کسی که اطلاعات و تجربهء کافی داشته باشه میفهمه.
بهرحال این برنامه هم با اینکه از امکانات حداقلی استفاده کرده ولی کسی بدون بدست آوردن کلید رمزنگاری نمیتونه کاری بکنه. ولی از روشهای دیگر ممکنه نفوذ و هک صورت بگیره، مثلا از طریق حفره های سیستم عامل به سیستم عامل کلاینت ها نفوذ کنن، یا فرضا در یک بخشی از مفسر یا کتابخانه های استفاده شدهء پایتون باگ buffer overflow باشه که اونا مباحث دیگریست و لزوما به برنامهء بنده مربوط نمیشه بلکه تامین امنیت بخشهای دیگریست.
خلاصه رمزنگاری به حرف خیلی آسون تره، ولی در عمل هست که باید دید! چون اطلاعات کلی رو همهء ما ظاهرا میدونیم، همه میتونیم از پیشرفته ترین روشهای رمزنگاری اسم ببریم و اشاره کنیم، ولی خیلی جاها همون جزییات هست که اطلاع یا حضور ذهن و دقت کافی نسبت بهشون نیست و اشتباه میشن. حتی بعضی کتابخانه های رمزنگاری که بنده دیدم درشون چنین ضعف هایی وجود داشته. مثلا همین phpseclib که بنده در سمت php استفاده کردم، تابع رندومش ضعیف بود که بنده پیشنهاد و نظرهایی به توسعه دهنده اش دادم (چند سال پیش) که فکر میکنم یکیش رو اعمال هم کرد. ولی من تابع رندوم خودم رو از اون هم کاملتر سعی کردم درست کنم و حتی دربست به توابع رندوم امنیتی سیستم عامل یا کتابخانهء خاصی اعتماد نکردم. یک کتابخانهء رمزنگاری اگر تابع رندومش ضعیف باشه، ضعف مهمی است چون خیلی جاها اساس امنیت بر همین تابع رندوم بنا شده و فرض شما از قوی ترین و جدیدترین الگوریتم ها هم استفاده کنید ولی تابع رندوم شما امنیت بالایی نداشته باشه، امنیت شما از امنیت تابع رندوم هرگز بالاتر نمیره، و بدیش اینه کسی هم بدون بررسی دقیق این کدها از چشم یک متخصص و آدم مطلع، متوجه ضعف موجود نمیشه.
البته PHP بخصوص در چندین سال پیش از نظر توابع و کتابخانه های رمزنگاری ضعف و نقص زیاد داشت، یعنی به هیچ وجه کامل نبود، ولی الان وضع ظاهرا بهتر شده، ولی همچنان نسبت به زبانهای دیگری مثل سی++ هنوزم امکانات محدودتر و قدیمی تری داره و خیلی جزییات و کارها رو خودت باید دقت کنی و انجام بدی. البته پایتون هم تاجاییکه دیدم چندان کامل و بروز نیست.
بهرحال بنده فکر میکنم در این برنامه بازهم خوب کار کردم، بطور مثال جلوی Replay attack رو گرفتم، که این کار زیاد هم ساده نبود و کلی کار و کدم بخاطر این پیچیده شد، البته بعدا به روش بهتری رسیدم و کدم رو خیلی ساده تر و مختصرتر کردم ولی اولش که تجربه نداشتم همین مسئله کلی پیچیدگی و کار افزوده ایجاد کرد چون یکسری مسائل مثل امکان چند درخواست HTTP همزمان رو پیشبینی نکرده بودم و میخواستم همه کار رو بصورت synchronous انجام بدم ولی بعد دیدم نمیشه و باید درخواستهای Asynchronous هم داشته باشم، و از اون طرف بنظرم خیلی برنامه ها میشه پیدا کرد که جلوی این حمله رو نگرفتن، بعد مثلا میتونستم از یک کلید رمزنگاری مشترک در کلاینت ها و سرور استفاده کنم، ولی گفتم بهتره به سرور هم اعتماد نشه و اگر به سرور نفوذ شد (یا مثلا خود وبمستر و مالک سرور و افراد دیگری که ممکنه براحتی به کدها و کلید ما روی سرور دست پیدا کنن) امنیت برنامه از بین نره، بخاطر همین کلید و رمزنگاری بین کلاینت ها و سرور جدای از رمزنگاری بین کلاینت هاست، اینطور مجبور شدم جلوگیری از Replay attack رو هم دوبار پیاده سازی کنم؛ و همهء اینها در دو زبان متفاوت، یکی PHP و یکی پایتون. خب میتونم بگم واقعا کار برد این برنامه و علاوه بر سواد و اطلاعات و دقت کافی در علم رمزنگاری، نیاز به مهارت و دانش برنامه نویسی بالایی هم داشت و کسی که هم برنامه نویسی دسکتاپ بلد بشه هم سمت سرور وب با PHP و هم از یکسری مسائل سیستم عامل سردربیاره (بعضی کارها در این برنامه از طریق دستورات پیشرفتهء خط فرمان سیستم عامل انجام میشه که نکات و مشکلات خودش رو داشت) و بتونه همهء اینا رو با هم ارتباط بده و ترکیب و سازگار کنه. بخاطر همین من فکر میکنم از نظر ارزش کدنویسی این برنامه ارزش کمی نداره، چون برنامهء کلیشه ای و روتینی نبوده بگیم مثلا نمونه و کدش براحتی هرجایی پیدا میشه و همینطور برمیداری کپی و پیست میکنی یا هرکسی میتونه بنویسه. برنامه های دیگر آماده و مثلا بازمتن هم مطمئن هستم بهرحال تمام خصیصه ها و امکانات مورد نظر منو همینطور از قبل و راحت آماده ندارن و اگر بخوای دستکاری کنی یا امکاناتی بهشون اضافه کنی بهرحال خودش کار زیادی میبره؛ دوما از نظر امنیت نمیشه همینطور به برنامهء دیگران اعتماد کرد و باید بشینی کدهاش رو بخونی و سردربیاری که اشتباه و ضعفی درش نباشه (اشاره کردم فقط به اسم و ادعا و کلیت روش های استفاده شده نیست که مثلا این برنامه از فلان الگوریتم های خفن پفن استفاده میکنه مطمئن بشی پس امنیتی رو که فکر میکنی داره). خلاصه باید به چشم یک کار سفارشی خاص به اینطور پروژه ها نگاه کرد، چون هم برنامش با بقیهء برنامه های بازاری و کلیشه ای فرق میکنه هم و برنامه نویسی که نیاز داره از بین صدتا برنامه نویس شاید یک نفر دانش و مهارت های کامل چنین کارهایی رو داشته باشه.