- SEO-блог Остров МЫСЛЕЙ - http://isle-blog.ru -

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

Posted By admin On 22 Июль 2010 @ 15:12 In Programming | 2 Comments

С самого начала, когда начал писать модуль для ДЛЕ – IsleMap [1], заинтересовала сначала статистика (кто поставил модуль, что на нем включил или выключил и т.д.), но потом также стала волновать его защита, чтоб все функции версии "Ультимат" были доступны только покупателям. Конечно же нет идеальной защиты, но простенькая защита, так сказать "защита от дурака" нужна обязательно, что просто элементарно не остаться вовсе без гонорара, ведь в нашем обществе не принято просить и тем более предлагать пожертвованиия.

Побегав по сети, ничего путного не нашел, пришлось изобретать велосипед: писать скрипты для генерации случайного пароля заданной длины при регистрации модуля на сервере и его расшифровку на стороне клиента (покупателя). То есть таких генераторов паролей должно быть два: на стороне клиента (домен, использующий код скрипта), купившего скрипт и на стороне сервера, где данный скрипт регистрируется, но немного измененный вариант. Но при этом пароль должен быть привязан к домену, иначе смысл его использования в сети теряется.

Как правило, многие используют такое шифрование паролей для своих скриптов:

$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 &amp; 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)&gt;=$psw_sign_max)
 $str = srt_replace(array('0','1','2','3','4','5','6','7','8','9'),'',$str);

if (strlen($str)&gt;=$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&lt;=$psw_sign_max) $str .= $psw_word;
$len = strlen($str);
while($len&lt;$psw_sign_max) {
 foreach($psw_digit as $i) {
 $len = strlen($str);
 if ($len&lt;$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&lt;$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, если диапазон превышен, значит, пароль не верен.

Также можно указать какие именно буквы и как должны чередоваться, например, в пароле не может быть подряд две одинаковых цифры или буквы, если же они есть, то сортируем массив символов повторно до тех пор, пока наш пароль не будет соответствовать нужному формату. Также можно специально в конце или начале пароля указывать текущую версию скрипта, которая будет частью пароля и, если в пароле указана другая версия, либо очень старая или будущая недействительная дата (например, время создания скрипта), то пароль не верен.

Вот так много моментов можно учесть и чем больше данных учитываем (секретное слово, дата, версия скрипта, имя домена и т.д.), тем сложнее будет взломать (подобрать брутальным методом) наш пароль.

Расшифровка пароля на стороне клиента и его постоянная сверка при вызове определенных функций или через определенный промежуток времени аналогичен: создаем пароль, вернее, создаем аналогичный набор символов, который входят в наш пароль, а затем методом последовательных исключений проверяем сначала правила формирования последовательности символов (например, нахождение в пароле только определенных цифр), если последовательность символов верна, то взаимоисключаем из массивов одинаковые символы, вот и все: если нет остатка, то пароль верен, можно продолжать выполнение скрипта дальше. Ну все, успехов в защите своих скриптов!


Article printed from SEO-блог Остров МЫСЛЕЙ: http://isle-blog.ru

URL to article: http://isle-blog.ru/programming/safeguard-script-php/

URLs in this post:

[1] модуль для ДЛЕ – IsleMap: http://isle-blog.ru/cms-dle/modules/islemap/

Copyright © 2008 SEO-блог Остров МЫСЛЕЙ. All rights reserved.

Этот домен продается на telderi