رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
رمزنگاری متقارن حرفه ای در PHP
#1
خب بیشتر از چیزی که فکر میکردم کار داشت، اما بالاخره آماده شد.

این آخرین تکامل کدهای رمزنگاری بنده هست یعنی در حد ناسا و سازمان امنیت ملی آمریکا Big Grin

الگوریتم مورد استفاده: AES-128 (CBC) + HMAC-SHA256

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

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


البته این کدها رو یک مقدار سردستی و چون اول برای کار شخصی خودم نوشته بودم، از نظر متد کدنویسی و این حرفا زیاد تمیز و اصولی نیست.

خب روش استفاده از این برنامه خیلی ساده است.
در فایل test.php ما یک رشته ای رو رمز کردیم و بعد رمزگشایی کردیم و نمایش دادیم. خیلی ساده و روشن است و فکر نمیکنم نیاز خاصی به توضیحات بیشتری باشه!
راستی mt_rand رو فقط برای این استفاده کردم که رشتهء ما هر بار تغییر کنه که این توی مرورگر برای فهمیدن کارکرد برنامه مفیده و از یکسری اشتباهات و دردسرها جلوگیری میکنه، وگرنه نیازی به این تابع در اونجا نیست و کاربردش فقط برای کمک به تست برنامه است.
و اما یک نکتهء مهم کلید رمزگذاری ماست!
دقت کنید بنده از چنین کلیدی استفاده کردم:
$KEY='k#bbU-Tq!==gc4*hal3%@}';
این الان طولش و نوع کاراکترهاش روی حسابه و همینطور کشکی و دلخواه نیست!
شما کلیدی که تعیین میکنید باید تعداد حالت های ممکن اون رو حساب کنید که حداقل 2 به توان 128 باشه (بیشتر شد اشکالی نداره و بی تاثیره، ولی کمتر نباشه).
توجه داشته باشید که امنیت رمزنگاری شما هیچوقت از قدرت کلید شما بیشتر نمیشه. پس کلید خیلی مهمه.
البته کلیدی که من گذاشتم اگر دقیق حساب کنیم تعداد حالتهاش از 2 به توان 128 هم خیلی بیشتر میشه، ولی با توجه به اینکه این کلید توسط انسان انتخاب بشه و کلیدهای انتخاب شده توسط انسان کیفیت پایینی دارن (مثلا احتمال استفاده از یکسری کاراکترهای خاص توسط انسان خیلی بیشتره و یکسری دیگر خیلی کمتر)، فکر میکنم جانب احتیاط رو گرفتم. اما میشه کلید رو توسط همون تابع رندوم امنیتی بنده هم تولید کرد و به این شکل بیشتر میشه مطمئن بود. بطور مثال ما اگر علامتهای خاص رو هم نذاریم، و فقط اعداد و حروف بزرگ و کوچک به تنهایی و رشته ای به طول 22 کاراکتر، و چون هر کاراکتر میتونه از بین 62 کاراکتر انتخاب بشه، بنابراین تعداد حالتهای ممکن برای رشتهء ما میشه 62 به توان 22 که از 2 به توان 128 هم مقداری بیشتره؛ اگر طول رشته رو 21 کاراکتر میگرفتیم، تعداد حالتهای ممکن از 2 به توان 128 کمی کمتر میشد، به همین خاطر بنده جانب احتیاط رو گرفتم و میگم طول 22 کاراکتر باشه.

راستی شاید بپرسید چرا ما از AES256 استفاده نکردیم. جواب اینه که چون بنده بعنوان یک آدم مطلع و متخصص بعد از سالها اینو فهمیدم که وقتی میگن AES256 بیشتر تبلیغات هست و جنبهء روانی داره تا اینکه در عمل و از دید تخصصی اهمیت و مبنای واقعی داشته باشه، چون AES128 برای تمام کاربردهای عادی امنیت کافی داره (اغلب خیلی بیشتر هم از حد کافی) و AES256 مقداری هم کندتره (فکر کنم حدود 40%). اما گفتم که امنیت مثل زنجیره که ضعیف ترین حلقهء اون پاره میشه و به این شکل کل زنجیر از هم میپاشه، حکایت رمزنگاری هم همینه و فکر نمیکنم در کل ایران بشه برنامه نویس و برنامه ای پیدا کرد که برنامه هاش اونقدر امن و اصولی باشه که انتخاب بین AES128 یا AES256 براش مسئلهء براستی سرنوشت سازی باشه! در 99.9999% موارد ایرادها و حفره ها و ضعف های بزرگتری در جاهای دیگری پیدا میشه. ولی اگر شما میخواید مثلا اسناد فوق محرمانهء امنیت ملی رو رمزگذاری کنید، یعنی چیزهایی که ممکنه مثلا سازمان سیا و کشورهای قدرتمند و پیشرفتهء دنیا بخوان رمز اونها رو بشکنن، در این صورت باید حساس تر بود و بیشتر روی این مسئله تامل کرد! بهرحال هر چیزی حدی داره، برای هرچیزی حدی تعیین میشه که صرف کنه و نامعقول نباشه، همین کدها هم که من نوشتم شاید برای 99.99% برنامه ها و اطلاعات خیلی بیشتر از حد نیاز هم باشه، بخصوص که برنامه نویسان و برنامه های واقعا قوی و حرفه ای و بی نقص در زمینهء امنیت بسیار بسیار کم هستند. من برای کاربردهای خودم هم دنبال بیشتر از این امنیت نبودم و نیستم چون واقعگرایانه نیست، ولی زمانی اگر شرایط خاص و درجهء امنیتی خیلی بالا باشه، فرض مثلا میخوایم اسنادی رو رمز کنیم و میخوایم تاجاییکه میتونیم تلاش کنیم تا امنیت اونها حتی تا 50 سال دیگر هم برقرار باشه، اونوقت باید اصولا طرح و برنامهء جدیدی رو شروع کنیم و بنظر بنده صرفا استفاده از AES256 هم کافی نیست و باید تمهیدات پیشرفته تری رو هم بهش اضافه کنیم.

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


فایل‌های پیوست
.zip   crypto.zip (اندازه 22.72 KB / تعداد دانلود: 19)
پاسخ
تشکر شده توسط: mona.ahmadi , ADMIN , amir




کاربران در حال بازدید این موضوع: 1 مهمان