Безпека і шифрування
Приватність у 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 днів — увійшовши знову протягом цього терміну, акаунт можна відновити.