اعمال محدودیتهای ناعاقلانه بر روی پسورد کاربران

در خیلی سایتها و سیستمها میان و حداکثر طول پسورد رو به 15 یا 20 کاراکتر محدود میکنن. اما چرا؟

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

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

بخاطر همین بنده حداکثر طول پسورد در پروژهء خودم رو برابر 100 کاراکتر قرار دادم. تازه الان فکر میکنم بهتره بیشترش کنم! مثلا 200 کاراکتر چطوره؟ زیاد کردنش ضرر خاصی نداره بنظرم. حالا خیلی هم زیاد نمیذاریم که از نظرهای دیگه شاید مشکلی پیش بیاد، ولی فکر میکنم یه محدودیت هایی مثل 20 کاراکتر و 30 کاراکتر واقعا درست نیست. تازه بعضی سایتها محدودیت کمتر از این میذارن. واقعا خنده داره این کار. از یک طرف میگن پسورد قوی باشه و مثلا حداقل 6 کاراکتر باشه و از اونور مثلا حداکثر طولش رو به 15 کاراکتر محدود میکنن! (لابد منظورشون اینه که دیگه خیلی هم قوی نباشه!!)

راستی یک مطلب جالب و نسبتا مرتبط از متخصص معروف امنیت و رمزنگاری Bruce Schneier:

Simply, people can no longer remember passwords good enough to reliably defend against dictionary attacks, and are much more secure if they choose a password too complicated to remember and then write it down. We’re all good at securing small pieces of paper. I recommend that people write their passwords down on a small piece of paper, and keep it with their other valuable small pieces of paper: in their wallet.
—Bruce Schneier, 2005

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

این گفتهء Bruce Schneier نشون میده که نیاز به قوی تر شدن پسوردها چقدر نسبت به گذشته بیشتر شده (تازه این رو در سال 2005 گفته).
از این لحاظ واقعا جالبه چون از قدیم تاحالا و همینطور خیلی افراد و متخصصان دیگر در حال حاضر میگفتن و میگن که پسوردهاتون رو جایی یادداشت نکنید. اما نظر Bruce Schneier خلاف اینه و میگه پسوردهایی که اونقدر ساده باشن که بیشتر مردم بتونن به سادگی بخاطر بسپارن امروزه دارای امنیت کافی نیستن (با وجود حمله هایی که هست و پیشرفت های زیادی که در زمینهء هک و کرک وجود داشته، نیازهای حداقل استحکام پسوردها هم افزایش پیدا کرده).
بنابراین بنده فکر میکنم وضع محدودیت های غیرضروری روی فرمت و طول پسورد واقعا کار حرفه ای نیست.
باید گذاشت پسورد بتونه تقریبا هر کاراکتر و هر عبارتی رو داشته باشه، و محدودیت طول هم فکر میکنم حداقل باید تا 100 یا 200 کاراکتر رو اجازه داد. تازه کاراکتر هم منظور کاراکتر یونیکد هست که هر کاراکتر اون میتونه چند بایت باشه. یک نفر باید بتونه مثلا یک یا چند جمله به زبان فارسی رو بعنوان پسورد خودش قرار بده. یک شاعر باید بتونه یک بیت از یک شعر رو در پسورد خودش داشته باشه. یک برنامه نویس باید بتونه یک خط کد برنامه نویسی رو در پسورد خودش داشته باشه. خلاصه هرکس هرچیزی رو که میتونه در ایجاد یک پسورد قوی و در عین حال طوری که بتونه راحت بخاطر بسپاره و استفاده کنه بکار ببره. چون هرچی محدودهء انتخاب پسوردها بیشتر باشه تعداد حالتهای ممکن بیشتر میشه و آنتروپی و امنیت بالا میره. البته بنده نمیگم مثلا یک کد برنامه نویسی معروف مثل <script>alert(‘XSS’);</script> رو بدون هیچ تغییری بعنوان پسورد بکار ببریم. چون طبیعتا چنین پسوردی هم میتونه ضعیف باشه و به دیکشنری های کرک اضافه بشه. ولی میشه اون رو مقداری تغییر داد و سفارشی کرد یا بعنوان بخشی از یک پسورد بکار برد. بهرحال هرچی گزینه های ممکن بیشتر باشن در مجموع فضای حالت پسوردهای ممکن بزرگتر میشه که این به نفع امنیت عمومی هست.

