Недавно решил попробовать написать собственный мессенджер на Rust. Основной целью было сделать федеративную систему обмена сообщениями, где пользователи могут общаться между разными серверами, а сами серверы не имеют доступа к содержимому переписки.
В итоге получился AnonPeer.
[size=16]Как работает федерация[/size]
Каждый сервер в сети является независимым узлом. Пользователь регистрируется на одном сервере и получает адрес в формате:
Если Алиса отправляет сообщение Бобу, который находится на другом сервере, клиент сначала шифрует сообщение, после чего оно передаётся через сервер Алисы на сервер Боба.
Упрощённо это выглядит так:
[code] Алиса | Сервер A | WebSocket | Сервер B | Боб [/code]
При этом оба сервера видят только служебные данные и зашифрованный пакет.
[size=16]Структура проекта[/size]
Проект разделён на три части:
[list] []shared — общие структуры данных, криптография и сетевой протокол; []server — серверная часть на Axum; []client — десктопный клиент на Iced. [/list]
Сервер использует PostgreSQL для хранения пользователей и публичных ключей.
Сейчас проект поддерживает регистрацию пользователей, обмен сообщениями между серверами, локальное хранение истории переписки, сквозное шифрование и проверку подлинности собеседника через SAS-коды.
Основная идея проекта заключалась не в создании очередного клона Telegram, а в попытке реализовать собственный федеративный протокол обмена сообщениями и разобраться на практике с криптографией, WebSocket-соединениями и распределённой архитектурой на Rust.