Функция поиска PHP, где сравниваются зашифрованные значения - PullRequest
1 голос
/ 06 января 2012

Я делаю функцию поиска, где значение поиска должно сравниваться с двумя столбцами в таблице базы данных. Один столбец - это просто имя, а другой столбец - зашифрованное значение в формате «xxxxxx-xxxx» (только цифры). Пользователь должен иметь возможность просто искать часть общей строки в таблице.

Для сравнения имен я использую where name LIKE %search_value%, но для зашифрованного значения я не могу использовать этот способ.

Есть какие-нибудь идеи относительно того, насколько хорошим будет сравнение?

Ответы [ 3 ]

1 голос
/ 06 января 2012

Вы не можете использовать поиск с подстановочными знаками для зашифрованных значений, потому что шифрование 'a' ПОЛНОСТЬЮ и НАВЕРХ отличается от шифрования 'bac'. Не существует практического метода сопоставления подстрок в зашифрованном поле. Тем не менее, простой тест прямого равенства выполнимо. Если вы используете функцию на стороне БД, такую ​​как mysql aes_encrypt (), тогда вы можете сделать

... WHERE
      (name LIKE '%search%') OR
      (cryptedfield = AES_ENCRYPT('search', 'key'))

Для сопоставления подстроки сначала необходимо расшифровать поле:

... WHERE
    (name LIKE '%search%') OR
    (AES_DECRYPT(cryptedfield, 'key') LIKE '%search%')
0 голосов
/ 28 октября 2018

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

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

Так что вместо:

SELECT *
FROM humans
WHERE name LIKE '%search_value%';

Вы можете сделать это:

SELECT h.*
FROM humans h 
JOIN humans_blind_indexes hb ON hb.human_id = h.id
WHERE hb.first_initial_last_name = $1 OR hb.first_name = $2 OR hb.last_name = $3

А затем передайте ему три усеченных вывода хеш-функции, и вы получите записи вашей базы данных с соответствующими шифротекстами.

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

0 голосов
/ 06 января 2012

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

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

...