بعضیا گفتن بخاطر سپردن و تایپ کردن صحیح پسوردهای طولانی تر از 15 کاراکتر بیش از حد مشکله.

ولی بنده از نظر تایپ کردن هم فکر نمیکنم تایپ حتی 100 کاراکتر اونقدرها هم سخت و زمانبر باشه. مثلا بنده 200 کاراکتر رو هم در زمان خیلی کوتاهتری میتونم با دقت بالا تایپ کنم. کاربر حرفه ای واقعا اینقدر مشکل نداره با 100 تا و 200 تا. اگر پسورد رو حفظ باشید (درمورد Passphrase ها که حفظ کردن کار سختی نیست) میتونید خیلی سریع و با نرخ خطای کم تایپش کنید.
ضمنا شاید کسی به هر علتی پسورد خودش رو از جایی کپی و پیست بکنه و اصلا بحث تایپ نباشه یا فقط قسمتی از اون رو تایپ بکنه. چه میدونم شاید متنی چیزی رو از داخل فایلی یا جای دیگه (حتی عباراتی که در خود صفحه استفاده شدن) کپی پیست بکنه یا از طریق Password manager ها و این حرفا. بطور کلی هرچی انعطاف و امکانها برای پسورد بیشتر باشه بهتره. تعداد حالتها و احتمالات بالا میره که به نفع امنیت کاربران و به ضرر هکرها و کرکرها میشه.

اینم باید درنظر گرفت که در خیلی از سیستمها آدم با فواصل کوتاه لاگین نمیکنه که دشواری تایپ پسورد براش مسئلهء مهمی باشه. مثلا اکانتی که همیشه یا اکثرا در خانه استفاده میکنیم و گزینهء Remember me رو موقع لاگین چک زدیم میتونه برای ماهها نیاز به لاگین مجدد رو رفع کنه. حتی روزی یک بار وارد کردن پسورد هم لزوما کار سختی نیست.

NIST recommends 80-bits for the most secure passwords, which can nearly be achieved with a 95-character choice (e.g., the original ASCII character set) with a 12-character random password (12 x 6.5 bits = 78).[2] A 2010 Georgia Tech Research Institute study also recommended a 12-character random password, but as a minimum length requirement.

ترجمه: «NIST برای امن ترین پسوردهای مورد نیاز 80 بیت آنتروپی را توصیه میکند، که میتواند تقریبا با انتخاب 12 کاراکتر رندوم از یک مجموعهء 95 کاراکتری بدست آید. یک تحقیق سال 2010 Georgia Tech Research Institute همچنین یک پسورد رندوم 12 کاراکتری را توصیه کرد، اما بعنوان یک حداقل طول مورد نیاز.»

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

حمله های آفلاین برای کرک هش پسوردها مسلما با چنین پسوردهای ضعیفی خیلی راحتتر و سریعتر میشن و نرخ و شانس موفقیت کرکر خیلی بالاتر میره. تازه اگر سیستم و برنامه نویس بقدر کافی حرفه ای بوده باشه و از Salt رندوم با تعداد حالتهای کافی به ازای هر اکانت/پسورد استفاده کرده باشه، و باز خیلی حرفه ای بوده باشه و Key stretching هم استفاده کرده باشه (که بیشتر سیستمها استفاده نکردن و بخش بزرگی از برنامه نویسان اصلا نمیدونن یعنی چی و چیه و چطور باید پیاده کرد). وگرنه که دیگه هیچی! فاتحه خوندس!

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

