Как искать значение, когда значение хранится в зашифрованном виде - PullRequest
0 голосов
/ 06 января 2010

В моей базе данных я храню информацию об ученике в зашифрованном виде.

Теперь я хочу выполнить поиск, чтобы получить список всех учеников, чье имя начинается с «чего-то» или содержит «что-то»

Кто-нибудь знает, как можно выполнить этот тип запроса? Пожалуйста, предложите

Ответы [ 3 ]

1 голос
/ 12 января 2010

Другой вопрос указывает на SQLCipher - это реализация sqlite, которая выполняет шифрование в базе данных. Похоже, он нацелен на ваш вариант использования - он даже уже используется в нескольких приложениях для iPhone.

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

Если вы все еще настаиваете на том, чтобы не выполнять шифрование в базе данных, это не сработает для вас.

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

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

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

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

Другой вариант - хранить фрагменты данных в незашифрованном виде. Например, если у вас есть поле first_name и вы хотите иметь возможность извлекать все записи, где first_name начинается с a, укажите поле first_name_first_letter. Очевидно, что это не будет хорошо масштабироваться - если вы хотите искать все записи, в которых first_name содержит ill, вам придется хранить полный first_name в незашифрованном виде.

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

0 голосов
/ 12 января 2010

Если все, что вам нужно, это эквивалент «начинается с» и «содержит», вы можете сделать что-то с битовым полем и побитовыми логическими операторами.

Точно не знаю, какой синтаксис вы бы использовали (я немного разбираюсь в SQL), но идея состоит в том, чтобы создать дополнительное поле для каждой записи, в котором для каждой буквы, встречающейся в имени, установлен бит , затем сделайте что-то вроде:

SELECT * from someTable where (searchValue & bitField)> 0

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

Очевидно, что при этом вы будете пропускать некоторую информацию о содержимом поля, но вы, вероятно, сможете уменьшить ее, зашифровав также битовые поля или включив несколько дополнительных битов в каждом битовом поле, чтобы вы могли ' например, сказать "bob" из "bobby".

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

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