Безопасность и шифрование
Приватность в WallyMates — не один переключатель в настройках, а несколько независимых уровней защиты, каждый под свою угрозу: перехват на сервере, кража телефона, MITM-атака во время звонка, синхронизация с веб-версией.
Сквозное шифрование один на один — Static X3DH
Личные чаты шифруются собственной реализацией Static X3DH (тройной Diffie-Hellman обмен на основе идентификационного ключа, подписанного pre-key и эфемерного ключа — упрощённая, «SESAME-lite» схема многоустройственных сессий по мотивам подхода Signal) с AES-256-GCM. Ключ шифрования выводится отдельно для каждой пары устройств — без цепочки Double Ratchet и без одноразовых pre-key, более простая модель, чем классический Signal-протокол, но сервер так же никогда не видит содержимое и не получает ни одного из ключей.
- Приватный ключ остаётся на устройстве — Долгосрочный идентификационный ключ генерируется локально и хранится в защищённом аппаратном хранилище (Android Keystore) — извлечь его программно невозможно даже с root-доступом.
- Сервер не видит содержимое — Через сервер проходит только зашифрованный блок данных — расшифровать конкретное сообщение может только то устройство, для которого оно зашифровано.
- Отдельный ключ для каждой пары устройств — Ключ выводится независимо для каждой пары «ваше устройство ↔ устройство собеседника» — компрометация одного устройства не раскрывает переписку со всех остальных устройств сразу.
- Синхронизация между собственными устройствами — Отправленное сообщение дополнительно шифруется отдельно для каждого из ваших других устройств (Android, Windows, веб) — так оно появляется в истории везде, где вы вошли, без передачи ключей через сервер в открытом виде.
- Секретные чаты — Отдельный режим переписки с таймером самоуничтожения сообщений — по истечении времени сообщение удаляется с обоих устройств навсегда.
Сквозное шифрование в группах — Sender Key
Групповую переписку нельзя эффективно шифровать так же, как один на один — пришлось бы отдельно шифровать каждое сообщение для каждого участника. Вместо этого WallyMates использует схему Sender Key (v5): каждый участник генерирует собственный ключ AES-256 для конкретной группы и распространяет его другим участникам, зашифровав персонально через тот же сквозной зашифрованный канал, что и обычные личные сообщения, — сервер видит только зашифрованные блоки, не сам ключ. Сами сообщения в группе после этого шифруются быстрым AES-256-GCM этим общим ключом — без повторного согласования ключа на каждое сообщение. Протокол побитово совместим между Android и Windows — одна и та же схема распространения и шифрования ключей на обеих платформах.
Больше о самих группах и каналах — на странице «Группы и каналы».
Проверка звонков — защита от MITM
Голос и видео в звонке защищены отдельно (см. раздел «Звонки»), но остаётся вопрос: как убедиться, что звоните именно тому человеку, а не кому-то, кто подменил соединение? Во время звонка приложение показывает «отпечаток звонка» — последовательность из 96 эмодзи, вычисленную из долгосрочных идентификационных ключей обоих собеседников. Если сравнить эту последовательность вслух и она совпадает — подмена исключена: злоумышленнику понадобился бы приватный ключ собеседника, которого нет даже у сервера. Это та же идея, что «код безопасности» в Signal или WhatsApp, и алгоритм идентичен на Android и Windows.
Больше о самом звонке — на странице «Звонки».
Синхронизация с веб-версией
Веб-мессенджер (web.worldmates.club) — отдельный случай: чтобы показать историю переписки в браузере, сообщения дополнительно перешифровываются ключом Web Sync (AES-128) и хранятся в базе данных в зашифрованном виде. Это осознанный компромисс: без него веб-версия просто не смогла бы показывать историю чатов.
Локальное хранилище
- Зашифрованная база данных — Локальная база на устройстве (кеш сообщений, черновики, вложения) защищена SQLCipher — AES-256-шифрование «на диске», отдельно от E2EE самой переписки.
- EncryptedSharedPreferences — Сессия пользователя и ключи доступа к API хранятся в системном защищённом хранилище Android, а не в обычных настройках приложения.
- Проверка целостности приложения — При запуске приложение сверяет собственную цифровую подпись (SHA-256 сертификата) — модифицированная или поддельная сборка APK просто откажется работать.
Что попадает на серверы WallyMates?
«Зашифрованное хранилище сообщений» — это не то же самое, что «сервер не хранит ничего». Ниже — честный список того, что сервер действительно видит, а что нет, без абсолютных утверждений сверх того, что реально гарантирует текущая реализация.
Что сервер получает и хранит
- Данные аккаунта и профиля — Имя пользователя, отображаемое имя, аватар, email или телефон, использованные при регистрации.
- Метаданные маршрутизации — Кто кому и когда пишет (отправитель, получатель, группа или канал, время) — это нужно, чтобы вообще доставить сообщение, и касается любого мессенджера, не только WallyMates.
- Зашифрованные блоки сообщений — Сам текст личных и групповых чатов хранится как шифротекст, который сервер не может расшифровать (подробнее — в разделах выше).
- Короткий фрагмент ответа в открытом виде — Когда вы отвечаете на сообщение в сквозно зашифрованном чате, приложение-отправитель дополнительно отправляет первые ~100 символов оригинала как plaintext-превью — сервер не может сам расшифровать оригинал, чтобы сгенерировать превью, поэтому его передаёт клиент.
- Содержимое каналов — Посты в каналах — это вещание на широкую аудиторию, не зашифровано сквозно (то же исключение, что уже упомянуто в разделе о синхронизации с веб-версией).
- Технические данные для уведомлений и сессий — Токены устройства для push-уведомлений, список активных сессий для раздела «Защита аккаунта» выше.
Что защищено сквозным шифрованием
Сам текст личных чатов (Static X3DH) и групповых чатов (Sender Key) сервер расшифровать не может — ни одна из версий шифра, которая сейчас используется новыми сообщениями (cipher_version 6 для личных, 4 для групповых), не предусматривает серверного ключа расшифровки. Голосовые и видеозвонки 1 на 1 идут напрямую между устройствами (WebRTC) — серверы приложения вообще не получают медиапоток звонка, только служебную информацию для установления соединения.
О повседневных функциях переписки — на странице «Общение».
Где хранится приватный ключ
- Android — Android Keystore — аппаратно защищённое хранилище, из которого ключ нельзя программно извлечь даже с root-доступом.
- Windows — Ключ шифруется через Electron safeStorage (использует защиту уровня ОС — DPAPI в Windows) перед сохранением локально; тот же механизм с версии 2 защищает и офлайн-кеш сообщений на диске — до этого кеш на Windows хранился в открытом виде, это было исправлено.
Оба клиента — на странице «Скачать».
Защита аккаунта
- Двухфакторная аутентификация — Дополнительный код при входе с нового устройства — даже если пароль скомпрометирован, войти в аккаунт без второго фактора не получится.
- Биометрический вход — Разблокировка приложения по отпечатку пальца или лицу, без ввода пароля каждый раз.
- Управление сессиями — Список всех устройств, где выполнен вход, с возможностью мгновенно завершить любую сессию удалённо.
- Резервная копия ключей — Опциональный зашифрованный бекап ключей шифрования — позволяет восстановить доступ к переписке при потере устройства, без передачи самих ключей на сервер в открытом виде.
- Удаление аккаунта — Аккаунт деактивируется сразу и окончательно удаляется через 45 дней — войдя снова в течение этого срока, аккаунт можно восстановить.