Аутентифицировать открытый ключ из базы данных
Я написал небольшое приложение чата, где пользователи могут писать друг другу сообщения:
- При первом входе в систему пользователь сгенерирует открытую / закрытую пару ключей, полученную из пароля пользователя.
- Открытый ключ будет отправлен на сервер (базу данных).
- Если пользователь (A) хочет написать пользователю (B) сообщение, пользователь A шифрует сообщение с помощью открытого ключа пользователя B и отправляет его на сервер (и сервер затем отправит его пользователю B).
Но что, если кто-то с доступом к базе данных изменит открытый ключ пользователя B в базе данных? Затем злоумышленник может прочитать все сообщения.
Можно ли как-то аутентифицировать открытый ключ в базе данных и убедиться, что он не был изменен и на 100% принадлежит пользователю B?
1 ответ
Таким образом, вы пытаетесь защититься от сценария, когда злоумышленник контролирует сервер, а серверу нельзя доверять. Поскольку вы не можете доверять какой-либо информации на сервере, вы также не можете использовать ее напрямую в любой форме проверки. Сервер может быть отнесен только к тому, чтобы быть тупым транспортом, и проверка должна проводиться непосредственно против другого партнера.
Возможность обмена ключом вне диапазона очень помогла бы здесь, а это означает, что вы можете как-то облегчить прямой обмен ключами между равноправными узлами. Поскольку трудно доверять идентификатору случайного удаленного партнера по общему Интернету, вам необходимо использовать такую стратегию, как Threema: вы можете получить открытый ключ любого удаленного партнера анонимно, но ваши отношения с этим партнером тогда не проверяются. Только если вы можете встретиться лично и обменяться / проверить ключи путем физического сканирования друг друга, QR-коды заслуживают доверия.
Чтобы облегчить любой обмен ключами с удаленным одноранговым узлом через ненадежный сервер, вам, по сути, нужно реализовать обмен ключами Диффи-Хеллмана; сервер может облегчить связь, но не будет иметь никакого представления о том, какие данные обмениваются. Это должно произойти, если оба партнера находятся в сети одновременно (или это очень медленный автономный режим туда-сюда), поэтому на практике это может быть несколько проблематично в зависимости от вашего варианта использования.