As of 2011, commercial products are available that claim the ability to test up to 2,800,000,000 passwords per second on a standard desktop computer using a high-end graphics processor.

ترجمه: «از 2011، محصولات تجاری ای در دسترس هستند که ادعا میکنند قادرند تا 2 میلیارد و 800 میلیون پسورد بر ثانیه را روی یک رایانهء استاندارد دسکتاپ با استفاده از یک پردازندهء گرافیکی جدید تست کنند.»

میدونی این سرعت یعنی چی؟ وحشتناکه. میگه حدود 3 میلیارد پسورد فقط در یک ثانیه!! یک پسورد 6 حرفی متشکل از حروف انگلیسی کوچک حدود 309 میلیون حالت بیشتر نداره. من حساب کردم تازه اگر Key stretching با 2 به توان 16 دور بکار برده باشی، کل این بازه رو میشه در کمتر از 2 ساعت تست کرد. Key stretching نباشه که هیچ! در کسری از ثانیه هش کرک میشه!!

بنظرم خیلی ها ممکنه این اشتباه رو بکنن که با strlen طول پسورد رو چک کنن، درحالیکه strlen برحسب بایت عمل میکنه و نه کاراکتر یونیکد. مثلا یک حرف فارسی از دو بایت تشکیل شده؛ بنابراین یک پسورد فارسی با طول 20 کاراکتر، عملا 40 بایت میشه.

ضمنا باید فکر استفاده از Passphrase ها رو هم کرد. Passphrase ها به شکل کلمات و جملات هستن.

در این مقاله در این مورد توضیح داده: http://en.wikipedia.org/wiki/Passphrase
بخشهایی ازش رو میذارم.

to achieve the 80-bit strength recommended for high security (non-military) by NIST, a passphrase would need to be 58 characters long, assuming a composition that includes uppercase and alphanumeric

ترجمه: «برای دستیابی به امنیت 80 بیت توصیه شده توسط NIST برای امنیت بالا (غیرنظامی)، یک passphrase نیاز دارد 58 کاراکتر طول داشته باشد، با فرض ترکیبی که شامل حروف بزرگ و اعداد نیز باشد»

five-letter words each contain 2.3 bits of entropy, which would mean only a 35-character passphrase is necessary to achieve 80 bit strength.

ترجمه: «کلمات 5 حرفی هرکدام 2.3 بیت آنتروپی دارند، که بدین معناست که برای دستیابی به امنیت 80 بیت تنها یک passphrase با طول 35 کاراکتر نیاز است.»

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

خلاصه برای پسورد کاربران محدودیت 20 کاراکتر و 30 کاراکتر نذارید. نه لزومی داره و نه از نظر امنیتی عاقلانه است. بنظر بنده حداقل 100 کاراکتر یونیکد اجازه بدید. یک وقت کسی شاید به هر دلیلی خواست از یک پسورد یا passphrase واقعا قوی استفاده کنه. لزومی هم نداره حتما اون رو حفظ کرده باشه. ممکنه از یه جایی یا Password manager درش بیاره.

هرچند شاید 99% کاربران اینقدر اطلاع یا تخصص نداشته باشن یا اهمیتی ندن و پسوردهای خیلی ضعیف تری انتخاب کنن، اما این دلیل نمیشه ما برای اون 1% امکان امنیت درست و حسابی نذاریم، اونم وقتی که این کار هزینه ای نداره.

شما یک مغازه ابزارفروشی/قفل‌سازی برید، انواع قفل داره از زپرتی و ارزان تا اونایی که واقعا قوی هستن (و در ضمن گران قیمت که افراد کمی میخرن). اینطور نیست که بگن به اون قفل های قوی و گران نیازی نیست یا کسی نمیخره.

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

پاسخ دهید

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

*

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