اصول طراحی یک کپچای تصویری امن

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

یه مقاله یجا توضیحاتی در مورد اصول ساخت کپچا داده بود که بد نبود.

البته مقالهء ویکیپدیا هم توضیحات خوبی داشت.
مقالهء ویکیپدیا میگه:

A number of research projects have attempted (often successfully) to beat visual CAPTCHAs by creating programs that contain the following functionality:

Pre-processing: Removal of background clutter and noise.
Segmentation: Splitting the image into regions which each contain a single character.
Classification: Identifying the character in each region.

Steps 1 and 3 are easy tasks for computers.[7] The only step where humans still outperform computers is segmentation. If the background clutter consists of shapes similar to letter shapes, and the letters are connected by this clutter, the segmentation becomes nearly impossible with current software. Hence, an effective CAPTCHA should focus on the segmentation.

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

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

پس نتیجه میگیریم که باید پارازیت هایی ایجاد کنیم که 1) رنگ اونها با رنگ کاراکترهای کد امنیتی دقیقا یکسان باشه 2) باید این پارازیت ها با کاراکترها شباهت داشته باشن.

ضمنا دشوار کردن قطعه بندی (Segmentation) لزوما یا فقط با درهم آمیختگی زمینه انجام نمیشه و حتما کپچاهایی رو دیدید که خود کاراکترها رو به هم میچسبونن و حتی کاراکترها تاحدی در هم داخل میشن یا بعضی از انوع دیگر یک خط منحنی روی کاراکترها میکشن (نمونش در مقالهء ویکیپدیا هست). فکر میکنم اینها هم روشهایی برای دشوار کردن Segmentation هست.

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

بطور مثال یه نگاهی به کپچای ارائه شده در این تاپیک میندازیم:
http://forum.iranphp.org/Thread-my-captcha
در این مورد چیزی که واضح هست اینه که یک برنامه میتونه خطها/پارازیت زمینه رو از حروف براحتی تفکیک کنه. چون رنگ اونها متفاوت و رنگ هرکدام مشخص و ثابت هست. ضمنا خطهای رسم شده حتی روی حروف هم رسم نشدن که حداقل شکل کاراکترها رو در اون مناطق گسیخته و کمی مخدوش بکنن؛ یعنی هیچ تداخلی در کاراکترها ایجاد نمیکنن.

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

1 دیدگاه در “اصول طراحی یک کپچای تصویری امن

  1. خب الان از کلیپچا به صورت دیگه ای استفاده می کنن … مثلا یه جا از کاربر می خواست فلان شکل رو نقاشی کنه (البته نه درد پیکاسو :))… یا یه جا دیدم از می خوست مثل خود قفل اندروید چندتا عدد رو به هم وصل کنه و …
    راستی یه جا هم دیدم از کاربر می خواست فلان عدد رو برعکس وارد کنه :)
    ا 

پاسخ دهید

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

*

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