1. Вступ
Konstruct — месенджер з наскрізним шифруванням, побудований на Signal Protocol і зорієнтований на приватність. Ця політика пояснює, які саме дані ми збираємо, навіщо, і чого ми не збираємо. Konstruct із самого початку спроєктовано так, щоб даних про вас у нас було якомога менше.
Основний принцип: ми збираємо абсолютний мінімум даних, потрібний для маршрутизації зашифрованих повідомлень. Вміст ваших повідомлень зашифровано наскрізним шифруванням — наші сервери не можуть його прочитати, і ми не намагаємося.
2. Які дані ми збираємо
2.1 Ідентифікатор облікового запису
Konstruct не вимагає номера телефону, адреси електронної пошти, пароля чи справжнього імені.
- User ID: випадковий UUID, який сервер генерує під час створення облікового запису. Він не виводиться ні з ваших ключів, ні з чогось іншого про вас, і видобути з нього щось про вас неможливо.
- Device ID: 32-символьний хеш публічного Identity Key вашого пристрою. На відміну від User ID, він детермінований — той, хто вже має цей публічний ключ, може його обчислити, — тому він слугує для зв’язування ваших власних пристроїв і для посилань-запрошень, а не ідентифікатором облікового запису.
- Ім’я користувача (необов’язково): публічний псевдонім, за яким вас можуть знайти, якщо ви ввімкнете виявлення. Сервер зберігає лише ключований хеш імені, а не саме ім’я. Його можна змінити або видалити будь-коли.
Для створення облікового запису та використання Konstruct не потрібна жодна інформація, що дозволяє вас ідентифікувати.
2.2 Набір криптографічних ключів
Щоб працював обмін ключами Signal Protocol, ваш пристрій генерує й завантажує на сервер такі публічні ключі. Відповідні приватні ключі ніколи не залишають пристрій і зберігаються в захищеному сховищі ключів платформи (iOS Keychain, Android Keystore).
| Ключ | Тип | Зберігається на сервері | Призначення |
|---|---|---|---|
| Identity Public Key | X25519 (довгостроковий) | Так, постійно | Автентифікує ваш пристрій; використовується в хендшейку X3DH |
| Signed PreKey | X25519 (середньостроковий) | Так, періодично ротується | Використовується в узгодженні ключів X3DH |
| Одноразові передключі (OTPK) | X25519 (ефемерний) | Так, до використання | Витрачаються по одному на сесію заради досконалої прямої секретності |
| Приватні ключі | — | Ніколи | Усі приватні ключі залишаються лише на вашому пристрої |
Сервер відстежує, скільки одноразових передключів лишилося, і просить пристрій поповнити запас, коли їх стає мало. Після того як OTPK використано для встановлення сесії, його безповоротно видаляють з сервера.
2.3 Черга невідправлених повідомлень
Коли ви надсилаєте повідомлення, воно шифрується на вашому пристрої до передавання. Сервер тримає зашифроване повідомлення в поштовій скриньці отримувача. Він не видаляє повідомлення через те, що пристрій повідомив про отримання: скриньки чистяться лише за строком зберігання — у кожної є межа обсягу, і все старше приблизно 7 днів видаляється. Тому вже доставлене повідомлення може лишатися на нашому сервері — зашифрованим і нечитним для нас — до приблизно 7 днів.
Що зберігається в поштовій скриньці (до спливу строку):
- Зашифроване тіло повідомлення (непрозорий двійковий блоб — ми не можемо його прочитати)
- User ID відправника опускається на шляху захисту відправника (завжди ввімкнений для відповідного трафіку — див. «Стелс» нижче); замість нього їде запечатаний сертифікат, який може розкрити лише отримувач
- User ID отримувача
- ID повідомлення (UUID)
- Часова позначка
- Порядковий номер повідомлення (потрібен алгоритму Double Ratchet)
- Ефемерний публічний ключ (частина кроку ретчета Signal Protocol — не секрет)
Якщо ваш пристрій офлайн, повідомлення чекають у поштовій скриньці до наступного підключення. Повідомлення, не забране приблизно за 7 днів, видаляється непрочитаним.
Стелс — захист відправника (sealed sender): завжди ввімкнений для відповідного користувацького трафіку (повідомлення, квитанції, сигналінг дзвінків тощо; кілька службових шляхів виключено за задумом). Ваш пристрій прибирає User ID відправника з конверта й запечатує підписаний сертифікат відправника на ключ ідентичності отримувача — дізнатися, хто написав, може лише отримувач, сервер не може. Разом із запечатаними відправленнями можуть іти анонімні токени Privacy Pass для захисту від спаму; серверна перевірка токенів ще розгортається. Захист відправника не приховує від мережевого рівня ні час надсилання, ні розмір, ні вашу IP-адресу.
2.4 Зв’язки з контактами
Коли ви додаєте контакт (за QR-кодом або посиланням-запрошенням), сервер зберігає запис про цей зв’язок, щоб визначати маршрутизацію повідомлень і підписку на потік. Це дає змогу Konstruct повідомляти вам, що знайомий контакт з’явився в мережі, і підписувати вас на потік його повідомлень. Запис затемнено: обидві сторони зберігаються як ключований хеш (HMAC-SHA256) від ідентифікатора облікового запису, а не самі ідентифікатори, тому витік бази не дає читабельного соціального графа. Варто сказати точно, чого це вартує: ключ належить серверу, тож захист тут від витоку, а не від нас.
2.5 Токени push-сповіщень
На iOS, щоб доставляти сповіщення про повідомлення в реальному часі, коли застосунок у фоні (на Android push-сервісів немає — застосунок тримає власне з’єднання):
- Токен пристрою Apple APNs: зберігається на сервері й використовується виключно для надсилання сигналу-пробудження «нове повідомлення».
- Токен Apple PushKit VoIP: зберігається окремо й використовується виключно для пробудження застосунку під час вхідного запрошення на аудіодзвінок. Як і токен APNs, він не містить ні вмісту повідомлення, ні вмісту дзвінка.
- Вміст повідомлень ніколи не потрапляє в push-сповіщення. Сповіщення містить лише загальний сигнал, за яким ваш пристрій підключається й забирає зашифроване повідомлення, а у випадку дзвінка — показує вхідний виклик.
2.6 Автентифікація сесії
- Токени сесії: токен доступу (діє 24 години) і токен оновлення (90 днів) автентифікують ваше з’єднання; обидва відкликаються під час виходу з облікового запису або його видалення.
2.7 Аудіо- та відеодзвінки
Аудіо- та відеодзвінки захищені наскрізним шифруванням. Встановлення дзвінка — опис сесії WebRTC (SDP) і кандидати зв’язності ICE — передається тим самим наскрізно зашифрованим шляхом, що й листування, тому наші сервери не можуть його прочитати. Звук і відео дзвінка використовують DTLS-SRTP із WebRTC; оскільки ключі шифрування медіа обмінюються й автентифікуються всередині цього наскрізно зашифрованого сигналінгу, медіа зашифровано наскрізно між двома пристроями — ні наші сервери, ні ретранслятори, якими ми користуємося, не можуть його розшифрувати. Наш сервер знає, чи починається дзвінок як аудіо- чи як відеодзвінок, — щоб телефон отримувача показав дзвінок потрібного виду; увімкнення й вимкнення камери під час дзвінка йому не передається. Ретранслятор може відрізнити відео від голосу за обсягом зашифрованого трафіку, який пересилає.
Щоб з’єднати дзвінок, пристрої обмінюються кандидатними мережевими адресами (стандартний ICE з WebRTC) у пошуках прямого шляху. Коли пряме з’єднання неможливе, зашифроване медіа ретранслюється через TURN-сервер: ретранслятор пересилає лише зашифроване медіа, яке не може прочитати, але бачить мережеві адреси учасників. Ці метадані з’єднання потрібні для маршрутизації дзвінка й не пов’язуються з вмістом повідомлень. На iOS вхідні дзвінки будять застосунок через токен PushKit VoIP із розділу 2.5; сам push не містить вмісту дзвінка. На Android дзвінок надходить власним з’єднанням застосунку, без push. TURN-сервер працює в Нідерландах.
2.8 Медіавкладення
Коли ви надсилаєте фото, відео, файл або голосове повідомлення, вкладення стискається й шифрується на вашому пристрої (AES-256-GCM на свіжому ключі для кожного файлу) до завантаження. Ключ розшифрування їде лише всередині наскрізно зашифрованого повідомлення отримувачу — він ніколи не передається медіасерверу й не зберігається в нього. Сервер зберігає лише непрозорий зашифрований блоб із випадковим media ID і не може прочитати його вміст.
Зашифровані медіаоб’єкти автоматично видаляються приблизно через 7 днів після завантаження (незалежно від того, завантажили їх чи ні); пристрій отримувача забирає й розшифровує їх у цьому вікні. Ми не зберігаємо медіа у відкритому вигляді; про кожен об’єкт сервер знає лише сам зашифрований блоб, його ідентифікатор, клас розміру після доповнення, хеш шифротексту та час завантаження і видалення.
2.9 Чого ми НЕ збираємо
Наведене нижче явно не збирається й не зберігається:
- Номер телефону
- Адреса електронної пошти
- Пароль
- Справжнє ім’я
- Вміст повідомлень (наскрізне шифрування — ми не маємо до нього доступу)
- Історія повідомлень (є лише зашифрована поштова скринька з розділу 2.3, прочитати її ми не можемо)
- Дані про місцеперебування
- Індикатори набору тексту та позначки про прочитання понад підтвердження доставки
- Стороння аналітика й трекінгові SDK
2.10 IP-адреси та метадані з’єднання
Підключення до будь-якого онлайн-сервісу відкриває вашу IP-адресу його серверам на мережевому рівні — це неминуче, і Konstruct не виняток. Проте ми не записуємо вашу сиру IP-адресу до наших баз даних. Для обмежень під час реєстрації пристроїв і завдань proof-of-work ми використовуємо лише односторонній хеш із сіллю від адреси. Щоб обмежувати частоту надсилання повідомлень і запитів ключів, сервер ненадовго тримає саму адресу (для IPv6 — її мережу /64) у лічильнику в оперативній пам’яті, який спливає приблизно за хвилину. Відповідності «IP — обліковий запис» ми не зберігаємо.
Ми не використовуємо вашу адресу та її хеш-мітку, щоб будувати поведінкові профілі, пов’язувати їх із вмістом ваших повідомлень чи передавати для реклами. Але хеш із сіллю знижує розкриття, а не анонімізує досконало — простір адрес IPv4 невеликий, і сторона, що володіє секретною сіллю, все ще може перевіряти кандидатів. Він прибирає сиру адресу з усього, що ми зберігаємо; це не гарантія, що мережеве походження з’єднання ніколи не буде визначене нашою інфраструктурою.
Якщо ви хочете взагалі прибрати свою мережеву адресу зі шляху, увімкніть захист від блокувань у налаштуваннях (Censorship protection) або скористайтеся VPN чи Tor — хоча точка, що термінує ваше з’єднання, усе одно бачить його видиму адресу джерела.
3. Захист від аналізу трафіку
Konstruct застосовує доповнення і, на iOS, випадковий джитер часу надсилання, щоб мережевому спостерігачеві — і нашому серверу — було складніше зрозуміти, що ви надсилаєте, за розміром або точним часом. Повідомлення доповнюються до порцій фіксованого розміру. Вкладення (фото, відео, голосові, файли, фото профілю) доповнюються до класів розміру: сервер зберігає діапазон розміру, а не точний розмір файлу — файл збільшується не більше ніж на 12 %, зазвичай приблизно на 3 % (найменші файли доповнюються до 4 КБ), — і не отримує тип файлу. Ці заходи ввімкнені за замовчуванням і не потребують налаштування.
Ми навмисно не шлемо запланований фіктивний трафік прикриття. Постійне прикриття потребує завжди відкритого з’єднання та надсилань за розкладом, що розряджає батарею й витрачає трафік, мобільний клієнт такого не витримає, а нав’язувати це означало б проміняти реальну зручність на слабке посилення захисту метаданих. Доповнення та джитер (вище) — наша мобільна відповідь; постійне прикриття можливе лише на завжди ввімкненому десктопному клієнті й лишається варіантом виключно для десктопа, але не обіцянкою на мобільних. Ми краще не постачатимемо прикриття взагалі, ніж заявлятимемо те, що не працює.
Окремо, захист від блокувань (Censorship protection) — це шар обфускації на мережевому рівні, який допомагає вашому з’єднанню зливатися зі звичайним HTTPS-трафіком, коли прямий TLS блокують. Це механізм обходу цензури, а не приховування метаданих: сам по собі він не заважає спостерігачеві, який уже бачить ваше з’єднання, виводити час і розмір повідомлень.
4. Захист від спаму: Proof of Work
Щоб запобігати спаму без номера телефону чи пошти, Konstruct вимагає від вашого пристрою виконати невеликі обчислення Proof of Work під час реєстрації, а також під час надсилання, якщо перевищено ліміт частоти. Це обчислення на стороні клієнта: для чесного використання його ціна нехтовно мала, а масовий спам стає обчислювально дорогим. Жодні персональні дані при цьому не задіяні.
5. Як ми використовуємо ваші дані
| Дані | Призначення |
|---|---|
| User ID | Автентифікація вашого пристрою та маршрутизація повідомлень |
| Набір публічних ключів | Уможливлення обміну ключами наскрізного шифрування Signal Protocol |
| Черга невідправлених повідомлень | Зберігання зашифрованих повідомлень до доставки |
| Зв’язки з контактами | Маршрутизація повідомлень і підписки на потоки |
| Токен APNs | Доставка фонових push-сповіщень |
| Токен PushKit VoIP | Пробудження застосунку під час вхідних запрошень на дзвінок |
| Токен сесії | Автентифікація gRPC-з’єднання |
Ми не використовуємо зібрані дані для реклами, профілювання, аналітики чи будь-яких цілей поза роботою сервісу обміну повідомленнями.
6. Зберігання даних і безпека
6.1 Інфраструктура
- Хостинг: VPS у DigitalOcean (Нідерланди)
- Постійне сховище: база даних PostgreSQL (дані облікового запису, набори ключів, зв’язки з контактами)
- Ефемерне сховище: Redis (токени сесій, черги невідправлених повідомлень)
- Юрисдикція: Нідерланди / Європейський союз — застосовується GDPR
6.2 Шифрування
- Під час передавання: обмін повідомленнями між клієнтом і сервером іде двонапрямним gRPC-потоком поверх QUIC на iOS, коли він доступний, з автоматичним відкатом на gRPC поверх HTTP/2 + TLS (Android використовує HTTP/2 + TLS; межа — Caddy на порту 443, TLS 1.2 або 1.3). Службові RPC і автентифікація використовують той самий зашифрований транспортний стек
- Під час зберігання: вміст повідомлень і медіа зберігається лише зашифрованим ключами, що є на пристроях; резервні копії бази шифруються перед відправленням у сховище копій (розділ 7.1)
- Наскрізне: на основі Signal Protocol — узгодження ключів X3DH / PQXDH (X25519 у зв’язці з постквантовим ML-KEM-1024) і Double Ratchet з AEAD ChaCha20-Poly1305. Передключі пристрою підписано двічі — Ed25519 і гібридним підписом Ed25519 + ML-DSA-65 (постквантовим), і сесія без обох підписів не встановлюється; сам гібридний ключ поки засвідчується підписом Ed25519. Медіавкладення шифруються AES-256-GCM на окремому ключі для кожного файлу.
6.3 Що зберігається на вашому пристрої
Ваш пристрій зберігає повну історію повідомлень локально в сховищі, захищеному операційною системою (захист даних iOS; на Android — ізольоване сховище застосунку, ключі — в Android Keystore). Сюди входять:
- Повна історія листування
- Медіавкладення
- Список контактів і імена, що відображаються
- Стан криптографічних сесій (Keychain / Keystore)
- Чернетки повідомлень
Ці дані під вашим контролем. Видалення застосунку безповоротно стирає всі локальні дані.
6.4 Строки зберігання
| Тип даних | Зберігання |
|---|---|
| Невідправлені повідомлення | Видаляються за строком зберігання: ліміт обсягу скриньки та не довше ~7 днів — а не під час доставки |
| Медіавкладення (зашифровані) | Автовидалення приблизно через 7 днів після завантаження (за віком об’єкта, незалежно від завантаження отримувачем) |
| Одноразові передключі | Видаляються із сервера після використання |
| Токени сесій | Токен доступу — 24 години, токен оновлення — 90 днів; відкликаються під час виходу або видалення облікового запису |
| Токен APNs | Зберігається до видалення облікового запису або оновлення токена |
| Токен PushKit VoIP | Зберігається до видалення облікового запису або оновлення токена |
| Хеш імені користувача та User ID | Зберігаються до видалення облікового запису |
| Signed PreKey | Замінюється під час ротації, старий ключ видаляється |
| Зв’язки з контактами | Наразі не видаляються ні під час видалення контакту, ні під час видалення облікового запису (знеособлені записи, див. 8.3) |
7. Передавання даних і треті сторони
Ми не продаємо й не здаємо в оренду ваші дані та не передаємо їх для реклами, профілювання чи будь-яких цілей, не пов’язаних із роботою сервісу. Для самої роботи потрібні постачальники, перелічені нижче; кожен отримує мінімум, необхідний для свого завдання, і жоден не отримує вмісту повідомлень.
7.1 Постачальники інфраструктури
- DigitalOcean (Нідерланди): надає сервер. Не має доступу до даних застосунку та ключів шифрування.
- Hetzner Storage Box (Німеччина): зберігає резервні копії бази даних і черг — 7 щоденних і 4 щотижневі. Копії шифруються до відправлення, у Hetzner немає ключа. У них є зашифровані повідомлення з поштових скриньок, знеособлені зв’язки контактів і хеші імен користувачів; медіа не копіюється.
- TURN-сервер (Нідерланди) і сервери обходу блокувань: пересилають лише зашифрований трафік, який не можуть прочитати, і бачать мережеві адреси підключень. Де працюють сервери обходу, ми не публікуємо.
- Apple APNs: отримує лише push-токен вашого пристрою та загальний сигнал сповіщення (без вмісту повідомлень). Підпадає під політику конфіденційності Apple.
7.2 Дотримання законодавства
Ми можемо бути зобов’язані розкрити дані за дійсним законним приписом компетентного органу. Проте:
- Ми не можемо розшифрувати ваші повідомлення (наскрізне шифрування)
- Ми зберігаємо мінімум метаданих — ні вмісту повідомлень, ні сирих IP-адрес у базах даних (короткочасний лічильник обмежень описано в розділі 2.10), ні поведінкового профілювання
- Ми повідомимо постраждалих користувачів, якщо це не заборонено законом
8. Ваші права
8.1 Анонімне використання
Ви можете користуватися Konstruct, не повідомляючи жодної інформації, що дозволяє вас ідентифікувати. Ваш User ID — випадковий UUID, який видає сервер; у ньому не закодовано нічого про вас.
8.2 Доступ до ваших даних
Ви можете будь-коли запросити копію будь-яких метаданих, пов’язаних із вашим обліковим записом, написавши нам за адресою нижче.
8.3 Видалення облікового запису
Ви можете видалити обліковий запис у налаштуваннях застосунку (Settings). Під час видалення:
- Хеш імені користувача, ваш User ID і набір публічних ключів видаляються із сервера. Ідентифікатор пристрою та хеш-зобов’язання залишаються в журналі прозорості ключів: він лише доповнюється, і видалити з нього запис не можна
- Знеособлені записи про зв’язки з контактами наразі не видаляються
- Ваші токени APNs і PushKit VoIP видаляються
- Повідомлення у вашій поштовій скриньці видаляються за звичайним строком зберігання (до ~7 днів), а з резервних копій — з їх зміною (до ~4 тижнів)
- Видалення завершується протягом 24 годин
Повідомлення, раніше доставлені отримувачам, зберігаються лише локально на їхніх пристроях і після доставки перебувають поза нашим контролем.
8.4 Ім’я користувача
Ви можете додати, змінити або видалити ім’я користувача будь-коли в налаштуваннях облікового запису.
9. Мінімальний вік
Konstruct призначений для користувачів віком від 16 років, що відповідає віковому рейтингу 16+ в App Store. Він не адресований і не призначений особам молодше 16 років, і ми свідомо не збираємо дані про таких осіб. Оскільки Konstruct зберігає лише мінімальні маршрутні метадані, описані вище, і не зберігає вмісту повідомлень, дані, пов’язані з будь-яким обліковим записом, обмежені самим задумом. Якщо ви вважаєте, що Konstruct користується хтось молодший за 16 років, зв’яжіться з нами (розділ 12), і ми вживемо заходів.
10. Хто відповідає за ваші дані
Konstruct — незалежний проєкт, а не компанія. Контролер даних за GDPR — Максим Єлісеєв, супровідник проєкту; адресу вказано в розділі 12. Konstruct недостатньо великий, щоб вимагати Data Protection Officer, і такого не призначено: запити за розділом 8 надходять на ту саму адресу, і відповідає на них та сама особа. Якщо це зміниться — з’явиться юридична особа або відповідальність перейде до когось іншого, — зміниться й цей розділ, а про зміну ми повідомимо так, як описано в розділі 11.
11. Зміни до цієї політики
Ми повідомимо користувачів про суттєві зміни через:
- Сповіщення в застосунку
- Оновлену дату «Останнє оновлення» в цьому документі
Продовження використання Konstruct після змін означає прийняття оновленої політики.
12. Контакти
З питань приватності, запитів на доступ до даних та будь-яких сумнівів:
- Email: maxim.elis@icloud.com
- Сайт: konstruct.cc
Коротко
| Не потрібні ні номер телефону, ні пошта | Наскрізне шифрування (Signal Protocol) |
| Повністю анонімне використання підтримується | Повідомлення зберігаються лише зашифрованими й видаляються за строком (до ~7 днів) |
| Ні трекінгу, ні аналітичних SDK | Обфускація трафіку вбудована |
| Приватні ключі ніколи не залишають пристрій | Лише мінімальні метадані |
| Жодного продажу даних третім сторонам | Юрисдикція GDPR (ЄС: сервер у Нідерландах, копії в Німеччині) |