Скрипт шифрования данных (пароля) в PHP

Добавлен: 

Скрипт шифрования данных (пароля) в PHP

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

Собственно сам скрипт, представленный в виде функции которую вы можете объявить в начале страницы и вызывать её в любом месте.

<?php
//создаём функцию для шифрования/расшифрования пароля
function encryption_password($data, $key_to_decrypt){
//определяем переменные с символами
$symbols = array();
for($i=0; $i < mb_strlen($data); $i++) $symbols[] = $data[$i];
//массив с символами
$characters_string = '!@#$%^&*()_+-.,';
$characters = array();
for($i=0; $i < mb_strlen($characters_string); $i++) $characters[] = $characters_string[$i];

$need_symbols = array_merge(range("a","z"),range(0,9),range("A","Z"),$characters);
$no_need_symbols = array_diff($symbols, $need_symbols);

//если нужно зашифровать------------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if($key_to_decrypt == ""){
$data = mb_substr($data, 0, 64) ;

//если подходящие, выполняем шифрование
if(count($no_need_symbols) == "0"){
$data_with_summand = array();
$data_with_encryption_step1 = array();
//шифруем (сложение)---------------->>>>>>>>
foreach ($symbols as $key1 => $value1){
foreach ($need_symbols as $key2 => $value2){
if($value1 === $value2) $number_symb = $key2;
}
$summand = mt_rand(10, 20);
$encryption = $summand + $number_symb;
$data_with_summand[] = $summand;
$data_with_encryption[] = $encryption;
unset($number_symb);
}

//шифруем (подмена)---------------->>>>>>>>
$data_encryption = array();
for($i=0; $i < count($data_with_summand); $i++){
$data_sym = $data_with_encryption[$i];
$key_sym = $data_with_summand[$i];
$key_sym1 = mb_substr($key_sym, 0, 1);
$key_sym2 = mb_substr($key_sym, 1, 1);
$key_sym_sum = $key_sym1 + $key_sym2;
$key_sym_sum = mb_substr($key_sym_sum, 0, 1);
$key_sym_difference = abs($key_sym1 - $key_sym2);
$data_sym = str_replace($key_sym_difference, 'D', $data_sym);
$data_sym = str_replace($key_sym_sum, $key_sym_difference, $data_sym);
$data_encryption[] = $data_sym;
}

//шифруем (перестановка)---------------->>>>>>>>
//массив нужного выда
$data_encryption_value = array();
foreach ($data_encryption as $key1 => $value1){
$first_value = mb_substr($value1, 0, 1);
$second_value = mb_substr($value1, 1, 1);
$data_encryption_value[] = $first_value;
$data_encryption_value[] = $second_value;
}
//корень
$square_root = ceil(sqrt(count($data_encryption_value)));
//заносим значения в "таблицу"
$init_table = array();
for($i=0; $i < $square_root; $i++){
$start = $i * $square_root;
for($p=$start; $p < $square_root+$start; $p++){
$element = $data_encryption_value[$p];
if($element == ""){
$element_rand = mt_rand(0, 10);
if($element_rand == "10") $element = 'D';
else $element = $element_rand;
}
$elements = "$elements$element";
}
$init_table[] = $elements;
unset($elements);
}
//генерируем ключ перестановки
foreach ($data_with_summand as $key1 => $value1) $key_permutation = "$key_permutation$value1";
$strlen_part_of_key = floor(mb_strlen($key_permutation) / $square_root);
$parts_of_key = array();
$key_start = "0";
for($p=0; $p < $square_root; $p++){
$parts_of_key[] = mb_substr($key_permutation, $key_start, $strlen_part_of_key);
$key_start = $key_start+$strlen_part_of_key;
}
asort($parts_of_key);
$key_permutation = array();
foreach ($parts_of_key as $key1 => $value1) $key_permutation[] = $key1;

//делаем перестановку
$secondary_table = array();
foreach ($key_permutation as $key1 => $value1){
foreach ($init_table as $key2 => $value2){
$element = mb_substr($value2, $value1, 1);
$column = "$column$element";
}
$secondary_table[] = $column;
unset($column);
}
$third_table = array();
foreach ($key_permutation as $key1 => $value1){
foreach ($secondary_table as $key2 => $value2){
$element = mb_substr($value2, $value1, 1);
$column = "$column$element";
}
$third_table[] = $column;
unset($column);
}


//генерируем ключ---------------->>>>>>>>
foreach ($data_with_summand as $key1 => $value1) $key = "$key$value1";
//генерируем шифр---------------->>>>>>>>
unset($encryption);
foreach ($third_table as $key1 => $value1) $encryption = "$encryption$value1";
//заносим в массив
$encoded = array();
$encoded[] = $encryption;
$encoded[] = $key;
return($encoded);
}
//если не подходящие символы
else return(false);
}



