Как хранить зашифрованные данные с возможностью запроса в MySQL? - PullRequest
6 голосов
/ 26 октября 2011

Мне нужен способ хранения зашифрованных данных, чтобы я все еще мог выполнять запросы.Это вообще возможно?

По крайней мере, мне нужен алгоритм шифрования, который всегда возвращает одну и ту же строку для одного и того же ввода, поэтому я могу найти всех пользователей с именем «Джон», зашифровав эту строку и найдя зашифрованный результат.в БД.В PHP mcrypt всегда возвращает разные строки (я знаю, что это специально для улучшения безопасности).

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 26 октября 2011

Зависит от того, как вы храните это имя «Джон».Если это ЕДИНСТВЕННАЯ вещь в определенной области, вы можете сделать что-то вроде

SELECT ...
FROM sometable
WHERE cryptedfirstname = AES_ENCRYPT('John', $key)

Если «Джон» является частью более крупной строки («Джон Доу» или «Кинг Джон, Правитель Вселенной»)тогда вам придется расшифровать полное поле и сопоставить его с этим

SELECT ...
FROM sometime
WHERE INSTR(AES_DECRYPT(cryptedFULLame, $key), 'John') > 0

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

Вы не сможете сделать что-то вроде:

...
WHERE INSTR(cryptedFULLname, AES_ENCRYPT('John', $key))

из-за того, как AES и большинство других пользователей / приличныхкриптосистемы работают.

2 голосов
/ 26 октября 2011

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

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

Исключением может быть, если вы шифруете большие, «непредсказуемые» уникальные номера, например, идентификаторы сеанса или UUID.В этом случае, поскольку обычные тексты не повторяются, и злоумышленник не может предсказать действительные открытые тексты, неразличимость зашифрованного текста не требуется.открытый текст, как и при использовании режимов, которые принимают вектор инициализации, если вы всегда используете один и тот же IV.Обычно это не очень хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...