[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Самописная ф-ция шифрования и MySql
bobo
Всем утра, помогите ламеру решить проблему.
Есть небольшой класс шифрования:

class myCrypt {



private static $salt = "c59d0e730a3bd00239a146a7acd5ca62"; //cryptSalt
private static $overSalt = "3939e70c95745e67a4fb234882e6127b"; //cryptOverSalt



private function __construct($salt,$overSalt) {

$this -> salt = $salt;
$this -> seq = $overSalt;

}



public static function encode($str) {

if ($str != NULL) {

$gamma = "";

while (strlen($gamma) < strlen($str)) {

$overSalt = sha1($gamma.$overSalt.$salt,true);
$gamma .= substr($overSalt,0,8);

}

return $str^$gamma;

}

return NULL;

}



}



Проверяем работу:


require_once "../lib/crypt.php";

$str = "16";

$x = myCrypt::encode($str);

echo "Строка для шифрования: <u>".$str."</u>";
//echo "<br><br>Шифруем: <u>".$x."</u>";
echo "<br><br>Шифруем: <u>".htmlspecialchars($x)."</u>";
echo "<br><br>Дешифруем: <u>".htmlspecialchars(myCrypt::encode($x))."</u>";

(
$str === myCrypt::encode($x)) ? $itog = "Все ок" : $itog = "Ошибка";

echo "<br><br><br><br>Сравниваем строку до шифрования и после: <b>".$itog."</b>";



Тут все ок, работает как часы.

Все это делается для того, что б в БД можно было хранить данные в зашифрованном виде.
Тут возникла забавная проблема: при записи в БД двузначных чисел, которые оканчиваются на "2", "3", "4", "5", "9" и последующем их выдергивании расшифровке и выводе в браузер пропадает вышеназванная цифра)) Т.е. если ввести 23 и сохранить в БД - выведет 2, если ввести 65 - выведет 6 и т.д.

При проверке без записи в БД вторым кодом все ок :) Тип поля в БД varchar(250), пробывал менять - не помогает.

+ Еще хотел спросить: сейчас все это шифруется с помощью стандарта sha1
$overSalt = sha1($gamma.$overSalt.$salt,true);

пробывал использовать md5 - вышеописанная проблема пропадает.
Повторяю, что я ламер, подскажите, есть ли принципиальная разница, какой именно стандарт шифрования использовать и вообще в целом вы сами бы стали использовать нечто подобное для защиты информации в БД, т.е. конкретно данный способ имеет право на жизнь ?

Заранее благодарю за советы!



Спустя 2 часа, 59 минут (14.03.2012 - 10:26) bobo написал(а):
Вообще нЕчего сказать ? о_О

Спустя 11 минут, 24 секунды (14.03.2012 - 10:37) ADiel написал(а):
while (strlen($gamma) < strlen($str)) {

Кодировка UTF8 ?
В этой кодировке русская буква - 2 байта, цифра - 1 байт

Спустя 1 минута, 16 секунд (14.03.2012 - 10:38) Игорь_Vasinsky написал(а):
Может
Цитата
$gamma .= substr($overSalt,0,8);


sha1 - 40 символов
md5 - 32

ADiel
там нет кириллицы - тока хэш

Спустя 41 секунда (14.03.2012 - 10:39) Игорь_Vasinsky написал(а):
а.. пардон. хэшируется потом.

Спустя 1 минута, 17 секунд (14.03.2012 - 10:40) Игорь_Vasinsky написал(а):
не понял этот момент

0. if ($str != NULL)

1. $gamma = "";

2. while (strlen($gamma) < strlen($str)) {

Спустя 4 минуты, 59 секунд (14.03.2012 - 10:45) bobo написал(а):
Цитата (Игорь_Vasinsky @ 14.03.2012 - 12:40)
не понял этот момент

0. if ($str != NULL)

1. $gamma = "";

2. while (strlen($gamma) < strlen($str)) {

if ($str != NULL) - сделано для того, что б при выборке из БД, поля со значением "NULL" игнорировались (если условие убрать, то значения таких полей выводятся как "0").

В общем по поводу "съедания" цифры подсказали: перед записью в БД обрабатывать результат работы моей функции функцией base64_encode, при чтении из БД соответственно base64_decode - вроде все ок сейчас.

По поводу целесообрасности использования такого варианта хотел бы услышать мнения smile.gif

Спустя 2 минуты, 56 секунд (14.03.2012 - 10:48) ADiel написал(а):
gzinflate с паролем и в бинарный вид в базу.
Получится нормальное обратимое шифрование =))


Спустя 9 минут, 28 секунд (14.03.2012 - 10:58) bobo написал(а):
Цитата (ADiel @ 14.03.2012 - 12:48)
gzinflate с паролем и в бинарный вид в базу.
Получится нормальное обратимое шифрование =))

Так тут получается есть теоретическая вероятность, что в случае кражи БД всю информацию можно будет легко расшифровать, пользуясь готовыми php функциями. В случае же с самописной такая вероятность намного меньше, не ? smile.gif

Спустя 1 минута, 55 секунд (14.03.2012 - 11:00) ADiel написал(а):
Пароль поставь семиведерный. В любом случае все можно расшифровать. Это лишь вопрос времени.

Тем более твой алгоритм всем известен на этом форуме =)))

+ мой вариант куда производительнее

Спустя 3 минуты, 29 секунд (14.03.2012 - 11:03) bobo написал(а):
Ок, спасибо smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.