Как организовать эффективный поиск в шифрованной системе?

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

В связи с этим у меня возникает следующий вопрос: существуют ли способы ускорить поиск по зашифрованному тексту? 

P.S. Это также служит аргументом в сторону Телеграма, который, судя по всему, осуществляет поиск за очень короткое время, обрабатывая данные на сервере, а не на клиенте.
  • 15 октября 2024 г. 14:15
Ответы на вопрос 3
Для организации эффективного поиска по шифрованным сообщениям существует несколько подходов, которые могут помочь улучшить производительность, не нарушая конфиденциальности данных. Вот некоторые из них:

### 1. **Гомоморфное шифрование**
Гомоморфное шифрование позволяет выполнять вычисления над зашифрованными данными, не расшифровывая их. Это значит, что вы можете выполнять поиск и другие операции, не получая доступ к вашему оригинальному тексту. Ниже приведены основные моменты:
- **Преимущества**: Позволяет вести поиск по зашифрованным данным на сервере.
- **Недостатки**: Сложности в реализации и дорогие вычислительные затраты.

### 2. **Шифрование с поддержкой поиска**
Этот подход включает в себя использование специального типа шифрования, который поддерживает операции поиска. Например, можно использовать **протоколы с поддержкой поиска** (например, searchable symmetric encryption, SSE). 
- **Преимущества**: Позволяет осуществлять поиск по зашифрованным данным.
- **Недостатки**: Необходимость изменения схемы шифрования и повышенные затраты времени на шифрование и индексирование.

### 3. **Индексация зашифрованных данных**
Можно создать индекс для зашифрованных данных, который позволит быстро находить элементы по ключевым словам. Обычно это можно сделать с использованием **инвертированных индексов**.
- **Как это работает**: Вместо того чтобы шифровать сообщения целиком, шифруются отдельные ключевые слова или фразы. На основе зашифрованных ключевых слов создается индекс, который затем можно использовать для быстрого поиска.
- **Недостатки**: Может потребоваться компромисс между компрометацией данных и возможностью поиска.

### 4. **Партиционирование данных**
Вы можете разбить сообщения на категории или временные отрезки, и шифровать их отдельно. Поиск может быть выполнен по меньшему набору зашифрованных данных.
- **Преимущества**: Ускоряет процесс обращения к данным.
- **Недостатки**: Усложняет архитектуру данных.

### 5. **Использование метаданных**
Вы можете хранить некоторые метаданные о сообщениях (например, дата, отправитель, теги) в незашифрованном виде, при этом сам текст сообщений будет зашифрован. Это позволит выполнять более быстрый поиск по метаданным, и после нахождения результата можно будет расшифровать соответствующие сообщения.
- **Недостатки**: Увеличивает риск утечки данных.

### 6. **Смешанная архитектура**
Еще один вариант - это комбинировать локальный и серверный поиск. Вы можете сначала искать по метаданным и после этого запрашивать конкретные сообщения для расшифровки.
- **Преимущества**: Увеличивает скорость общего процесса.
- **Недостатки**: Может потребовать больше ресурсов на сервере для обработки запросов.

### Заключение
Выбор подхода будет зависеть от ваших требований к безопасности, производительности и сложности реализации. Шифрование с поддержкой поиска или гомоморфное шифрование могут оказаться наиболее эффективными решениями, однако их реализация может быть высокозатратной. Индексация и использование метаданных — более гибкие варианты, которые также стоит рассмотреть.
Например, продолжить твое "сейчас" и на клиенте хранить индекс всех сообщений (если такое возможно). А так гугли "searchable symmetric encryption" и "полностью гомоморфное шифрование"
"Быстро" не получится. 
Ваш подход максимально верный - поиск должен осуществляться на клиенте.

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