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 невелико, и сторона, владеющая секретной солью, всё ещё может проверять кандидатов. Он убирает сырой адрес из всего, что мы храним; это не гарантия, что сетевое происхождение соединения никогда не будет определено нашей инфраструктурой.
Если вы хотите вовсе убрать свой сетевой адрес с пути, включите защиту от блокировок в настройках или используйте VPN либо Tor — хотя точка, которая терминирует ваше соединение, всё равно видит его видимый адрес источника.
3. Защита от анализа трафика
Konstruct применяет дополнение и, на iOS, случайный джиттер времени отправки, чтобы сетевому наблюдателю — и нашему серверу — было сложнее понять, что вы отправляете, по размеру или точному времени. Сообщения дополняются до порций фиксированного размера. Вложения (фото, видео, голосовые, файлы, фото профиля) дополняются до размерных классов: сервер хранит диапазон размера, а не точный размер файла — файл увеличивается не больше чем на 12 %, обычно примерно на 3 % (самые маленькие файлы дополняются до 4 КБ), — и не получает тип файла. Эти меры включены по умолчанию и не требуют настройки.
Мы намеренно не шлём запланированный фиктивный трафик прикрытия. Постоянное прикрытие требует всегда открытого соединения и отправок по расписанию, что разряжает батарею и тратит трафик, мобильный клиент такого не выдержит, и навязывать это значило бы разменять реальное удобство на слабое усиление метаданных. Дополнение и джиттер (выше) — наш мобильный ответ; постоянное прикрытие возможно только на всегда включённом десктопном клиенте и остаётся вариантом исключительно для десктопа, но не обещанием на мобильных. Мы лучше не станем поставлять прикрытие вовсе, чем заявлять то, что не работает.
Отдельно, защита от блокировок — это слой обфускации на сетевом уровне, который помогает вашему соединению сливаться с обычным 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 Удаление аккаунта
Вы можете удалить аккаунт из настроек приложения. При удалении:
- Хеш имени пользователя, ваш 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 (ЕС: сервер в Нидерландах, копии в Германии) |