Вопрос или проблема
Я хочу создать приложение для группового чата, в котором сообщения передаются и хранятся с максимальной безопасностью, но при этом история сообщений все еще видна после того, как вы или другие участники группы сменили устройства. Насколько я понимаю, PFS здесь невозможен.
Кажется, WhatsApp реализовал PFS, что имеет смысл, так как в его случае, если вы смените устройство, предыдущая история исчезает/не подлежит расшифровке. Однако, после исследования Messenger и Discord, похоже, что они хранят все в открытом виде? У Messenger есть режим “секретных сообщений”, который, по всей видимости, использует PFS.
Во всяком случае, моя первая мысль заключается в том, чтобы иметь два ключа с открытым/закрытым ключом для пользователя (аккаунта и устройства) и один симметричный ключ для группы для расшифровки сообщений. Ради простоты это пример предполагает, что пользователь может находиться только в одном групповом чате. Я думаю, что это будет работать так:
- У пользователя есть пара открытых/закрытых ключей, сгенерированных при регистрации (мы будем называть это парой ключей шифрования аккаунта). Это будет использоваться для прямого обмена сообщениями между пользователями, где история должна сохраняться.
- Когда пользователь входит в устройство, он генерирует пару открытых/закрытых ключей для устройства. Открытый ключ из этой пары отправляется на сервер. Сервер затем отправляет пользователю пару ключей аккаунта и симметричный ключ группового чата, и оба они зашифрованы открытым ключом устройства.
- Если пользователь меняет устройство, генерируется новая пара ключей для устройства.
Это, безусловно, добавляет уровень безопасности, но я все еще не уверен в этом подходе, так как ничто не мешает кому-либо обойти разрешения сервера (хотя будет IAM) и забрать все эти ключи. Я также не уверен, как лучше хранить симметричные ключи групповых чатов.
Еще одно ограничение заключается в том, что я, возможно, не смогу хранить дублирующиеся сообщения, зашифрованные с использованием открытых ключей всех участников, из-за затрат на хранение. Пожалуйста, также примите во внимание, что сервис управления ключами, такой как Keysafe или KMS, доступен, хотя они, очевидно, имеют свои ограничения.
Что вы думаете? Я глуп? Я посмотрел на некоторые другие аналогичные сообщения, но увидел ответы, которые не включали осязаемые решения.
Пока вы храните закрытые ключи на сервере, всегда будет риск того, что кто-то получит доступ к содержимому сообщений, как извне, так и внутри.
Единственный способ избежать этого – это чтобы закрытые ключи никогда не попадали на сервер.
В настоящее время я работаю над приложением для обмена сообщениями, которое имеет это ограничение истории, одновременно желая, чтобы сервер не мог открывать никакое сообщение. В настоящее время мы изучаем использование BIP39 (мнемонический код Bitcoin) для генерации корневых ключей, из которых мы затем выводим под-ключи для каждой комнаты чата. Это создает проблемы для UX, так как пользователям придется где-то хранить свои мнемонические коды и вводить их снова, когда они входят на новом устройстве, но это единственное решение, которое мы нашли, которое гарантирует нулевое знание на стороне сервера. И насколько я понимаю, я не думаю, что существует какое-либо простое решение для этой проблемы.
Подход, который вы описали, определенно кажется действительным, но мне интересно, добавленная сложность приводит ли к увеличению безопасности (закрытые ключи также хранятся на сервере).
EDIT: Учтите, что я не эксперт по безопасности.
Ответ или решение
Создание безопасного группового чата с историей сообщений, доступной на различных устройствах, представляет собой сложную задачу, требующую внимательного подхода к вопросам безопасности и удобства использования. Давайте подробно рассмотрим, как эффективно реализовать эту идею, параллельно уделяя внимание вопросам хранения сообщений и управления ключами.
1. Архитектура системы
Для начала, необходимо сформулировать общую архитектуру чат-приложения. Ключевыми аспектами являются:
- Клиентская часть: где пользователи отправляют и получают сообщения.
- Серверная часть: ответственной за хранение сообщений, управление пользователями и ключами.
- Безопасность: критически важна для защиты конфиденциальности пользователей.
2. Ключевая система и шифрование
Ваша идея с использованием пар ключей — это верный подход. Для обеспечения безопасности сообщений следует использовать асимметричное шифрование (например, RSA или ECC) для создания двух пар ключей для каждого пользователя:
- Парольная (учетная) пара: используется для обработки сообщений и управления учетной записью.
- Устройственная пара: генерируется для каждого устройства при входе пользователя.
Процесс обмена сообщениями:
- Генерация ключей: При регистрации пользователем создается учетная пара ключей.
- Устройства: При входе на новое устройство генерируется новая парная ключей, после чего сервер отправляет учетные ключи и общий симметричный ключ группы, зашифрованные с использованием открытого ключа устройства.
- Асимметричное шифрование: Сообщения шифруются симметричным ключом, который в свою очередь шифруется публичными ключами участников группы. Это поможет сохранить разграничение доступа.
3. Управление ключами
Одна из главных проблем, с которой вы сталкиваетесь, заключается в управлении ключами и хранилищем сообщений. Использование системы управления ключами (KMS) будет полезно, однако хранение приватных ключей на сервере всегда сопряжено с риском.
Предложенный подход:
- Не хранить приватные ключи на сервере: Рассмотрите возможность использования инфраструктуры управления ключами, где приватные ключи будут генерироваться и использоваться локально на стороне клиента. Например, с помощью BIP39 можно генерировать мнемонические фразы для создания и извлечения ключей, избавляя сервер от необходимости хранить эти ключи.
- Шифрование сообщений: Все сообщения могут быть шифрованы симметричным ключом и затем дополнительно шифроваться открытыми ключами всех участников группы, чтобы никто, кроме них, не мог расшифровать данные.
4. Хранение сообщений
Для минимизации затрат на хранение сообщений предложите следующее:
- Стратегия хранения: Складывайте только одну зашифрованную версию сообщения, а не отдельные версии для каждого участника группы. Выполните шифрование так, чтобы его могли расшифровывать только авторизованные пользователи (группа).
- История сообщений: Разработайте систему, которая позволит завести историю сообщений, используя облачное хранилище для хранения зашифрованных данных, где доступ будет ограничен правами пользователей.
5. Подводя итоги
Создание безопасного приложения для группового чата, где сохранение истории сообщений и доступ на разных устройствах возможен, требует хорошего проектирования архитектуры и эффективного управления ключами. Ваша исходная идея с использованием пар ключей справедлива, но необходимо учитывать риски хранения приватных ключей на сервере. Рассмотрение методов локального управления ключами и использования современных криптографических практик поможет повысить уровень безопасности вашего приложения и защитить конфиденциальность пользователей.
Эти рекомендации представляют собой основу для вашего проекта, и дальнейшее развитие идеи будет зависеть от ваших требований к безопасности и удобству работы с приложением.