SecureCall — это экспериментальный анонимный мессенджер для голосовых звонков на базе WebRTC с минимальным серверным компонентом (signal-only).
Задача проекта — показать, что даже без тяжелой инфраструктуры можно построить звонки, которые по безопасности не уступают крупным решениям, а в некоторых сценариях даже превосходят.
-
Бэкенд:
aiohttpWebSocket-сервер (Python 3.11+).
Используется только для сигналинга (обмена SDP/ICE).- Антифлуд, анти-replay, ограничение по Origin, токен комнаты.
- UDP discovery для поиска хоста в локальной сети.
- Защищённые HTTP-заголовки (CSP, HSTS, Permissions-Policy).
-
Фронтенд:
Vanilla JS+ WebRTC API.- Каждый пир соединяется напрямую с остальными (mesh до 10 человек).
RTCPeerConnectionс relay-only TURN (в продакшене) или STUN (dev).- Автоматическая ренегоциация, watchdog для аудио.
- Детекция речи, отображение fingerprint'ов.
-
E2E криптография:
- ECDH (P-256) для установления общего секрета.
- HKDF → AES-256-GCM (шифрование сообщений) и HMAC-SHA256 (подписи).
- Fingerprint = первые 8 байт SHA-256(pub).
- Все чаты — сквозное шифрование.
- Голос — встроенный SRTP от WebRTC (AES-GCM).
- Нет сервера-хранилища: сервер только пересылает сигналы, не видит SDP/ICE/ключей.
- Анти-replay: сервер отклоняет дубликаты ts, клиенты — строго возрастающую монотонию.
- Anti-flood: лимит 20 сообщений/сек на пира.
- Origin whitelist + токен: без токена и правильного Origin подключиться нельзя.
- Relay-only TURN: в продакшене IP пиров скрыт, соединение идёт только через TURN.
- E2E-чат: AES-GCM поверх WebRTC DataChannel.
- Fingerprints: пользователи могут сверить SHA-256(pub) голоса вручную.
- Браузер-only: клиенты — только браузеры (нет «ботов» и «CLI клиентов»).
| Фактор | SecureCall | Signal | Session |
|---|---|---|---|
| Архитектура | Сервер-сигналинг, звонки P2P | Серверы Signal (централиз.) | Децентрализованные узлы |
| Хранение данных | Нет | Метаданные у сервера | Метаданные распределены |
| Верификация ключей | Fingerprint (вручную) | Safety Numbers (QR) | Onion routing + PKI |
| Анонимность | Высокая при TURN-only | Средняя (IP известен) | Очень высокая, но медленнее |
| Масштабируемость | до ~10 пиров (mesh) | тысячи пользователей | зависит от сети |
| Устойчивость к цензуре | средняя | высокая | высокая |
Где SecureCall сильнее:
- Нет центрального сервера, нет метаданных о звонках.
- TURN-only скрывает IP собеседников друг от друга.
- Минимум логов: без SDP, ICE, токенов.
Где уступает:
- Нет onion-роутинга (как у Session).
- Mesh-конференции ограничены по числу участников (~10).
- Нет федерации и discovery как у Signal/Matrix.
- При использовании своего TURN-сервера за VPN/Tor.
- При отключении STUN и работе только через relay.
- При ручной сверке fingerprint'ов собеседников.
- При ограничении числа участников и использовании одноразовых токенов.
В таких условиях:
- Сервер не хранит ничего, кроме факта подключения.
- IP скрыт, даже от собеседников.
- Данные шифруются на двух уровнях: SRTP + E2E.
- Никаких логов, никакой централизации.
# Установить зависимости
pip install -r requirements.txt
# Запустить сервер (2 пира)
python ./main.py
# В браузере: открыть http://localhost:8790/Для продакшена:
- Настроить TURN (например, coturn).
- Включить HTTPS/WSS.
- Выставить
PROD=1,ROOM_TOKEN=...,ALLOWED_ORIGINS=....
SecureCall — лёгкий и анонимный P2P-мессенджер, который сочетает:
- простоту WebRTC,
- защиту уровня Signal,
- анонимность уровня Session (при правильной конфигурации).
Главное ограничение — масштабируемость. Но для приватных созвонов на 2–10 человек — это один из самых безопасных вариантов.