Як працює Clavenzo
Загалом, простими словами й без пропуску важливого. Якщо зовсім коротко: ваш телефон чи комп'ютер створює ключ, цей ключ — ваша адреса, а все між двома пристроями шифрується ключами, які мають лише вони двоє.
Ваша ідентичність — це ключ, а не обліковий запис
Більшість месенджерів починають із прохання дати номер телефону. Цей номер видає оператор, він прив'язаний до офіційного імені, його може перенести будь-хто, кому вдасться вмовити продавця в салоні, і за ним вас знайде кожен, хто його має. Це погана основа для приватної розмови.
Clavenzo починає інакше. Коли ви вперше відкриваєте застосунок, він генерує на пристрої пару криптографічних ключів. Відкрита половина стає вашою адресою. Приватна залишається на пристрої. Вона ніколи не копіюється в хмару й ніколи не зберігається в нас. Пристрій вона залишає, лише якщо ви самі її експортуєте, запечатавши одноразовим кодом.
Вашу адресу показано двома способами: як QR-код, який можна відсканувати, і як той самий код, записаний символами, — 52 літери й цифри групами по чотири, які можна скопіювати й вставити. Є також короткий код — лише для перевірки, що ви розмовляєте з потрібною людиною. Він закороткий, щоб за ним когось додати, але достатньо довгий, щоб звірити вголос.
Що відбувається, коли ви телефонуєте
Двом телефонам треба знайти один одного, а потім узгодити ключ. Clavenzo робить друге так, що перше стає нецікавим для того, хто підслуховує.
- Пошук одне одного. Якщо ви телефонуєте комусь зі списку Nearby в тій самій мережі Wi-Fi, телефони з'єднуються напряму, без жодного сервера. В інших випадках невелика служба рандеву доставляє запечатану пропозицію, і два телефони намагаються прокласти між собою прямий шлях. Для цього кожен телефон повідомляє іншому свої мережеві адреси, тож застосунок співрозмовника дізнається вашу IP-адресу.
- Узгодження ключа. Два пристрої виконують підписаний ефемерний обмін X25519, а за мить після з'єднання додають поверх нього постквантовий обмін ключами ML-KEM-768. «Ефемерний» тут головне слово: ключі створюються для одного цього дзвінка й знищуються, коли він завершується.
- Розмова. Мова кодується лише в 33 байти кожні 20 мілісекунд (у HD — більше, якщо дозволяє з'єднання), і кожен такий пакет окремо шифрується й автентифікується. Для будь-кого, хто стежить за мережею, вміст виглядає як випадковий шум, хоча з часу надходження пакетів усе ж видно, коли хтось говорить.
- Перевірка. Обидва телефони виводять чотири слова з ключа, який було узгоджено насправді. Вимовте їх уголос. Якщо на обох екранах вони збігаються, посередині немає третьої сторони.
Цей останній крок люди пропускають, а він найважливіший. Шифрування гарантує, що вас може прочитати той, хто має другий ключ. Саме собою воно не скаже вам, хто це. Дізнатися це допомагають чотири слова.
Чому запис сьогоднішнього дзвінка залишиться нечитабельним
Поширена й цілком реальна атака — терпляча. Записати зашифрований трафік зараз, здобути ключ пізніше (через судовий запит, крадіжку чи злам пристрою через роки) і спокійно розшифрувати запис.
Ефемерні ключі роблять це неможливим. Ключ, яким насправді було зашифровано ваш дзвінок, існував, поки тривав дзвінок, на двох пристроях, і наприкінці був знищений. Ваш довгостроковий ключ ідентичності лише підписує обмін; він не шифрує жодної секунди звуку. Скомпрометувавши його завтра, хтось зможе завтра видати себе за вас. Але не зможе відкрити записане вчора.
Ця властивість називається прямою секретністю, і це найцінніше, що може мати зашифрований дзвінок.
Кожен дзвінок також оновлює ключі за допомогою ML-KEM-768, постквантового алгоритму, за частку секунди після з'єднання, якщо його підтримують обидва застосунки. Це відповідь тому самому терплячому нападникові, озброєному кращим інструментом: трафік, записаний зараз і відкритий згодом квантовим комп'ютером. З повідомленнями й файлами поки що інакше. Якщо застосунок одержувача це підтримує, вони запечатуються RSA і ML-KEM-768 разом, але сьогодні ключ ML-KEM виводиться з ключа RSA, тому постквантовими ми їх поки не називаємо. А повідомлення, яке чекає на сервері, поки телефон вимкнений, не має прямої секретності: той, хто записав його, а згодом здобув ключ ідентичності одержувача, міг би його відкрити.
Що робить сервер і чого він не може
Є одне завдання, якого одноранговий застосунок не може виконати сам: розбудити телефон, на якому застосунок закрито. Для цього існує служба рандеву, і її побудовано так, щоб вона знала якомога менше, але все ж виконувала свою роботу.
- Вона ніколи не бачить вмісту. Пропозиції й офлайн-повідомлення запечатуються ключем одержувача ще до того, як залишать ваш телефон. Служба зберігає байти, яких не може відкрити.
- Вона не знає вашого імені. У її каталозі — адреса кожного пристрою, відкриті ключі й платформа, а для телефону — push-токен. Там немає імен, номерів телефону чи електронних адрес, бо застосунок їх ніколи не питає. Будь-хто, хто має адресу, може запитати, чи вона зареєстрована.
- Її сповіщення не містять ні відправника, ні вмісту. Push-сповіщення, яке будить ваш телефон, каже лише, дзвінок це чи повідомлення. На iPhone сповіщення про повідомлення має текст «New message» і «Tap to read». Apple і Google бачать, що щось було надіслано й коли, але не що саме й не хто надіслав.
- Вона швидко забуває. Запрошення до дзвінка живе 60 секунд. Запечатане офлайн-повідомлення — щонайбільше 72 години. Реєстрація пристрою спливає через 30 днів без поновлення.
- Вона бачить, хто кому телефонує, поки елемент чекає. У запрошенні до дзвінка чи офлайн-повідомленні має бути названо ключ, для якого воно, і ключ, від якого воно, тож сервер бачить обидва. Щойно елемент зникає, запису про пару не залишається: запрошення забувається через 60 секунд, а повідомлення — щонайбільше через 72 години. Приховування ще й відправника («запечатаний відправник») є в наших планах. Наші сервери розташовані за Cloudflare, який бачить ті самі дані й ніколи — вміст.
Коли дзвінок не вдається встановити напряму — зазвичай тому, що цього не дозволяють обидві мережі (так буває в деяких мобільних операторів), — зашифровані пакети пересилає ретранслятор. Телефони пробують ретранслятори Cloudflare й наші власні паралельно, спершу через UDP, потім TCP, потім TLS, і використовують той, через який удалося пробитися. Ретранслятор лише передає дані. Він не має ключа й не може його отримати. Але IP-адреси обох пристроїв він бачить. Сьогодні немає налаштування, яке спрямовувало б кожен дзвінок через ретранслятор, і під час кожного дзвінка, з ретранслятором чи без, кожен пристрій дізнається IP-адресу іншого.
Дзвінки в одній мережі Wi-Fi
Два пристрої в одній мережі Wi-Fi або під'єднані до однієї точки доступу можуть знайти один одного й провести повноцінний зашифрований дзвінок без інтернету й без сервера. Сьогодні це працює на Android — щойно на телефоні, якому телефонують, натиснули Ready to receive, на iPhone — поки на ньому відкритий Clavenzo, а на комп'ютері — коли Clavenzo запущений; iPhone може попросити дозвіл на використання локальної мережі. Повідомлення й файли можуть передаватися так само, поки застосунок відкритий на обох пристроях; ця частина нова й ще тестується.
Це не запасний режим зі слабшим захистом. Це те саме шифрування й ті самі слова безпеки, лише замість рандеву — локальне виявлення. Це корисно в літаку, у будівлі без сигналу, на об'єкті з приватною мережею і всюди, де інтернет ненадійний або небажаний.
Коли щось ламається
Clavenzo проєктували довкола складного запитання: що працюватиме, коли щось піде не так? Буря виводить із ладу дата-центр. Країна сповільнює свої з'єднання. Провайдер зникає з мережі. Вишки відмовляють, і залишається тільки локальна мережа. На кожен із цих випадків нижче є відповідь.
- Інтернету немає зовсім. Телефони в одній мережі Wi-Fi або на одній точці доступу можуть телефонувати один одному напряму — у межах, описаних вище. Жодного сервера, нічого поза кімнатою.
- Сервери невеликі, і їх кілька. Вони лише знайомлять два телефони й зберігають запечатані повідомлення. Медіа через них не проходить, якщо не потрібен ретранслятор, тож уся служба працює на кількох невеликих машинах у різних провайдерів у різних місцях.
- Жоден із них не є незамінним. Ваш телефон реєструється на кожному сервері й забирає дані з кожного. Якщо один відмовить, інші працюють далі, а на дзвінок відповідають через той сервер, який його доставив.
- Список серверів підписаний. Телефони отримують його від самих серверів і звіряють із ключем, який ніколи не потрапляє на сервер. Нові сервери можна додавати без оновлення застосунку, а старий список неможливо підсунути повторно, щоб скерувати телефони туди, куди не слід.
- Немає DNS — не біда. Список містить прямі мережеві адреси із закріпленими сертифікатами, тож телефони дістаються сервера, навіть коли сервер імен не працює чи бреше або відмовляє мережа доставки вмісту, — і без довіри до жодного центру сертифікації.
- Два ретранслятори, одна драбина. Коли дві мережі не дозволяють прямого шляху, зашифрований дзвінок передає ретранслятор — Cloudflare або наш власний — через UDP, потім TCP, потім TLS. Якщо один відмовить, ви втратите сходинку, а не дзвінок.
- Слабкі й ненадійні канали. Мові потрібно 13.2 kbit/s. Буфер джитера вимірює мережу й підлаштовується під неї, втрачені пакети маскуються, а не озиваються клацанням, а великі файли самі призупиняються й відновлюються.
- Мережі, що втручаються. Проксі SOCKS5 і HTTP CONNECT вбудовано — для мереж, які вимагають проксі або де локальний сервер імен заблоковано чи підроблено.
Повідомлення, фото, файли й голосові повідомлення
Повідомлення працюють на тому самому шифруванні. Текст, фото, файли й голосові повідомлення шифруються для одержувача, а розмова зберігається в приватному сховищі застосунку на вашому телефоні. Це сховище захищене власним шифруванням телефону й блокуванням екрана і не потрапляє до резервних копій Google та iCloud. На комп'ютері розмови зберігаються у власній теці застосунку у вашому обліковому записі користувача.
Повідомлення для людини, чий телефон вимкнений, запечатується її ключем і залишається в службі рандеву, яка зберігає його щонайбільше 72 години й не може прочитати жодного байта.
Файли понад 1 MB — свідомий виняток: вони передаються лише з телефону на телефон і ніколи через сервер. Якщо прямого шляху ще немає, передавання чекає й відновлюється саме, а не скеровує ваш великий файл тихцем через чужу машину.
Є також зникні повідомлення, окремо для кожної розмови: для надісланих відлік починається з моменту надсилання, для отриманих — відколи ви вперше їх побачили. Є звіти про прочитання, які можна вимкнути одразу в обидва боки, і стан запиту на листування, завдяки якому людина не з ваших контактів не знає, чи її повідомлення надійшло або було прочитане, доки ви її не приймете.
Що можна ввімкнути
- App lock. Запитує блокування екрана телефону (PIN-код, графічний ключ, відбиток пальця або обличчя), коли ви повертаєтеся до Clavenzo, а на Windows — Windows Hello. Дзвінки все одно дзвонять, а сповіщення перестають показувати текст повідомлень. На Linux поки що недоступно.
- Screen security. На Android блокує знімки й запис екрана застосунку та ховає його у списку нещодавніх застосунків. На iPhone, де жоден застосунок не може заблокувати знімок екрана, ховає застосунок у перемикачі застосунків. На Windows не допускає вікно до знімків екрана, записів екрана й демонстрації екрана; на Linux забезпечити це неможливо. Коди резервної копії й перенесення захищені завжди, хоч би яким було це налаштування.
- Incognito keyboard (лише Android). Просить клавіатуру не навчатися на тому, що ви вводите. Це лише прохання, і деякі клавіатури його ігнорують — тому застосунок про це й каже. iPhone не дає застосункам змоги надсилати таке прохання.
- Proxy support. SOCKS5 або HTTP CONNECT — для мереж, які вимагають проксі або де локальний сервер імен заблоковано чи він ненадійний.
- Silence calls from unsaved people. Дзвінки від незбережених людей не дзвонять, але з'являються як пропущені, і на них можна передзвонити.
Перехід на новий телефон
Два окремі експорти, свідомо розділені, бо містять різне.
Зашифрована резервна копія містить ваші розмови, фото, історію дзвінків і контакти в одному файлі, який ви зберігаєте де завгодно. Вона відкривається лише кодом, який показується один раз під час експорту й ніде не зберігається. Імпорт додає те, чого бракує, і ніколи не перезаписує того, що вже є.
Експорт ідентичності переносить ключ, який є вашою адресою. Він запечатаний власним одноразовим кодом перенесення, захищений блокуванням екрана телефону, і це єдиний спосіб, у який цей ключ узагалі залишає пристрій. Після імпорту новий телефон відповідає як ця ідентичність.
Межі цього рішення
Кожне рішення має межі. Ось наші.
- Хто з ким розмовляє. Запрошення до дзвінка чи офлайн-повідомлення називає дві адреси, між якими воно проходить, тож сервер і Cloudflare перед ним бачать цю пару, поки воно зберігається. Початкове рукостискання прямого дзвінка також передає обидва ключі ідентичності відкрито, тож той, хто стежить за цією мережею, може визначити, які дві ідентичності розмовляють. Ні те, ні те не розкриває жодного слова зі сказаного. Обидва випадки — метадані, і обидва є у списку на виправлення.
- Час і метадані. Сервер неминуче бачить, коли ваш пристрій виходить на зв'язок. Із часу надходження пакетів під час дзвінка може бути видно, коли хтось говорить, хоча ніщо зі сказаного не виходить з-під шифрування.
- Ваша IP-адреса. Під час кожного дзвінка, навіть якщо він зрештою йде через ретранслятор, застосунок співрозмовника дізнається вашу IP-адресу, бо два пристрої обмінюються мережевими адресами, шукаючи прямий шлях. З неї може бути приблизно видно, де ви перебуваєте. Ретранслятор теж бачить обидві IP-адреси.
- Слабке місце — ваш пристрій. Той, хто тримає ваш розблокований телефон, має ваші повідомлення. Шкідлива програма на телефоні читає те, що ви вводите, ще до шифрування. Це стосується кожного месенджера, який будь-коли було написано.
- Він не проходив незалежного аудиту. Його створено ретельно й ґрунтовно протестовано. Це не те саме, і ми не вдаватимемо, ніби те саме.
Якщо вам потрібен захист від того, хто може стежити за цілою мережею, усвідомте ці межі, користуйтеся підтримкою проксі й не ставте на жоден окремий інструмент, зокрема й на цей, нічого, що ви не можете дозволити собі втратити.