1. Введение

Konstruct — мессенджер со сквозным шифрованием, построенный на Signal Protocol и ориентированный на приватность. Эта политика объясняет, какие именно данные мы собираем, зачем, и чего мы не собираем. Konstruct с самого начала спроектирован так, чтобы данных о вас у нас было как можно меньше.

Основной принцип: мы собираем абсолютный минимум данных, необходимый для маршрутизации зашифрованных сообщений. Содержимое ваших сообщений зашифровано сквозным шифрованием — наши серверы не могут его прочитать, и мы не пытаемся.

2. Какие данные мы собираем

2.1 Идентификатор аккаунта

Konstruct не требует номера телефона, адреса электронной почты, пароля или настоящего имени.

Для создания аккаунта и использования 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 дней.

Что хранится в почтовом ящике (до истечения срока):

Если ваше устройство офлайн, сообщения ждут в почтовом ящике до следующего подключения. Сообщение, не забранное примерно за 7 дней, удаляется непрочитанным.

Стелс — защита отправителя (sealed sender): всегда включена для подходящего пользовательского трафика (сообщения, квитанции, сигналинг звонков и т. д.; несколько служебных путей исключены по замыслу). Ваше устройство убирает User ID отправителя из конверта и запечатывает подписанный сертификат отправителя на ключ идентичности получателя — узнать, кто написал, может только получатель, сервер не может. Вместе с запечатанными отправлениями могут идти анонимные токены Privacy Pass для защиты от спама; серверная проверка токенов ещё раскатывается. Защита отправителя не скрывает от сетевого уровня ни время отправки, ни размер, ни ваш IP-адрес.

2.4 Связи с контактами

Когда вы добавляете контакт (по QR-коду или инвайт-ссылке), сервер сохраняет запись об этой связи, чтобы определять маршрутизацию сообщений и подписку на поток. Это позволяет Konstruct сообщать вам, что знакомый контакт вышел в сеть, и подписывать вас на его поток сообщений. Запись затемнена: обе стороны хранятся как ключевой хеш (HMAC-SHA256) от идентификатора аккаунта, а не сами идентификаторы, поэтому утечка базы не даёт читаемого социального графа. Стоит сказать точно, чего это стоит: ключ принадлежит серверу, так что защита здесь от утечки, а не от нас.

2.5 Токены push-уведомлений

На iOS, чтобы доставлять уведомления о сообщениях в реальном времени, когда приложение в фоне (на Android push-сервисов нет — приложение держит собственное соединение):

2.6 Аутентификация сессии

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.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 Инфраструктура

6.2 Шифрование

6.3 Что хранится на вашем устройстве

Ваше устройство хранит полную историю сообщений локально в хранилище, защищённом операционной системой (защита данных iOS; на Android — изолированное хранилище приложения, ключи — в Android Keystore). Сюда входят:

Эти данные под вашим контролем. Удаление приложения безвозвратно стирает все локальные данные.

6.4 Сроки хранения

Тип данных Хранение
Неотправленные сообщения Удаляются по сроку хранения: предел объёма ящика и не дольше ~7 дней — а не при доставке
Медиавложения (зашифрованные) Автоудаление примерно через 7 дней после загрузки (по возрасту объекта, независимо от скачивания)
Одноразовые предключи Удаляются с сервера при использовании
Токены сессий Токен доступа — 24 часа, токен обновления — 90 дней; отзываются при выходе или удалении аккаунта
Токен APNs Хранится до удаления аккаунта или обновления токена
Токен PushKit VoIP Хранится до удаления аккаунта или обновления токена
Хеш имени пользователя и User ID Хранятся до удаления аккаунта
Signed PreKey Заменяется при ротации, старый ключ удаляется
Связи с контактами Сейчас не удаляются ни при удалении контакта, ни при удалении аккаунта (обезличенные записи, см. 8.3)

7. Передача данных и третьи стороны

Мы не продаём и не сдаём в аренду ваши данные и не передаём их для рекламы, профилирования или любых целей, не связанных с работой сервиса. Для самой работы нужны поставщики, перечисленные ниже; каждый получает минимум, необходимый для своей задачи, и ни один не получает содержимое сообщений.

7.1 Поставщики инфраструктуры

7.2 Соблюдение законодательства

Мы можем быть обязаны раскрыть данные по действительному законному предписанию компетентного органа. Однако:

8. Ваши права

8.1 Анонимное использование

Вы можете пользоваться Konstruct, не сообщая никакой информации, позволяющей вас идентифицировать. Ваш User ID — случайный UUID, который выдаёт сервер; в нём не закодировано ничего о вас.

8.2 Доступ к вашим данным

Вы можете в любой момент запросить копию любых метаданных, связанных с вашим аккаунтом, написав нам по адресу ниже.

8.3 Удаление аккаунта

Вы можете удалить аккаунт из настроек приложения. При удалении:

Сообщения, ранее доставленные получателям, хранятся только локально на их устройствах и после доставки находятся вне нашего контроля.

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. Контакты

По вопросам приватности, запросам доступа к данным и любым сомнениям:

Кратко

Не требуется ни номер телефона, ни почта Сквозное шифрование (Signal Protocol)
Полностью анонимное использование поддерживается Сообщения хранятся только зашифрованными и удаляются по сроку (до ~7 дней)
Ни трекинга, ни аналитических SDK Обфускация трафика встроена
Приватные ключи никогда не покидают устройство Только минимальные метаданные
Никаких продаж данных третьим сторонам Юрисдикция GDPR (ЕС: сервер в Нидерландах, копии в Германии)