Елементарна система срещу спам
От известно време разните умове се мъчат да измислят решение за справяне със спама - било то email или блог спам. Последната идея (на иначе интелигентния Тим Брей, един от създателите на XML) е за всяко съобщение да се плаща 1 американски цент на определена за целта организация. Сами се сещате, колко проблеми ще има за хората, за които това са не толкова малка сума пари, а и за хората, които нямат кредитна карта...
Замислих се обаче, защо съобщенията да не се таксуват с процесорно време. Нали времето е пари, все пак. :) Ако отнема 10-20 секунди за изпращането на едно съобщение, спамът би бил много по-рентабилен. Измислих едно алгоритъмче, което е доста универсално и лесно за програмиране. Моята примерна програмка (на PHP) е само 5-6 реда.
Моля, да прочетете алгоритъма, да го разберете до колкото можете и да му намерите всички дефекти и недостатъци - да го разкъсате на парчета. Ако нещо не ви е ясно - питайте! Ако получа одобрение тук, ще го публикувам на по-широк форум (и на английски). Ето и идеята:
Приема се един универсален 42-знаков шестнадесетичен ключ, например 22ba2df586f1443d121208f87565a751, който се знае от всички, ползващи системата. Email програмата на изпращача трябва да намери случаен низ от символи, които да добави към съобщението, за да бъде MD5 hash-а на съобщението същият като универсалния ключ. Разбира се би отнело твърде много време да се намери пълно съвпадение, за това програмата трябва да намери съвпадение само на първите 5 знака, тоест само първите 5 знака на двата hash-а се сравняват. Изпращачът добавя намереният случаен низ като header към съобщението и го изпраща.
Когато получателят получи съобщението, случайният низ се залепва на края на съобщението, смята се MD5 hash-а и се сравняват първите 5 знака на hash-а с първите 5 от универалният ключ. Ако съвпадат, значи за съобщението наистина са отделени 10-20 секунди процесорно време.
Така изпращачът трябва да сметне стотици хиляди hash-ове докато намери правилният, а получателят трябва да сметне само един hash за да провери дали е валидно съобщението, което отнема около 1/1000 секунда.
Когато компютрите станат по-бързи (виж Закона на Мур's_law), изпращачите ще започнат да слагат и вторият намерен низ, който води до съвпадащ hash, после третият и т.н.. Новите версии на email клиентите ще са настроени да очакват и изпращат 2, 3 или повече низа и няма да са толкова доверчиви към писма с недостатъчно низове. Алгоритъмът не се променя с времето, само броят итерации. А когато компютрите станат много по-бързи ще почне да се сравнява и шестия символ от ключа. За това ключа е 32 символа, а не само 5.
Като правило за броя на низове може да се приеме броят низове, които отнемат средно около 10 секунди за да се сметнат на най-евтиният домашен компютър, продаван от един от 5-те най-големи производители на домашни компютри.
Съобщението, което се hash-ва, трябва да съдържа адресите на изпращача и получателя, както и subject-а, така че ако се промени някой от тези параметри, трябва да се търси нов ключ. Ако съобщението е над 2048 байта, за целта на hash-ването от 2049-тия байт нататък то се отрязва. Ако съобщението е под 2048 байта, то се повтаря докато не стане точно 2048 символа. Така спамерите няма да имат полза да пращат по-кратки съобщения.
В момента на Pentium 2.4 GHz едно съобщение отнема между 10 и 20 секунди за да се намерят 2 низа (зависи от съобщението), макар че трябва да направя доста по-обективни тестове. Проверката за автентичност, както може да се очаква, отнема незначително малко време.
Напред към коментарите!
1. Стари и затворени системи
Ако се огледаш около теб (нали си в САЩ?) ще намериш на толкова места системи (вкл. и пощенски), които не са пипани от години и години, защото просто си работят. Аз съм попадал на много такива неща и политиката спрямо тях вероятно ще продължи да да бъде същата — да не се пипат докато не се срутят сами. За да получиш по-добра идея, ще ти кажа, че езикът, на който са писани доста от тези неща е Cobol.
Друг аспект е, че дори и да искаш да извършиш тези промени в пощенските сървъри може и да нямаш кода им, а и компаниите които са ги писали да не съществуват вече.
2. Пощенски списъци
Защо не помислиш, ако имаше такава пречка, кога би получил писмото за проблеми със сигурността в ОС-а си, ако в листа има 100 000 абонати примерно.
3. Диструбутирани атаки
Основните проблеми, които аз имам, не са с отделни адреси или мрежи, а с разпределените атаки. При този тип атака процесорното време не е ценен ресурс за атакуващия и дори може да се опита да направи някакъв DoS, ако отношението намиране/проверка е по-голямо от броя атакуващи машини към едно (твоята).
Това са първите неща, които ми идват на ум при такова предложение, а съм сигурен, че има много още.
1. Вярно е, промяната ще стане бавно, въобще не се надявам, че утре вече всички ще ползваме това. Плюс-а е, че всички промени се правят само в крайните точки (email клиентите на изпращача и получателя), а дори и сървъра да е написан на COBOL, малко хора още ползват клиенти на COBOL. Повечето email клиенти в момента имат автоматични системи за обновяване когато излезе нова версия, така че при доброжеланието на софтуерните фирми (и организации за софтуер с отворен код) промяната може да стане доста бързо за повечето хора.
2. Пощенските списъци си ги whitelist-ваш. Но програмата за пощенски списъци може да проверява входящите писма и да гледа дали си имат 20-секундния код, преди да ги разпрати на всички абонати. А за важните съобщения, като OS updates си има други канали, не email.
3. Никоя система няма да те предпази ако някой е готов на всичко да те спамва тебе специално. Но средния спамер спамва наред. И ако в момента за 20 секунди може да изпрати 100 съобщения (а вярвам, че са и повече), вече за 20 секунди ще може да изпраща 1 съобщение. Така за да поддържа същото ниво на изходящ спам ще трябва да си купи 100 пъти повече компютри и цената на съобщение ще стане неефективно висока.
Освен това тази идея може да се ползва и на други места - например блог коментари (кода ще е написан на JavaScript). Може да замести CAPTCHA и пр.
Идеята е добра - много добра. Ако ти цениш това да ти получа емаил-а колкото цениш 20 сек (повечето спамери наистина ма’ат наред и не им пука за който и да е индивид специално) значи е редно и аз да го ценя толкова.
Обаче аз пращам средно по 5 имейл-а на ден и хич не ми се чака по 20 секунди за всеки от тях да се изпрати. А Yahoo! Mail колко праща дневно? А на тях дали им се чака толкова (пък били те и с distributive computing и тн.)?
Идеята е практически неприложима за уебмeйл.
Много просто - при уебмейла, както при блог коментарите, кода ще се смята от браузъра (чрез JavaScript) и сървъра ще го получава на готово, без да губи никакво време. А през тия 20 секунди компютъра си бачка сам, ти нищо не трябва да правиш. Все едно да пращаш по dial-up.
Какво съвпадение :-) Снощи попаднах на този линк:
http://www.hashcash.org/
Еми шанс.. не виждам да се ползва кой знае колко това HashCash, та има още място за развитие… Иначе като гледам идеята им е почти същата.