Безопасность и шифрование
Приватность в 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 просто откажется работать.
Защита аккаунта
- Двухфакторная аутентификация — Дополнительный код при входе с нового устройства — даже если пароль скомпрометирован, войти в аккаунт без второго фактора не получится.
- Биометрический вход — Разблокировка приложения по отпечатку пальца или лицу, без ввода пароля каждый раз.
- Управление сессиями — Список всех устройств, где выполнен вход, с возможностью мгновенно завершить любую сессию удалённо.
- Резервная копия ключей — Опциональный зашифрованный бекап ключей шифрования — позволяет восстановить доступ к переписке при потере устройства, без передачи самих ключей на сервер в открытом виде.