М.Двач / Программирование

AnonPeer /anonpeer/ AnonPeer 8 июня, 14:08 3718987 В конец треда | Веб

659 Кб, 1280x8533,9 Мб, 2560x1440

[size=18]AnonPeer[/size]

Недавно решил попробовать написать собственный мессенджер на Rust. Основной целью было сделать федеративную систему обмена сообщениями, где пользователи могут общаться между разными серверами, а сами серверы не имеют доступа к содержимому переписки.

В итоге получился AnonPeer.

[size=16]Как работает федерация[/size]

Каждый сервер в сети является независимым узлом. Пользователь регистрируется на одном сервере и получает адрес в формате:

[code]username@domain[/code]

Например:

[code]
alVN5iceANUSserveImPr-aPUNCTUMco'2im
bov#bbANUSserver-k76bPUNCTUMcoe0rm
[/code]

Если Алиса отправляет сообщение Бобу, который находится на другом сервере, клиент сначала шифрует сообщение, после чего оно передаётся через сервер Алисы на сервер Боба.

Упрощённо это выглядит так:

[code]
Алиса
|
Сервер A
|
WebSocket
|
Сервер B
|
Боб
[/code]

При этом оба сервера видят только служебные данные и зашифрованный пакет.

[size=16]Структура проекта[/size]

Проект разделён на три части:

[list]
[]shared — общие структуры данных, криптография и сетевой протокол;
[]server — серверная часть на Axum;
[]client — десктопный клиент на Iced.
[/list]

Сервер использует PostgreSQL для хранения пользователей и публичных ключей.

Клиент хранит локальные данные в SQLite.

[size=16]Шифрование сообщений[/size]

Для обмена ключами используется X25519.

При регистрации клиент создаёт пару ключей:

[list]
[]приватный ключ;
[]публичный ключ.
[/list]

Публичный ключ отправляется на сервер, а приватный остаётся только на устройстве пользователя.

Когда начинается диалог, клиент получает публичный ключ собеседника и вычисляет общий секрет.

[code]
shared_secret = my_private_key × peer_public_key
[/code]

Из полученного секрета через HKDF выводится симметричный ключ.

Далее сообщение шифруется алгоритмом ChaCha20-Poly1305.

Каждое сообщение использует случайный nonce, поэтому одинаковые сообщения после шифрования будут иметь разный набор байтов.

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

Это позволяет обнаружить подмену сообщения или попытку отправить пакет от имени другого пользователя.

[size=16]Проверка на MITM</size]

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

Для проверки используется SAS (Short Authentication String).

После вычисления общего секрета обе стороны независимо получают короткий код:

[code]
a1b2-c3d4
[/code]

Если код совпадает у обоих пользователей, значит обмен ключами прошёл корректно.

Если значения отличаются, значит кто-то вмешался в соединение или произошла ошибка.

[size=16]Отправка сообщения[/size]

Процесс отправки выглядит следующим образом:

[list=1]
[]Получение публичного ключа получателя.
[]Вычисление общего секрета.
[]Генерация ключа через HKDF.
[]Шифрование ChaCha20-Poly1305.
[]Подпись Ed25519.
[]Отправка на сервер.
[/list]

Если получатель находится на другом сервере, сервер определяет домен из адреса и устанавливает соединение с удалённым узлом.

После доставки клиент получателя:

[list=1]
[]проверяет подпись;
[]расшифровывает сообщение;
[]сохраняет его в SQLite;
[]отображает в интерфейсе.
[/list]

[size=16]Технологии[/size]

Сервер:

[list]
[]Rust
[]Axum
[]Tokio
[]PostgreSQL
[]SQLx
[]DashMap
[]tracing
[/list]

Клиент:

[list]
[]Rust
[]Iced
[]SQLite
[]notify-rust
[*]rodio
[/list]

Криптография:

[list]
[]x25519-dalek
[]ed25519-dalek
[]chacha20poly1305
[]argon2
[]hkdf
[]sha2
[/list]

[size=16]Что получилось[/size]

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

Основная идея проекта заключалась не в создании очередного клона Telegram, а в попытке реализовать собственный федеративный протокол обмена сообщениями и разобраться на практике с криптографией, WebSocket-соединениями и распределённой архитектурой на Rust.

2 8 июня, 15:22 2 3719018

Yggdrasil Network + Mimir.
Всё уже написано до тебя. Закрывай IDE и иди во двор на скамейку.

Ответы031

Аноним 3 8 июня, 16:16 3 3719031

>>3719018
у меня Nvim и почему это не может быть например обычным проектом для обучения?

Ответы038

4 8 июня, 16:46 4 3719038

>>3719031
Проекты для обучения не рекламируют.

Ответы069

Аноним 5 8 июня, 18:14 5 3719069

>>3719038
а где здесь реклама? ни ссылки на гитхаб ничего нету

6 8 июня, 19:40 6 3719110

Пиздатый мессенджер, жду бету

AnonPeer 7 8 июня, 19:55 7 3719113

а где его протестировать на данный момент можно?

sage 8 9 июня, 14:23 8 3719416

>нейронка высрала какую-то хуйню и я принес ее на харкач

Обновить тред
« /pr/В начало тредаВеб-версияНастройки/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion