Защищаем авторский скрипт на php: генератор случайных паролей, привязанных к имени домена сайта, заданной длины

С самого начала, когда начал писать модуль для ДЛЕ – IsleMap, заинтересовала сначала статистика (кто поставил модуль, что на нем включил или выключил и т.д.), но потом также стала волновать его защита, чтоб все функции версии "Ультимат" были доступны только покупателям. Конечно же нет идеальной защиты, но простенькая защита, так сказать "защита от дурака" нужна обязательно, что просто элементарно не остаться вовсе без гонорара, ведь в нашем обществе не принято просить и тем более предлагать пожертвованиия.
Побегав по сети, ничего путного не нашел, пришлось изобретать велосипед: писать скрипты для генерации случайного пароля заданной длины при регистрации модуля на сервере и его расшифровку на стороне клиента (покупателя). То есть таких генераторов паролей должно быть два: на стороне клиента (домен, использующий код скрипта), купившего скрипт и на стороне сервера, где данный скрипт регистрируется, но немного измененный вариант. Но при этом пароль должен быть привязан к домену, иначе смысл его использования в сети теряется.
Как правило, многие используют такое шифрование паролей для своих скриптов:
$key = 'islepoemru'; echo md5($key).'<br />'; echo base64_encode($key);
Кто-то чуток посложней, например, чтоб пароль сложней было подобрать, используют, например, текущую дату и/или секретное слово:
$psw = eval(gzinflate(base64_decode()); $key = md5($domain.$SecretWord); $key = md5($date,$domen,$SecretWord); $key = eval(gzinflate(base64_decode($str))); $password = substr(md5(md5($key.$SecretWord.$site)),$start,$count);
Кто-то "зипует" и/или "раздувает" пароль до N символов:
$compressed = gzdeflate('Compress me',9); $uncompressed = gzinflate($compressed); echo $uncompressed;
В общем, вариантов много и все они имеют свои недостатки и преимущеста, так, например, пароль, зашифрованный base64_encode($str) легко расшифровать обратно base64_decode($str). То есть такая защита спасет на 5 минут и то, если человек, купивший (скачавший) скрипт не знает язык программирования, на котором написан сам скрипт.
Защит паролей придуманно очень много, всего их в паблике (свободном доступе) около полусотни (точно не подсчитывал). Список наиболее распространенных доступных алгоритмов инкриптеров/декриптеров (шифрование) и кодировщиков/раскодировщиков (кодирование) приведен ниже.
Шифрование от кодирования отличается тем, что нет необходимости скрывать источник (например, пароль), а нужно просто перевести слово на другой "язык"; при необходимости можно выполнить обратное действие, вот основные форматы: ASCSII, Binary, Base 64, Hex, Caesar Bruteforce. Наиболее полный список форматов:
•ASCII to Binary, Binary to ASCII, ASCII to Hex, Hex to ASCII, Binary to Hex, Hex to Binary, Backwards,
•Base 64 (Encode, Decode), Caesar Bruteforce, DES Crypt (one way),
•HTML Entities (Encode, Decode),
•l33t 5p34k 3nc0d3, l33t 5p34k d3c0d3, MD2, MD4, MD5 Crypt (one way), Igpay Atinlay, Un-Pig Latin, ROT-13,
•URL (Encode, Decode), SHA-1,
•SHA-1, SHA256, SHA384, SHA512,
•ripemd128, ripemd160, ripemd256, ripemd320, whirlpool, snefru, gost, adler32, crc32, crc32b.
Приведенныый список не исчерпывающий, но его в нашем случае использовать не бедем для защиты скриптов, а рассмотрим алгоритм генератора паролей, которые можно в дальнейшем расшифровать и проверить. Итак...
Защищаем авторский скрипт на PHP: генератор случайных паролей, привязанных к имени домена сайта, заданной длины.
$psw_sign_num = 16; #Максимальное количество символов в пароле. $psw_sign_max = 16; #Максимальное количество символов в имени домена. $psw_sign_min = 6; #Минимальное количество символов в имени домена. $psw_sign_div = 4; #На сколько равных частей делим пароль. $psw_sign_ins = '–';#Символ разделения равных частей пароля. $psw_sign_token = 0; #0 – letter & digit; 1 – letter; 2 – digit. $psw_word = 'zgr'; #Кодовое слово, например, ник, желательно не более 5-8 символов. $psw_digit = range(0,9); #Цифры, добавляемые к паролю: 0,1,2,... $domen = $_SERVER['HTTP_HOST']; #Имя домена для пароля. #Удаляем весь "мусор", кроме латинских букв в имени домена. $str = str_replace(array('www.','–','_','+'),'',$domen); #Всего около 400 типов доменов, основных – около 250. $str = str_replace(array('.ru','.ua','.net','.com'),'',$str); $str = str_replace('.','',$str); #Удаляем ненужные символы. #Удаляем цифры, если они есть. if (strlen($str)>=$psw_sign_max) $str = srt_replace(array('0','1','2','3','4','5','6','7','8','9'),'',$str); if (strlen($str)>=$psw_sign_max) { #Получаем: Array([0]=>i,[1]=>s,[2]=>l,[3]=>e,[4]=>p,[5]=>o,[6]=>e,[7]=>m). $arr = str_split($str); $duplicates = array_unique(array_diff($arr,array_unique($arr))); $unique = array_unique($arr); unset($arr); #Создадим массив уникальных букв из имени домена. $arr = array_merge($duplicates,$unique); #Создадим новую переменную для генерации пароля. $str = implode('',$arr); #Удалим промежуточные вычисления. unset($arr,$duplicates,$unique); } $len = strlen($str) + strlen($psw_word); #Добавляем секретное слово, если есть свободное место в пароле. if ($len<=$psw_sign_max) $str .= $psw_word; $len = strlen($str); while($len<$psw_sign_max) { foreach($psw_digit as $i) { $len = strlen($str); if ($len<$psw_sign_max) $str .= "$i"; } } #Получаем: islepoemzgr01234. $len = strlen($str); $arr = str_split($str); #Перемешиваем массив символов пароля в случайном порядке. shuffle($arr); #Получаем: 1z04ol3espermg2i. $str = strtoupper(implode('',$arr)); $psw = ''; $len = strlen($str); $d1 = 0; $d2 = $psw_sign_div – $len; for ($i=0;$i<$psw_sign_div;$i++) { $psw .= substr($str,$d1,$d2).$psw_sign_ins; $d1 += $psw_sign_div; $d2 = $d2 + $psw_sign_div; if ($d2==0) $d2 = $psw_sign_div; } #Удаляем последний разделитель пароля. $psw = substr($psw,0,strlen($psw) – strlen($psw_sign_ins)); echo $psw; #Получаем: 1Z04–OL3E–SPER–MG2I
Ну вот, теперь мы получили простенький, но вполне эффективный случайный пароль 1Z04–OL3E–SPER–MG2I, зависимый от имени домена сайта, т.е. под другой домен будет генерироваться совершенно другой случайный завязанный пароль. Текущий генератор случайных паролей заданной длины с привязкой к домену всего лишь пример того, что можно сделать, если же хочется запутать и обезопасить пароль еще больше, то можно, например, указать конкретный набор цифр, а не перечислять все от 0 до 9. Цифры добавлять можно разные и затем делать проверку только на наличие конкретных чисел или какой-то их диапазон, например, от 1 до 3, если диапазон превышен, значит, пароль не верен.
Также можно указать какие именно буквы и как должны чередоваться, например, в пароле не может быть подряд две одинаковых цифры или буквы, если же они есть, то сортируем массив символов повторно до тех пор, пока наш пароль не будет соответствовать нужному формату. Также можно специально в конце или начале пароля указывать текущую версию скрипта, которая будет частью пароля и, если в пароле указана другая версия, либо очень старая или будущая недействительная дата (например, время создания скрипта), то пароль не верен.
Вот так много моментов можно учесть и чем больше данных учитываем (секретное слово, дата, версия скрипта, имя домена и т.д.), тем сложнее будет взломать (подобрать брутальным методом) наш пароль.
Расшифровка пароля на стороне клиента и его постоянная сверка при вызове определенных функций или через определенный промежуток времени аналогичен: создаем пароль, вернее, создаем аналогичный набор символов, который входят в наш пароль, а затем методом последовательных исключений проверяем сначала правила формирования последовательности символов (например, нахождение в пароле только определенных цифр), если последовательность символов верна, то взаимоисключаем из массивов одинаковые символы, вот и все: если нет остатка, то пароль верен, можно продолжать выполнение скрипта дальше. Ну все, успехов в защите своих скриптов!
Другие статьи по теме seo (оптимизация), монетизации и раскрутке:
Комментариев: Комментарии (2)
Опубликованно: Четверг, Июль 22nd, 2010 в 15:12
Обновлено: 22 Июль 2010 в 15:22.
Директории: Programming
Автор: admin, все авторы.
В статье: 934 слов. Ссылки на странице.

Понравилась статья? - Не пропустите следующую, подпишитесь на RSS-канал[
Также Вы можете оставить комментарий, или
Эту статью находят по поисковым запросам:
Октябрь 9th, 2010 Комментариев: 1
Цитировать
Не задействовано в скрипте
$psw_sign_token
Очень прошу, приведите пример вариантов обратной расшифровки пароля на стороне клиента.
Октябрь 10th, 2010 Комментариев: 77
Цитировать
Вы не до конца уловили мысль топика, пример которого очень приметивен, но действенен в простых ситуациях. На самом деле пароль, если генерируется, то он уже не расшифровывается, пароль просто проверяется по шаблону и, если шаблон совпадает, то пароль подтверждается скриптом и скрипт работает. Если как-либо генерировать пароль нет надобности, то «жесткая» последовательность символов просто «вшивается» на сервере и в скрипте клиента.
Указанный пароль в топике используется как генератор на стороне клиента, так и на стороне сервера, проверяется по шаблону, если всё ок, то передается на сервер, там аналогично генерируется, сверяется с шаблоном и уже жестко прописывается в БД, т.е. более не меняется, поэтому обновление будет получать только тот клиент, у которого шаблон пароля похож и пароль соответствует паролю, сохраненному на сервере при передаче во время регистрации скрипта.
Надеюсь, доступно пояснил, если не понятно все равно, стучите в асю, объясню подробней.