Аутентифицировать открытый ключ из базы данных

Я написал небольшое приложение чата, где пользователи могут писать друг другу сообщения:

  • При первом входе в систему пользователь сгенерирует открытую / закрытую пару ключей, полученную из пароля пользователя.
  • Открытый ключ будет отправлен на сервер (базу данных).
  • Если пользователь (A) хочет написать пользователю (B) сообщение, пользователь A шифрует сообщение с помощью открытого ключа пользователя B и отправляет его на сервер (и сервер затем отправит его пользователю B).

Но что, если кто-то с доступом к базе данных изменит открытый ключ пользователя B в базе данных? Затем злоумышленник может прочитать все сообщения.

Можно ли как-то аутентифицировать открытый ключ в базе данных и убедиться, что он не был изменен и на 100% принадлежит пользователю B?

1 ответ

Таким образом, вы пытаетесь защититься от сценария, когда злоумышленник контролирует сервер, а серверу нельзя доверять. Поскольку вы не можете доверять какой-либо информации на сервере, вы также не можете использовать ее напрямую в любой форме проверки. Сервер может быть отнесен только к тому, чтобы быть тупым транспортом, и проверка должна проводиться непосредственно против другого партнера.

Возможность обмена ключом вне диапазона очень помогла бы здесь, а это означает, что вы можете как-то облегчить прямой обмен ключами между равноправными узлами. Поскольку трудно доверять идентификатору случайного удаленного партнера по общему Интернету, вам необходимо использовать такую ​​стратегию, как Threema: вы можете получить открытый ключ любого удаленного партнера анонимно, но ваши отношения с этим партнером тогда не проверяются. Только если вы можете встретиться лично и обменяться / проверить ключи путем физического сканирования друг друга, QR-коды заслуживают доверия.

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

Другие вопросы по тегам