Как устроен Vibn
Обновлено: 2026-08-28
Это техническое описание того, как Vibn обращается с вашими фото, видео, сообщениями и вашей учётной записью — написанное для тех, кто хочет проверить утверждения, а не принимать их на веру.
Оно намеренно длиннее и подробнее нашей Политики конфиденциальности. Политика говорит, что мы делаем с вашими данными; этот документ говорит, как устроена система, чтобы мы не могли поступить иначе. Там, где защита обеспечена архитектурой, а не обещанием, мы так и пишем. Там, где это только обещание, мы пишем и это.
1. Коротко
Vibn — это приватный общий альбом. Вы создаёте группу, приглашаете несколько человек, и фотографии и видео всех участников с одного события собираются в одном месте. Здесь нет ленты, в которой вас ранжируют, нет публичного профиля и нет способа для постороннего найти вашу группу.
- Группы — только по приглашению. Нет поиска, нет обзора, нет просмотра — единственный вход это ссылка, код или QR от того, кто уже внутри.
- Фото и видео в зашифрованных группах защищены сквозным шифрованием. Они шифруются на вашем телефоне до загрузки и расшифровываются на телефонах получателей. Наши серверы хранят шифртекст, который не могут прочитать.
- Ключ, расшифровывающий группу, никогда не попадает на наши серверы в пригодном для нас виде. Он передаётся в той части ссылки-приглашения, которую браузеры никогда не отправляют, а если вы храните резервную копию для восстановления, то копия у нас запечатана фразой, которую мы никогда не получаем.
- Распознавание лиц работает на вашем устройстве. Загружаются только анонимные числовые векторы — никогда ваши фотографии из настройки и никогда обратно другому пользователю.
- Медиафайлы никогда не доступны публично по адресу. Каждый просмотр — это короткоживущая подписанная ссылка, создаваемая на каждый запрос.
- Вы можете удалить свои данные о лице, свои медиафайлы, свои группы и весь аккаунт — и удаление настоящее.
2. Приватность по приглашению, проверяемая на сервере
Каждый запрос к данным группы сверяется с вашим участием до того, как что-либо будет возвращено. Если вы не участник, API отвечает «не найдено», а не «нет доступа» — так посторонний не может даже подтвердить, что такая группа существует, и тем более узнать, кто в ней.
Эта проверка живёт в одном месте, в API, а не разбросана по коду приложения. Приложение не может выдать себе доступ, спросив иначе, потому что решает не оно.
Есть одно намеренное исключение: любой вошедший пользователь с кодом приглашения может прочитать небольшой предпросмотр этого приглашения — название группы, описание и кто приглашает — до вступления. Иначе пришлось бы принимать приглашение вслепую. Приглашения истекают через семь дней.
С 2026 года рядом с проверкой членства действует вторая проверка, и только в одну сторону: она может не выдать данные, но никогда не даёт доступ. Если вы есть на фото, опубликованном другим человеком, вы можете скрыть его от группы: с этого момента API отдаёт его только тем, кто уже определён на нём, и тому, кто его опубликовал. Ничего не удаляется, копии, уже сохранённые на чьих-то устройствах, недоступны для отзыва, а автор публикации получает уведомление и может попросить вернуть фото.
- Роли в группе: владелец, менеджер и участник. Менеджеры могут модерировать и редактировать; только владелец может удалить группу или назначить менеджеров.
- Владелец не может тихо выйти из своей группы — он удаляет её или передаёт. Это исключает бесхозную группу, за хранилище которой никто не отвечает.
- Удаление участника прекращает доступ с этого момента. Оно не отменяет то, что он уже видел, и мы не делаем вид, будто отменяет.
3. Сквозное шифрование: чего наши серверы не могут
Группы, созданные после внедрения сквозного шифрования, зашифрованы. У каждой один 256-битный ключ, созданный на устройстве создателя. Медиафайлы шифруются алгоритмом AES-256-GCM на телефоне до загрузки и расшифровываются на телефоне при просмотре. Мы храним непрозрачный блок.
Важно не то, что мы обещаем не смотреть. Важно, что целый ряд функций, которые предлагают другие приложения, для нас невозможен, и мы согласились их потерять:
- Мы не можем создавать миниатюры или предпросмотры ваших зашифрованных медиафайлов на сервере, потому что не можем их декодировать.
- Мы не можем перекодировать или сжать их, чтобы сэкономить место.
- Мы не можем создать размытую заглушку, используемую до дня раскрытия — поэтому в зашифрованных группах это делает приложение на вашем устройстве.
- Мы не можем создать публичную ссылку для зашифрованной группы. Эта функция для таких групп выключена, а не просто не рекомендуется.
- Мы не можем проверять содержимое зашифрованных медиафайлов — ни мы, ни кто-либо ещё. Определение чувствительного контента работает на вашем устройстве или не работает вовсе.
- Есть ровно один способ, которым настоящее содержимое фотографии попадает к нам, и отправляете его вы: когда вы жалуетесь на материал, ваше устройство загружает расшифрованную копию именно этого одного файла — предупредив вас об этом заранее. Иначе получить её мы не можем, и она удаляется через 90 дней после закрытия жалобы.
4. Как передаётся ключ
Ключ группы передаётся внутри ссылки-приглашения, после символа # : https://vibn.space/i/КОД#k=… — всё после # это фрагмент URL, а браузеры никогда не отправляют фрагменты на сервер. QR-код содержит ту же ссылку. Тот, кто её откроет, извлекает ключ в приложении и сохраняет его в защищённом аппаратном хранилище устройства: Keychain на iOS, Keystore на Android.
У этого есть следствие, о котором мы предпочитаем сказать прямо, а не спрятать. Кто получил полную ссылку-приглашение, тот получил ключ группы. Относитесь к ссылке как к ключу от дома: это не заявка на вход, которую вы одобряете, это то, что открывает дверь. Передавайте её по каналу, которому доверяете.
Есть и второе следствие, и резервная копия ключей меняет его форму, а не отменяет его. Когда устройство впервые получает ключ группы, Vibn предлагает вам фразу восстановления из десяти слов. Ваш телефон выводит из этих слов ключ и отправляет ваши ключи групп запечатанными им; мы храним этот запечатанный пакет и открытую соль, использованную для вывода ключа. Мы никогда не получаем фразу — её нет ни в запросе, ни в письме, ни в меню «Поделиться», — поэтому пакет для нас так же неоткрываем, как и сами медиафайлы. Вы можете сделать снимок экрана с этими словами, если так удобнее, чем на бумаге; снимок обычно синхронизируется с облачным фотосервисом, а значит, он настолько же приватен, насколько приватен тот аккаунт. Ввод фразы на новом устройстве возвращает ваши ключи, а на iOS выведенный ключ хранится в связке ключей iCloud, так что в большинстве случаев вводить ничего не нужно. Вы по-прежнему можете перенести ключи, отсканировав код с устройства, где они ещё есть, или восстановить группу, вставив её ссылку-приглашение. Но резервную копию можно пропустить или удалить, и тогда, если исчезли все устройства и не осталось ни одной ссылки, медиафайлы останутся зашифрованными навсегда. Это честная цена гарантии из раздела 3.
- Ключ группы никогда не находится в теле запроса, никогда не входит в сам код приглашения и никогда не попадает в журнал в пригодном для использования виде. Единственная копия, которая доходит до нас, — резервный пакет, запечатанный вашей фразой.
- Текущее ограничение: нет смены ключа при уходе участника и нет отзыва для отдельного человека. Бывший участник, сохранивший ссылку, сохраняет и ключ.
- Ключ группы виден только для чтения в её настройках, так что при желании вы можете сделать резервную копию осознанно.
5. Где на самом деле лежат ваши медиафайлы
Файлы хранятся в приватном объектном хранилище, нечитаемом без подписи. В нашей базе данных лежит только путь к объекту — не URL. Ранняя миграция намеренно удалила колонки с сохранёнными URL, поэтому утёкшая строка базы не содержит ничего, что можно скачать.
Каждый раз, когда вы открываете фотографию, API создаёт короткоживущую подписанную ссылку для этого одного объекта, для этого одного запроса, предварительно проверив ваше участие. Ссылка истекает. Загрузка работает так же в обратную сторону, причём тип файла фиксируется в момент авторизации загрузки.
- Нет публичного бакета, нет угадываемого пути и нет постоянного URL, который мог бы утечь.
- Единственная неаутентифицированная поверхность во всей системе — публичная общая галерея, которую участник может создать для незашифрованной группы. Это токен-возможность внутри ссылки, его можно отключить, и его нельзя создать для зашифрованной группы.
- Если вы отключите повторный обмен в настройках, ваши загрузки исчезнут из любой публичной галереи, созданной другим участником — в ваших собственных они остаются.
6. День раскрытия
Группу можно настроить так, чтобы она раскрылась в выбранную дату, и никто не увидел фотографии раньше остальных. До этого момента сервер не просто просит приложение что-то спрятать. Тем, кто ничего не загружал, он отдаёт другой файл — маленькую размытую производную — и никогда не создаёт подписанную ссылку на оригинал. Ключа к полноразмерному файлу в ответе попросту нет.
Свои собственные загрузки вы видите всегда. Уведомления о фотографиях, где есть вы, придерживаются до раскрытия и затем приходят одной сводкой, чтобы push-уведомление не выдало то, что скрывает экран.
Есть один способ увидеть эти фотографии раньше срока, и он предусмотрен намеренно. Владелец группы может запустить трансляцию: ссылку, действующую не более суток и отзываемую в любой момент, которая показывает фотографии группы в браузере по мере их появления — на празднике, на экране в зале. Пока она идёт, любой обладатель ссылки видит полные фотографии, а не размытые заглушки: ради этого она и нужна. Ограничивают это две вещи. Ссылка заканчивается сама, и владелец может остановить её раньше. И в ссылке нет ключа группы: ключ приходит в браузер в зашифрованном виде и раскрывается только там и только пока идёт трансляция — так что её остановка не просто гасит страницу, а забирает ключ с собой.
7. Распознавание лиц и почему здесь оно необычное
Vibn может найти фотографии, на которых есть вы. Почти любая реализация этой функции отправляет лица на сервер. Наша — нет, и не смогла бы: медиафайлы зашифрованы, серверному сопоставителю было бы не на что смотреть.
Вместо этого и обнаружение, и превращение лица в числовой вектор происходят на вашем телефоне. Загружается только вектор из 512 чисел. Это не изображение, и обратно в изображение он не превращается.
Сопоставление затем происходит на сервере, вектор с вектором. Возвращаются только идентификаторы найденных пользователей — никогда чей-либо вектор.
- Фотографии, которые вы делаете при настройке распознавания, никогда не покидают устройство.
- Ни одна точка доступа не возвращает сохранённый вектор лица никакому клиенту, включая ваш.
- Вы можете отключить обнаруживаемость, и ваш идентификатор будет убран из результатов совпадений, показываемых всем остальным — свои вы по-прежнему видите.
- Вы можете в любой момент удалить все свои данные о лице в настройках. Это удаляет векторы и отметку о настройке, а не просто флаг.
- Функция включается по желанию и доступна и на бесплатном, и на платном тарифе. Мы не прячем вашу приватность за платной стеной.
- Вы можете скрыть от остальной группы фото, на котором вы есть, но не можете его удалить. Оно остаётся видимым для тех, кто на нём есть, и для автора публикации, которого уведомляют и который может попросить вернуть фото.
8. Вход, оплата и то, что мы намеренно не делаем сами
Вход выполняет Firebase Authentication — почта, Google или Apple. Мы никогда не видим и не храним пароль; в нашей базе просто нет поля пароля, которое могло бы утечь.
Подписки проверяет наш собственный сервер напрямую у Apple и Google. Нет стороннего биллингового посредника, который хранил бы историю ваших покупок. Право на тариф определяется у нас по подтверждённому магазином чеку, поэтому изменённое приложение не может выдать себе платный тариф.
Ограничения тарифа — сколько групп, сколько участников, сколько места, какое разрешение — применяются на сервере, а не в приложении. Копия этих чисел в приложении нужна лишь для того, чтобы показать вам понятное сообщение до того, как вы упрётесь в предел.
9. Что покидает ваше устройство и к кому уходит
Это раздел, который большинство технических документов оставляет размытым. Наш конкретен, в том числе там, где это нам невыгодно.
Отчёты об ошибках и сбоях уходят в Sentry. Он получает идентификатор вашей учётной записи, имя и адрес почты, чтобы отчёт можно было связать с затронутым пользователем. Он настроен никогда не получать тела запросов, токены аутентификации, подписанные ссылки на хранилище, коды приглашений, токены общего доступа — и ключ группы. Последнее не вопрос политики: ошибочно введённый ключ иначе попал бы в отчёт внутри текста исключения, поэтому очистка, которая его удаляет, покрыта тестами, ломающими сборку при регрессии.
Продуктовая аналитика уходит в PostHog: какие экраны открываются, какие функции используются, версия приложения и платформа. Названия экранов очищаются, чтобы идентификаторы групп, медиафайлов и приглашений никогда не попадали в событие.
Push-уведомления доставляются через OneSignal. Живой чат и присутствие больше не работают на инфраструктуре третьей стороны: они работают на нашем собственном сервере реального времени, а сообщения хранятся в нашей собственной базе данных — в зашифрованной группе как текст, который мы не можем прочитать. Приложение подключается с помощью краткосрочного токена, который лишь идентифицирует вас, и входит в комнату каждой группы со вторым токеном, выданным именно для этой комнаты и каждый раз сверяемым с вашим членством. Личные сообщения устроены так же, с одной оговоркой: у переписки двух людей нет группового ключа, поэтому устройства выводят его между собой из ключей личности, от которых мы храним только открытые половины. Мы храним результат и не можем его открыть.
На бесплатном тарифе рекламу показывает Google AdMob. В iOS у вас спрашивают разрешение до использования любого рекламного идентификатора, и если вы откажете, реклама останется, просто нецелевая. Там, где местный закон требует форму согласия, она показывается до этого запроса. AdMob никогда не получает ваше имя, почту, фотографии или что-либо из ваших групп.
Если вы установили Vibn по одной из наших реклам, мы сообщаем, что эта реклама принесла, чтобы понимать, какая из них работает: что приложение было установлено, что была создана учётная запись, что вы открыли экран тарифов, что вы нажали кнопку подписки и что подписка была куплена. Google и Meta получают первое, второе и последнее с вашего устройства — на iPhone через Apple SKAdNetwork, которая передаёт рекламодателю одно агрегированное число с задержкой и вообще без идентификаторов, поэтому в этом приложении нет запроса на отслеживание; на Android через их собственные SDK, и там, где местный закон требует форму согласия, она показывается первой. OpenAI Ads получает все пять с наших серверов, а не с вашего устройства, и именно здесь появляется единственный идентификатор: если вы согласились на измерение эффективности рекламы, мы добавляем необратимо зашифрованную форму вашего адреса электронной почты, чтобы покупку можно было сопоставить с увиденной вами рекламой. Если вы отказались или вас никогда не спрашивали, идентификатор не отправляется вовсе. Никому из них никогда не сообщают, чем вы поделились, в каких вы группах и что находится внутри них.
Если вы жалуетесь на фото или видео, вместе с жалобой отправляется расшифрованная копия именно этого файла, чтобы её мог оценить человек, — приложение сообщает об этом прямо на экране отправки. Она хранится отдельно от группы, показывается только по ссылке, которая истекает через считаные минуты, и удаляется через 90 дней после закрытия жалобы. Мы никогда не сообщаем, кто подал жалобу. Жалоба на человека или группу не отправляет никаких медиафайлов.
10. Удаление
Удаление аккаунта убирает его, созданные вами группы и материалы в них, а также освобождает ваше участие в чужих группах. В течение 30 дней его можно восстановить, и только ради этого мы его храним: аккаунт заблокирован, ваш профиль исчезает из приложения у всех остальных, созданные вами группы становятся доступны только для чтения с указанной датой удаления, а повторный вход даёт одну кнопку, чтобы всё отменить. Когда 30 дней истекают, запланированная задача выполняет то же удаление, которое раньше кнопка делала сразу, и всё исчезает — и для нас тоже. Это никогда не остаётся скрытой пометкой в строке, которую мы сохранили.
Начать удаление можно и с нашего сайта, не открывая приложение — это удобно, если устройство потеряно. У этой страницы есть ограничение частоты и защита от автоматического злоупотребления, и она намеренно даёт один и тот же ответ независимо от того, есть ли аккаунт с таким адресом — включая одинаковое время ответа — чтобы её нельзя было использовать для выяснения, у кого есть аккаунт в Vibn.
- Удаление загруженного вами медиафайла удаляет сам хранимый объект, а не только запись в списке.
- Удаление данных о лице происходит немедленно и полностью.
- Биометрические данные не ждут 30 дней: они стираются в тот момент, когда вы просите об удалении, и восстановление аккаунта их не возвращает.
- Резервные копии и журналы истекают по собственным срокам; удаление не происходит мгновенно везде сразу, и мы этого не утверждаем.
11. Чего мы не делаем
Кто-то должен оплачивать серверы, на которых лежат ваши фотографии и видео. Их оплачивают подписки, а на бесплатном тарифе помогает реклама. Чем за это не платят — так это вами: ничего из того, что находится внутри ваших групп, никому не предлагается, и ни один из пунктов ниже не является бизнесом, который мы держим про запас.
Один пункт в этом списке — вовсе не обещание. Медиафайлы в зашифрованной группе для нас нечитаемы, поэтому их нельзя ни проанализировать, ни продать, ни использовать для обучения чего-либо — ни нам, ни тем, у кого эти серверы окажутся позже; почему так, объясняет раздел 3. Остальное — обещания, и мы предпочитаем сказать, что есть что, а не оставлять это вашим догадкам.
- Мы не продаём ваши персональные данные.
- Мы не продаём, не сдаём в аренду и не обмениваем доступ к вашей учётной записи, вашим группам или вашим медиафайлам — ни рекламодателям, ни брокерам данных, ни кому-либо ещё.
- Мы не используем содержимое ваших фотографий, видео или сообщений для нацеливания рекламы.
- Мы не обучаем никакие модели на вашем контенте.
- Мы не строим социальный граф между группами, и нигде в продукте нет списка подписчиков, публичного профиля или предложений друзей.
- Мы не читаем ваши сообщения. В зашифрованных группах мы бы и не смогли; в старых — не читаем.
12. Известные ограничения
Документ о приватности, перечисляющий только сильные стороны, это маркетинг. Вот то, что мы хотели бы знать на вашем месте.
- У кого есть полная ссылка-приглашение, у того есть ключ группы (раздел 4).
- Пока нет смены ключа и нет отзыва для отдельного участника; удаление человека прекращает будущий доступ, но не отменяет увиденное.
- Если вы потеряли все устройства и ссылку-приглашение, вернуть медиафайлы можно только по фразе восстановления. Если резервная копия не создавалась или фраза тоже утрачена, медиафайлы не восстановит никто, включая нас.
- Блокировка снимков экрана в группах с выключенным обменом останавливает снимок средствами операционной системы. Она не мешает сфотографировать экран другим телефоном.
- Группы, созданные до внедрения шифрования, не защищены сквозным шифрованием. Их медиафайлы защищены контролем доступа и подписанными ссылками, но сервер может их прочитать.
- Метаданные не зашифрованы: мы знаем, какие аккаунты в каких группах, когда что загружено, когда, по словам файла, оно было снято, и какого размера.
- Метаданные переписок тоже не зашифрованы: мы знаем, кто с кем и когда обменивается личными сообщениями, хотя не можем прочитать ни слова.
- Хранилище тарифицируется по владельцу группы. Если его подписка заканчивается и через 30 дней после предупреждения его группы всё ещё превышают бесплатный лимит, мы удаляем самые старые медиафайлы в этих группах — включая загруженные другими участниками, — пока они не уложатся в лимит.
- Жалоба на фото или видео отправляет нам его расшифрованную копию. Это единственное исключение из всего, что сказано в разделе 3; оно происходит только когда участник сам решает пожаловаться, и только для того файла, на который он жалуется. Материал по жалобе также скрывается из группы до проверки человеком и возвращается сам через семь дней, если её никто не провёл.
- Когда вы отправляете фото или видео, ваш телефон прикладывает отпечаток файла, чтобы мы могли отклонить точную копию того, что в группе уже есть. В зашифрованной группе этот отпечаток вычисляется с ключом самой группы, которого у нас никогда нет: он говорит нам лишь то, что две загрузки в одну группу — это один и тот же файл. Проверить по нему файл, который уже есть у нас, мы не можем.
- Мы храним ключи от групп нескольких учётных записей, которые создаём сами: это тестовые аккаунты для проверок качества и для проверки в магазинах приложений. В таких группах лежат сгенерированные изображения-заглушки, и они никому не принадлежат. Ключ от вашей группы никогда не хранится в виде, который мы могли бы использовать.
13. Как это проверить
Утверждения этого документа соответствуют наблюдаемому поведению: посторонний, запросивший группу, получает «не найдено»; ссылка на общую фотографию перестаёт работать после истечения подписи; для зашифрованной группы нельзя создать публичный доступ; после удаления данных о лице фильтр по людям вас забывает.
Если вы найдёте здесь что-то, что не совпадает с поведением приложения, значит, где-то из двух ошибка, и мы хотим о ней узнать.
14. Контакты
Вопросы об этом документе или о чём угодно в нём: [email protected]
Формальное изложение того, что мы собираем и зачем, есть в нашей Политике конфиденциальности. При расхождении обязательной является она.