//если нужно разшифровать------------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else{
//разбиваем ключ в массив---------------->>>>>>>>
$key_array = array();
for($i=0; $i < mb_strlen($key_to_decrypt); $i++) $key_array[] = $key_to_decrypt[$i];

//разшифровуем (перестановка)---------------->>>>>>>>
//корень
$square_root = ceil(sqrt(count($symbols)));
//заносим значения в "таблицу"
$init_table = array();
for($i=0; $i < $square_root; $i++){
$start = $i * $square_root;
for($p=$start; $p < $square_root+$start; $p++){
$element = $symbols[$p];
if($element == "") $element = 'Z';
$elements = "$elements$element";
}
$init_table[] = $elements;
unset($elements);
}

//генерируем ключ перестановки
foreach ($key_array as $key1 => $value1) $key_permutation = "$key_permutation$value1";
$strlen_part_of_key = floor(mb_strlen($key_permutation) / $square_root);
$parts_of_key = array();
$key_start = "0";
for($p=0; $p < $square_root; $p++){
$parts_of_key[] = mb_substr($key_permutation, $key_start, $strlen_part_of_key);
$key_start = $key_start+$strlen_part_of_key;
}
asort($parts_of_key);
$key_permutation = array();
foreach ($parts_of_key as $key1 => $value1) $key_permutation[] = $key1;

//делаем перестановку
$secondary_table = array();
foreach ($key_permutation as $key1 => $value1){
foreach ($init_table as $key2 => $value2){
$element = mb_substr($value2, $key1, 1);
$column = "$column$element";
}
$secondary_table[$value1] = $column;
unset($column);
}
ksort($secondary_table);

$third_table = array();
foreach ($key_permutation as $key1 => $value1){
foreach ($secondary_table as $key2 => $value2){
$element = mb_substr($value2, $key1, 1);
$column = "$column$element";
}
$third_table[$value1] = $column;
unset($column);
}
ksort($third_table);
unset($symbols);
foreach ($third_table as $key1 => $value1) $symbols = "$symbols$value1";
//убираем лишние стмволы
$symbols = mb_substr($symbols, 0, count($key_array));


//разшифровуем (подмена)---------------->>>>>>>>
$key_encryption = array();
$data_encryption = array();
for($i=0; $i < count($key_array); $i+=2){
$data_sym = $symbols[$i].$symbols[$i+1];
$key_sym = $key_array[$i].$key_array[$i+1];
$key_sym1 = mb_substr($key_sym, 0, 1);
$key_sym2 = mb_substr($key_sym, 1, 1);
$key_sym_sum = $key_sym1 + $key_sym2;
$key_sym_sum = mb_substr($key_sym_sum, 0, 1);
$key_sym_difference = abs($key_sym1 - $key_sym2);
$data_sym = str_replace($key_sym_difference, $key_sym_sum, $data_sym);
$data_sym = str_replace('D', $key_sym_difference, $data_sym);
$data_encryption[] = $data_sym;
$key_encryption[] = $key_sym;
}

//разшифровуем (сложение)---------------->>>>>>>>
$data_array = array();
for($i=0; $i < count($data_encryption); $i++){
$data_sym = $data_encryption[$i];
$key_sym = $key_encryption[$i];
$data_array[] = abs($data_sym - $key_sym);
}

//преобразуем в символы---------------->>>>>>>>
foreach ($data_array as $key1 => $value1){
$transcript = $transcript.$need_symbols[$value1];
}
return($transcript);
}
}
?>

Для того чтобы зашифровать пароль, необходимо вызвать функцию, и передать ей шифруемую строку как параметр. Функция вернёт массив с двумя ключами, в первом будут зашифрованные данные, а во втором будет сгенерированный ключ для расшифровки.

<?php
//вызываем функцию для шифрования
$pass = encryption_password('HELLO_WORLD!!!');
//выводим массив с двумя полученными значениями (шифр и ключ)
foreach($pass as $key => $value) print("$value<br>");
?>

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

<?php
//вызываем функцию для расшифровки
$pass = encryption_password('339961D87086763437376D5566D466886960', '1414201319161814131811111418');
//выводим расшифрованный пароль
print("$pass<br>");
?>

Достоинства и недостатки данного скрипта

