طول کلیدها

میدونید که رشته های رندوم که ما در اینجا اونها رو کلید مینامیم در برنامه نویسی وب خیلی کاربرد دارن.
بطور مثال میتونیم موقع ثبت نام یک کلید برای لاگین خودکار کاربر درنظر بگیریم و موقع لاگین اون رو در کوکی ذخیره کنیم که به این شکل هربار دیگر که کاربر از سایت بازدید میکنه میتونیم مقدار کلید موجود در کوکی رو بخونیم و اگر با کلید متناظر برای اون کاربر در دیتابیس تطابق داشت کاربر رو بصورت خودکار لاگین کنیم.
کاربرد دیگر کلیدها در ایمیل فعال سازی اکانت هست بطور مثال.
کاربرد دیگر در Reset کردن پسورده.

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

بنده اینطور محاسبه کردم:

فرض کنید کلید از حروف انگلیسی کوچک و بزرگ و اعداد تشکیل شده.
بنابراین تعداد حالتهای ممکن چنین کلیدی اینطور محاسبه میشه:

(26+26+10)^n

معادل:

62^n

چون هر کاراکتر میتونه از بین 26 حرف کوچک، 26 حرف بزرگ، و 10 رقم انتخاب بشه.
n هم طول کلید، یعنی تعداد کاراکترهاش، است.

از اونجایی که در علم رمزنگاری حداقل طول کلید استاندارد 128 بیت است، بنده n رو مقداری گرفتم که تعداد حالتهای ممکن کلید از تعداد حالتهای ممکن یک کلید باینری 128 بیتی کمتر نباشه.

تعداد حالتهای یک کلید 128 بیتی باینری اینطور محاسبه میشه:

2^128

که تقریبا میشه 3.4e+38

اگر ما طول کلید خودمون رو 22 کاراکتر بگیریم، تعداد حالتهاش میشه:

62^22

که تقریبا برابر است با 2.7e+39

همونطور که میبینید، تعداد حالتهای کلید ما حتی از کلید 128 باینری هم بیشتره، ولی چون اگر بجای 22 کاراکتر 21 کاراکتر درنظر بگیریم تعداد حالتهاش میشه 4.3e+37 که از تعداد حالتهای کلید 128 بیتی کمتره بنابراین طول کلید خودمون رو 22 کاراکتر انتخاب کردیم.

حالا یک مثال از میزان استحکام این کلید میزنم:

فرض کنید یک کرکر بتونه در هر ثانیه 100 هزار درخواست به سرور بفرسته و جواب بگیره. حالا حساب میکنیم که برای تست کردن نیمی از بازهء حالتهای ممکن برای کلید ما به چقدر زمان نیاز داره (*):

(62^22)/2/100000/60/60/24/365=429319452023506532263169320

زمان رو بر حسب سال بدست آوردم که تقریبا میشه 429319452023506532263169320 سال!

*: در علم رمزنگاری در محاسبات مربوط به Brute-force، زمان لازم برای تست نیمی از بازهء مورد نظر رو محاسبه میکن، نه کل بازه رو.

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

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

درمورد عملی بودن این حمله از سمت کرکر هم باید بگم که حمله مورد نظر میتونه با Botnet انجام بشه که Botnet های واقعا بزرگی وجود دارن که احتمالا میتونن چند ده میلیون درخواست در هر ثانیه ارسال و دریافت کنن (البته با فرض اینکه سایت مورد نظر هم بتونه این تعداد درخواست رو جواب بده). ولی بازهم واضحه که بازهء کلید ما اونقدری بزرگه که حتی با چندصد میلیارد تست بر هر ثانیه هم نمیتونن کلید ما رو کرک کنن.

تازه در کاربردهایی که کلید مورد نظر فقط برای زمان محدودی مثل 24 ساعت یا چند روز اعتبار داره (مثلا در ایمیل فعال سازی یا ریست کردن پسورد)، امکان کرک کردن بسیار محدودتر میشه.

امیدوارم در محاسبات اشتباهی نکرده باشم.
اگر اشتباهی بود تذکر بدید.

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

پاسخ دهید

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

*

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