Зашифрованный запрос к базе данных
-
05-07-2019 - |
Вопрос
Я только что узнал о переполнении стека и просто проверяю, есть ли идеи относительно ограничения, которое у меня есть с некоторыми друзьями в проекте, хотя это скорее теоретический вопрос, который я пытался найти. ответ на некоторое время.
Я не особо разбираюсь в криптографии, но если мне будет недостаточно ясно, я постараюсь отредактировать/комментировать, чтобы прояснить любые вопросы.
Если быть кратким, то окружающая среда выглядит примерно так:
Приложение, в котором внешний интерфейс используется для доступа к ключам шифрования/дешифрования, а серверная часть используется только для хранения и запросов.
Имея базу данных, к которой у вас нет доступа к нескольким полям, например, скажем, «адрес», который, как обычно, представляет собой текст/varchar.
У вас нет доступа к ключу для расшифровки информации, а вся информация поступает в базу данных уже зашифрованной.
Основная проблема примерно такая: как последовательно делать запросы к базе данных, невозможно делать такие вещи, как «где адрес типа '%F§YU/´~#JKSks23%'».(ЕСЛИ у кого-то есть ответ на этот вопрос, не стесняйтесь стрелять).
Но можно ли это сделать? where address='±!NNsj3~^º-:'
?Или это также полностью съест базу данных?
Еще одним ограничением, которое может возникнуть, является то, что передняя часть не имеет достаточной вычислительной мощности, поэтому уже шифрование/дешифрование информации начинает доводить ее до предела.(Говорю это только для того, чтобы избежать ответов типа «Экспорт объединения таблиц во внешний интерфейс и выполнение запроса там».)
Может ли кто-нибудь указать мне направление, в котором следует продолжать думать об этом?
Что ж, спасибо за столь быстрые ответы в 4 часа утра, впервые использую это сообщество. Я действительно впечатлен этим сообществом.(Или, может быть, это просто другой часовой пояс)
Просто снабжаю некоторой информацией:
Основная проблема заключается в частичном совпадении.В большинстве баз данных обязательным требованием является разрешение частичных совпадений.Основное ограничение на самом деле владельцу базы данных не будет разрешено заглядывать в базу данных в поисках информации..За последние 10 минут я придумал возможное решение, которое снова распространяется на возможные проблемы с базой данных, к которым я добавлю здесь:
Возможное решение, позволяющее получастичное сопоставление:
- Пароль + пара публичных полей пользователя на самом деле являются ключом для шифрования.Идея аутентификации состоит в том, чтобы зашифровать статическое значение и сравнить его с базой данных.
- Создание нового набора таблиц, в которых информация хранится в анализируемом виде, что означает что-то вроде:«4-я улица» станет двумя зашифрованными строками (одна для «4-й», другая для «Улицы»).Это уже позволило бы получастичное сопоставление, поскольку поиск уже можно было выполнять в отдельных таблицах.
Новый вопрос:
- Вероятно, это снова съест сервер базы данных, или кто-нибудь думает, что это жизнеспособное решение проблемы частичного сопоставления?
Пост скриптум:Я отклонил ответ Кейда Ру только для того, чтобы обеспечить дальнейшее обсуждение и, в частности, возможный ответ на новый вопрос.
Решение
Вы можете сделать это так, как вы описываете - скажем, эффективно запросив хэш, но не так много систем с этим требованием, потому что в этот момент требования безопасности мешают другим требованиям, чтобы система могла использоваться - т.е.нет частичных совпадений, поскольку это исключается шифрованием.Та же проблема со сжатием.Несколько лет назад в очень маленькой среде мне приходилось сжимать данные перед их преобразованием в формат данных.Конечно, по этим полям нелегко было осуществлять поиск.
В более типичном приложении, в конечном счете, ключи будут доступны кому-то в цепочке — возможно, веб-серверу.
Для трафика конечного пользователя SSL защищает этот канал.Некоторые сетевые коммутаторы могут защитить его между веб-сервером и базой данных, и хранить зашифрованные данные в базе данных можно, но вы не будете запрашивать такие зашифрованные данные.
И как только данные отображаются, они уже доступны на машине, поэтому любое вычислительное устройство общего назначения можно обойти в этот момент, и у вас есть защита по периметру за пределами вашего приложения, которая действительно вступает в игру.
Другие советы
почему бы не зашифровать диск, на котором хранятся таблицы базы данных, зашифровать соединения с базой данных и позволить базе данных работать нормально?
[я не совсем понимаю контекст/ограничения, которые требуют такого уровня паранойи]
РЕДАКТИРОВАТЬ:"правовые ограничения", да?Надеюсь, вы не замешаны ни в чем противозаконном, мне не хотелось бы быть непреднамеренным соучастником...;-)
если - хм - юридические ограничения - вынуждают это решение, то это все, что нужно сделать - отсутствие совпадений LIKE и медленный ответ, если клиентские машины не могут с этим справиться.
Несколько месяцев назад столкнулся с той же проблемой:вся база данных (кроме индексов) зашифрована, и возникла проблема с частичными совпадениями.
Я искал в Интернете решение, но, похоже, с этим особо нечего поделать, кроме «обходного пути».
Решение, которое я наконец принял:
Создайте временную таблицу с данными поля, к которому выполняется запрос, расшифрованными и еще одним полем, которое является первичным ключом таблицы (очевидно, это поле не нужно расшифровывать, как обычный текст).
Выполните частичное сопоставление с этой временной таблицей и получите идентификаторы.
Запросите реальную таблицу для этих идентификаторов и верните результат.
Удалите временную таблицу.
Я знаю, что это предполагает нетривиальные накладные расходы, но я не нашел другого способа выполнить эту задачу, когда необходимо полное шифрование базы данных.
В зависимости от каждого конкретного случая вы можете фильтровать количество строк, вставленных во временную таблицу, без потери данных для результата (учитывайте только те строки, которые принадлежат пользователю, выполняющему запрос, и т. д.). .
Вы хотите использовать хеширование md5.По сути, он берет вашу строку и превращает ее в хеш, который невозможно воспроизвести.Затем вы можете использовать его для проверки на предмет позже.Например:
$salt = "123-=asd";
$address = "3412 g ave";
$sql = "INSERT INTO addresses (address) VALUES ('" . md5($salt . $address) . "')";
mysql_query($sql);
Затем, чтобы подтвердить адрес в будущем:
$salt = "123-=asd";
$address = "3412 g ave";
$sql = "SELECT address FROM addresses WHERE address = '" . md5($salt . $address) . "'";
$res = mysql_query($sql);
if (mysql_fetch_row($res))
// exists
else
// does not
Теперь он зашифрован на стороне базы данных, поэтому никто не сможет его найти, даже если он заглянет в ваш исходный код.Однако обнаружение соли поможет им расшифровать ее.
Если вам нужно хранить конфиденциальные данные, которые вы хотите запросить позже, я бы рекомендовал хранить их в виде обычного текста, максимально ограничивая доступ к этим таблицам.
Если вы не можете этого сделать и вам не нужны накладные расходы во внешнем интерфейсе, вы можете создать компонент во внутреннем интерфейсе, работающий на сервере и обрабатывающий зашифрованные данные.
Делаете запросы к зашифрованным данным?Если вы используете хороший алгоритм шифрования, я не представляю, как это сделать.