Достоинства:

  • Высокий уровень защиты;

Недостатки:

  • Длина шифруемой информации ограничена 64 символами, но этот лимит можно изменить на 16 строке скрипта, или убрать лимит вообще удалив эту строку;
  • Размер ключа и размер шифра будет в 2 раза больше размера исходного текста (этим и достигается надёжность). Но так как данная функция создавалась исключительно для шифрования паролей, чья длина не будет превышать 64 символа, то данный недостаток можно и не учитывать;
  • Невозможно задать свой ключ - ключ для шифра создаётся автоматически. И снова, если взглянуть на цель данной функции, то становится ясно, что задавать свой ключ не имеет смысла, так как весь этот процесс будет автоматизирован, и для каждого пароля пользователей будет сгенерирован уникальный ключ, который никогда не будет (не должен) передаваться за пределы сервера.
  • Набор символов для кодирования ограничен латинскими буквами, цифрами, и набором спец символов. Если функции передать значение для шифрования с недопустимым символом, то функция вернёт ошибку. И снова, всё для шифрования исключительно паролей.

Примечание. В данной функции использовались функции из библиотеки Multibyte для корректной работы с кодировкой UTF-8. Но для работы этих функций ваш PHP должен быть откомпилирован (установлен с) библиотекой Multibyte (MB Library). Если у вас нет возможности или желания добавлять данную библиотеку, и одновременно нет нужды работать с UTF-8, то вы можете просто заменить функции данной библиотеки, на аналогичные функции из стандартного набора (убрать у этих функций приставку mb_).

Выводы

Если вам нужна очень надёжная функция для шифрования паролей пользователей, то вот вам лучший вариант. Но если вам нужно шифровать данные, набор символов которых выходит за рамки данной функции, то лучше воспользоваться другими методами.

Не забываем оставлять комментарии и отзывы, нам важно ваше мнение!

А еcли статья Вам очень понравилась и Вы считаете, что она достойна внимания. Тогда просто поделитесь ею, в социальной сети:


Интересная рекламма:


Возможно вам будет интересно
Скачать бесплатно Apache OpenOffice 4.1.1 - бесплатный офисный пакет, который включает в себя текстовый процессор, таблицы, графический редактор, презентации, базы данных и редактор формул. Скрипт уменьшения размера изображений на PHP, с масштабированием Скачать бесплатно 7-Zip 9.20 – бесплатный архиватор данных

Комментарий добавил: Гость - Саша
Добавлен: 04 01 2013 00:06:27
Гость - Саша
Здравствуйте,
если пароль был вот таким образом зашифрован
$login_Real = mb_strtolower($login);
$realpass = hash("sha256",$login_Real.$salt.$pass1);
$salt и $login мне известны как раскодировать обратно пароль ? напишите мне на почту или в скайп: virus.crazy возможно не большое вознаграждение

Комментарий добавил: admin
Добавлен: 04 01 2013 20:49:23
Саша - Здравствуйте
я думаю что только брут форсом, выполнять кодирование аналогичным способом и сравнивать результат. Т.Е.:
создаём цикл равный количеству паролей в словаре или бесконечный цикл (до совпадения) генератора.
за каждый проход цикла мы выполняем $realpass = hash("sha256",$login_Real.$salt.$СЛУЧАЙНЫЙ_ПАРОЛЬ);
сравниваем с хешем атакуемого паса
PS простейший брут форс, другого способа я не знаю ибо не вникал в тонкости хеширования, может есть и другие способы (более быстрые) но тут уже нужно вникать. К сожалению пока у меня нет времени этим заняться
PPS в вознаграждении не нуждаюсь, если остануться вопросы пишите, я с радостью помогу чем смогу (БЕСПЛАТНО)

Комментарий добавил: Гость - иван
Добавлен: 18 06 2013 15:54:34
Гость - иван
Warning: Missing argument 2 for encryption_password(), called in Z:\home\localhost\www\shifr.php on line 243 and defined in Z:\home\localhost\www\shifr.php on line 19 - ЭТО ЧТО ЗА ОШИБКА??????

Комментарий добавил: Гость - иван
Добавлен: 18 06 2013 16:36:28
Гость - иван
Да. И еще. Что мне тут можно поменять т.к этот скрипт уже многим известен и его также могут использовать при подборе пароля

Добавление комментария

Имя -

E-mail -





Яндекс.Метрика


Power by xDroid. Copyright © 2009 - 2017 VEB.name
Копирование информации только с обратной ссылкой
Время генерации страницы : 0.0078 сек.