2016-01-06 5 views
0

Я шифрую и дешифруя мою таблицу контактов MySQL в PHP. Все в порядке и все, но я делаю сетку данных так, чтобы у нее было единственное окно поиска, которое выполняет полный текстовый поиск по всем столбцам. Теперь проблема заключается в том, что поиск выполняется по зашифрованным данным, а не по исходным данным.PHP полный текстовый поиск по ассоциативному массиву

Так что я вынужден выполнять полный текстовый поиск на PHP. Это требует от меня повторения каждой строки, но я все равно делаю это, потому что мне нужно расшифровать ее.

Моя забота заключается в скорости, с которой мой код выполняет полный текстовый поиск, я хочу знать, есть ли лучший и быстрый способ сделать это?

$result = Some PDO query that does a PDO::FETCH_ASSOC, query has about 8 columns 
$searchPhrase = strtolower($searchPhrase); 
$aes = new AES(DATABASE_KEY, DATABASE_IV); 
$count = count($result); 

for($ii = 0; $ii <$count; $ii++) 
{ 
    $result[$ii]["ContactName"] = $aes->Decrypt($result[$ii]["ContactName"]); 
    $result[$ii]["ContactDescription"] = $aes->Decrypt($result[$ii]["ContactDescription"]); 
    /*More encrypted columns*/ 


    if (!empty($searchPhrase)) //Only do search when search phrase not empty 
    {   
     $filterRow = array_slice($result[$ii], 3); // Do not take first 3 columns  
     $data = strtolower(implode("", $filterRow)); //Flaten row as one string, all lowercase 
     if (strpos($data, $searchPhrase) === FALSE) //Now doing elimentation from array if not match 
      unset($result[$ii]); 
    } 

} 

ответ

0

только secure and efficient way to search encrypted data in PHP + MySQL осуществляется через точное соответствие, используя метод, называемый слепой индексации.

  1. магазин E(M, K1) || H(E(M, K1), K2) (например, сообщение, зашифрованное с defuse/php-encryption) в одном столбце
  2. магазин H(M, K3) во второй колонке

В псевдокоде

$cipher = Crypto::encrypt($message, $encryptionKey); // takes care of K1 and K2 for you 
$blind_idx = hash_hmac('sha384', $message, $unrelatedKey); // K3 
+1

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

0

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

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

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

+0

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

0

Загляните в функцию mysql AES_DECRYPT. По сути, вы могли бы получить все данные из базы данных в обычном формате или запустить запросы против него или просто сообщить mysql идти по строке для дешифрования данных, прежде чем сравнивать свое значение с ним. Взгляните на следующее:

MYSQL SELECT WHERE LIKE WITH AES_ENCRYPT

Multiple Where clause with decryption

+0

Я хочу сохранить сторону шифрования PHP, а ваши ссылки используют только функции MySQL, которые также делают это линейно, пытаясь избежать O (n) –

Смежные вопросы