mcrypt (шифрование данных в базе MySQL)

Статус
В этой теме нельзя размещать новые ответы.

SparcoCF

Новичок
mcrypt (шифрование данных в базе MySQL)

Приветствую всех :)

Шифрую данные с помощью библиотеки mcrypt следующим способом:
PHP:
$norm_str = "это исходная строка";
$key = "ключик";
 
$iv_size = mcrypt_get_iv_size(MCRYPT_RC2, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
 
$str = mcrypt_cfb(MCRYPT_RC2, $key, $norm_str, MCRYPT_ENCRYPT, $iv);

print ("$str<br>");
Дешифровка соответственно такая:

PHP:
$decrypt = mcrypt_decrypt(MCRYPT_RC2, $key, $str, MCRYPT_MODE_CFB, $iv);
 
print ("$decrypt<br>");
И все бы отлично, но дело в том что все данные нужно разместить в базу.

Делаю вывод данных:
PHP:
$result = mysql_query("SELECT * FROM zasoby WHERE id>0");

while($row = mysql_fetch_array($result))
  {

  echo "" . @mcrypt_decrypt(MCRYPT_RC2, $key, $row['Nazva'], MCRYPT_MODE_CFB, $iv) . "";

  }
И так суть проблемы:
В таблице в базе всего одна запись в колонке Nazva и она следующая:
гфw \_ћ`zвmЈ,q†”± --- зашифрованная ключом что указан выше.
Результат вывода я получаю следующий:
Е…=щЃюќCдная строка

То есть строку дешифрует пополам, почему то без $iv

Вношу я данные в базу в ручную просто копирую зашифрованную строку и вставляю в таблицу.
Где я допускаю ошибку и как ее решить ?
 

zerkms

TDD infected
Команда форума
а оно не бинарные ли данные на выход даёт? mcrypt_encrypt() я имею ввиду
 

SparcoCF

Новичок
zerkms
да нет не бинарные вроди бы.

А как лучше автоматизировать тогда ввод зашифрованных данных в базу если данных будет очень много ?

В принципе я бы хотел в идеале через csv файл например вот так:
PHP:
$data=file('csv/sc.csv');
if (is_array($data))
  {
   foreach ($data as $string)
      {
       $temp=explode(";",$string);
       $key = "secret";
       $str = @mcrypt_cfb(MCRYPT_RC2, $key, $string, MCRYPT_ENCRYPT);

 $query=здесь идет запрос на вложение данных в соответствующие ячейки
$result=mysql_query($query);
}
}
но поскольку mcrypt шифрует абракадаброй :) то невозможно будет оставить разделитель ; в правильном месте ... какой же выход придумать ?
 

Фанат

oncle terrible
Команда форума
а при чем здесь " разделитель ;"? что за правильное место, в которое его надо оставить?
 

SparcoCF

Новичок
*****
ну как при чем, после того как данные зашифруются они обретут следующий вид: а¤NqїQЃtу— кѓмGЂ•№we’вЖСuL!ќEJа<R2У&жяБ

каким образом разделить их ? Нужен же разделитель, а этот разделитель тоже зашифровался. И как быть ?
 

Фанат

oncle terrible
Команда форума
по-моему, ты уже разделил их перед этим? или мне кажется?
что делает строчка $temp=explode(";",$string); ?

-~{}~ 27.05.09 17:55:

зачем ты их вообще шифруешь-то?
 

SparcoCF

Новичок
Ты совершенно прав он разделяются здесь $temp=explode(";",$string); но на этом этапе они только разделены их нужно поместить в базу это я осуществляю вот так:
$query="INSERT INTO zasoby SET Nazva='$temp[0]',Teh='$temp[1]'";

Но в таком виде данные будут открыты а нужно что бы они были зашифрованы.

Вообще шифрую для того что бы если кому то база попала в руки она была бесполезна поскольку зашифрована. И просто интересно как решить данную задачу.
 

vovanium

Новичок
SparcoCF
да нет не бинарные вроди бы.
Интересно с чего ты это взял?

А как лучше автоматизировать тогда ввод зашифрованных данных в базу если данных будет очень много ?
Т.е. по-твоему копирование вручную из броузера и вставка в базу это автоматизация? Что мешает сразу из скрипта вставлять зашифрованные в mysql?

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

SparcoCF

Новичок
vovanium
конечно что копи пейст это не автоматизация, для этого я и думаю как осуществить это с помощью csv парсера, вставлять данные сразу из скрипта не мешает ничего просто если этих данных очень много скрипт будет громоздкой и неудобно обновлять данные в базу.

Шифровать по отдельности тоже не подходит (Данных много и они в Екселе) Разделять после расшифровки тоже не подходит поскольку нет единого шаблона разделения.
 

vovanium

Новичок
если этих данных очень много скрипт будет громоздкой и неудобно обновлять данные в базу
Ничего там не будет громоздкого, к тому же у INSERT есть более компактный синтаксис
Шифровать по отдельности тоже не подходит
Это решается совсем не количеством данных, а тем как тебе эти данные нужно в дальнейшем обрабатывать. Если нужна возможность доставать отдельные столбцы, то нужно разделять, если всегда нужно все поля сразу, то шифруешь всё вместе.
Если же очень хочешь использовать разделитель между зашифрованными строками, то преобразовывай зашифрованные строки в base64.
Просто есть еще один нюанс, если ты будет шифровать поля по отдельности, то они будут больше места занимать, чем зашифрованные вместе, так как алгоритмы шифруют блоками, и если ты выбрал к примеру шифрование с блоком 256 бит (т.е. 32 байта), то из одного-двух символов на выходе будет получаться 32 символа.
 

SparcoCF

Новичок
Единственный выход который я пока вижу выглядит так:

Алгоритм:
Парсим csv -> Разбиваем -> Вставляем в базу -> Выводим данные -> Шифруем -> Апдейтим базу -> Конец

Скрипт:

PHP:
$data=file('csv/sc.csv');
if (is_array($data))
  {
   foreach ($data as $string)
      {
       $temp=explode(";",$str);
       $query="INSERT INTO zasoby SET Nazva='$temp[0]',Teh='$temp[1]'"; 
       $result=mysql_query($query);
      } 
   } die (mysql_error());
    
     $key = "secret";
     $query2="SELECT * from zasoby WHERE id>0'";
     while($row = mysql_fetch_array($query2))
  {
    $col1 = @mcrypt_cfb(MCRYPT_RC2, $key, $row['Nazva'], cfb);
    $col2 = @mcrypt_cfb(MCRYPT_RC2, $key, $row['Teh'], cfb);
  }
    
   $query3 = "UPDATE zasoby SET Nazva='$col1',Teh='$col2' WHERE id>0";
 

vovanium

Новичок
ну вроде как и цикл foreach тебе известен, что мешает после
PHP:
$temp=explode(";",$str);
выполнить цикл типа
PHP:
foreach($temp AS $k => $v) {$temp[$k] =  mcrypt_cfb(MCRYPT_RC2, $key, $v, cfb); }
 

vovanium

Новичок
P.S. кроме того
1. почитай, как правильно парсить csv (точка с запятой может быть и в данных)
2. также почитай про синтаксис Extended Insert, типа
INSERT INTO table VALUES (1,2), (2,3)...
3. почему используешь именно RC2 алгоритм?
4. почему die (mysql_error()); прикручено к if (is_array($data)) ?
 

Фанат

oncle terrible
Команда форума
SparcoCF
тебе не кажется, что сначала стоит научиться немного программировать, а потом уже в конспирашки играть?
 

SparcoCF

Новичок
vovanium
1. Если не сложно то дай ссылку обязательно почитаю знаю что есть еще fgetcsv ты прав на все 100% что может точка с запятой встречаться и в данных.

2. Учту, попробую так.

3. РЦ2 просто первым под руку попал :) а так в окончательном варианте буду скорее всего использовать Blowfish

4. Уберу :) ошибся

-~{}~ 27.05.09 19:22:

*****
тебе не кажется, что сначала стоит научиться немного программировать, а потом уже в конспирашки играть?
ну мне интересно в конспирашки поиграть :) и если знаешь как решить данную задачу правильно то подскажи, интересно увидеть твой вариант.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума

Бред сивой кобылы.
Если хватит ума забрать БД, то хватит ума найти ключи и расшифровать данные.
Кстати а id-то у тебя не шифруется.
Непорядок.
Зашифруй обязательно.
 

SparcoCF

Новичок
Mr_Max
Так хочешь сказать что шифрование данных бесполезное ?
 

Фанат

oncle terrible
Команда форума
Я бы сказал, что оно вредное.
Если возникают вопросы типа "У меня есть две переменные. Я могу поместить их в базу незашифрованными. У меня есть функция шифрования. Как мне поместить в базу зашифрованные?", то надо что-то сначала с головой делать. Тренировать там как-то.
И только после того, как такие вопросы отпадут, думать о шифровании и прочих романтических вещах
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху