BlackGhost
Веб-мессенджер с шифрованием на вашем устройстве. Сервер передаёт данные и держит очередь для офлайн-пользователей, но не знает содержимого ваших переписок.
Содержание
- Идея и устройство
- Безопасность: чем это защищено
- Зачем это нужно
- Как пользоваться правильно
- Установка как приложение (PWA)
- Обзор функций
- Подлинность собеседника (никто не мешает войти под чужим ником)
Идея и устройство
AsafNet BlackGhost (в интерфейсе кратко — BlackGhost) — это клиентский мессенджер в браузере и лёгкий relay-сервер (Node.js). Сообщения и служебные команды шифруются у вас в браузере ключами, которых сервер не получает.
Сервер видит только то, что нужно для доставки: ники отправителя и получателей, идентификатор чата, время, зашифрованную строку ciphertext. Текст переписки и ключи чатов для сервера остаются нечитаемыми.
Пока собеседник не в сети, сообщения лежат в его очереди на сервере (можно сохранять на диск на стороне сервера). Когда он подключается и опрашивает сервер, сообщения отдаются и снимаются с сервера.
Безопасность: чем это защищено
- End-to-end для текста чата. Содержимое сообщений шифруется ключом конкретного чата. Без этого ключа relay не расшифрует переписку.
- Два режима входа. Авто — на сервере создаётся учётная запись (уникальный логин и пароль): пароль хранится только в виде устойчивого хеша (scrypt), сессия в защищённой cookie; поле from в API привязано к вашему логину, публичный ECDH-ключ публикуете только вы. Обмен ключами чата — через криптографию с открытыми ключами (приватные ключи только в браузере). Вручную — без аккаунта на сервере: общая сид-фраза логина и при необходимости ключ чата вы согласуете сами (как раньше; подлинность ника сервер не проверяет).
- HTTPS. Клиент в продакшене принимает только https:// (исключение: http://localhost и 127.0.0.1 для разработки). TLS настраивается на nginx/Caddy перед Node. Если на старом устройстве пишет, что не удаётся установить безопасное соединение, это настройка TLS у оператора (полная цепочка сертификата, TLS 1.2+, шифры); см. раздел совместимости TLS в DEPLOY.md у развёртывания.
- Файл очереди на сервере (если включён) содержит зашифрованные полезные нагрузки и метаданные маршрутизации; диск сервера лучше шифровать (LUKS и т.п.).
Что видит оператор сервера и насколько это чувствительно
- Текст переписки в ciphertext без ключей чата (они только у клиентов) для оператора не читается.
- Пароли режима Авто на диске хранятся как хеши (scrypt), не как открытый текст; утечка accounts.json облегчает офлайн-подбор слабых паролей, но не даёт мгновенного входа.
- Публичные ECDH-ключи в режиме Авто публичны по смыслу (как в обычном криптообмене); с их компрометации нельзя прочитать старые сообщения без приватного ключа собеседника.
- Не убирается архитектурой «простой relay»: кто кому пишет, когда, размеры сообщений, идентификаторы чатов — это метаданные маршрутизации. Скрыть их полностью можно только другими схемами (P2P, mix-сети и т.д.), не этим сервером.
Зачем это нужно
- Минимальная инфраструктура: один небольшой сервер без базы данных.
- Работает в обычном браузере, в том числе на старых устройствах (в разумных пределах).
- Данные переписок хранятся у вас в браузере (localStorage); можно сделать резервную копию через экспорт.
- Сообщения уходят в сеть уже в зашифрованном виде; офлайн-доставка не требует хранить plaintext на сервере.
Как пользоваться правильно
1. Вход
Выберите Авто или Вручную, введите адрес сервера (в продакшене — https://…).
В режиме Авто: кнопки Вход и Регистрация. При регистрации задаёте логин (латиница a–z, цифры, _ и -, 2–40 символов; на сервере он хранится в нижнем регистре) и пароль (не короче 8 символов). Один и тот же пароль на устройстве участвует в локальном шифровании вашего приватного ключа (отдельно от хеша на сервере). Кнопка Выйти сбрасывает сессию на сервере. На сервере хранится один активный публичный ключ на логин: последнее устройство, с которого вы вошли и опубликовали ключ, получает новые авто-рассылки ключа чата; на нескольких устройствах используйте экспорт/импорт .giz и тот же логин с паролем.
В режиме Вручную: произвольный ник и общая сид-фраза, как у всех участников «комнаты».
2. Чаты
Создайте чат: название, участники через запятую. В режиме Авто указывайте логины собеседников так же, как они зарегистрированы на сервере (в форме они приводятся к нижнему регистру). В режиме Вручную все должны согласовать ники и секрет. Ключ чата в режиме Авто создаётся и рассылается автоматически; в режиме Вручную введите один и тот же ключ у всех.
3. Переписка
Выберите чат слева, пишите сообщение. Не отключайте долго сервер в продакшене без бэкапа экспортом — у собеседника история останется, у вас — что успело сохраниться локально.
4. Резервные копии
Пользуйтесь меню переноса: экспорт зашифрует все чаты (и список друзей) вашим ключом логина; храните файл в безопасном месте.
Установка как приложение (PWA)
BlackGhost можно открывать как обычный сайт и как установленное веб-приложение с иконкой на главном экране или в меню программ. Тогда страница открывается в отдельном окне (режим «как приложение»), без адресной строки в полный рост — удобнее на телефоне.
Как предлагает сам клиент
- После входа на узком экране (телефон или похожий режим) один раз может появиться нижняя плашка: предложение добавить приложение. Кнопка Установить открывает системный диалог браузера (если он это умеет) или инструкцию по шагам именно для вашего браузера и ОС.
- Не сейчас скрывает плашку и больше не показывает её в этом браузере (настройка запоминается). Внизу экрана чата кратко подскажут, где потом искать установку в меню браузера.
- В меню переноса (кнопка «Перенос» в левой колонке) есть пункт Установить как приложение — он дублирует установку или показывает ту же инструкцию. На компьютере пункт может появиться, если браузер уже готов предложить установку (например, Chrome).
- Если вы уже открыли BlackGhost с главного экрана как приложение, ни плашка, ни этот пункт меню не показываются — вы уже в установленном режиме.
Вручную по платформам
- Android, Chrome или Chromium: меню ⋮ → «Установить приложение», «Установить» или «Добавить на главный экран» (формулировка зависит от версии).
- iPhone / iPad, Safari: кнопка Поделиться ↗ → «На экран «Домой»». В Chrome на iOS путь может быть «⋯» → «Добавить на экран «Домой»»; если пункта нет — откройте сайт в Safari и добавьте оттуда.
- Компьютер, Chrome / Edge / Opera: иконка установки в адресной строке или меню «⋯» → установка приложения / сайта как приложения.
Service Worker и офлайн
- Для PWA подключается service worker: кэшируется оболочка страницы и статика; запросы к API (вход, сообщения, опрос) идут в сеть и не подменяются кэшем из SW.
- При потере сети текстовые сообщения могут сохраняться в очередь в браузере (IndexedDB) и отправляться после восстановления связи; в интерфейсе отображается статус офлайна. Вложения и весь функционал без сети могут быть недоступны — рассчитывайте на онлайн для полной работы.
- Когда выкладывается новая версия скриптов, может появиться уведомление «Доступна новая версия» с кнопкой обновления страницы — так подтягивается свежий service worker.
- Чтобы после закрытия PWA не вводить пароль/сид заново, снимок сессии хранится в localStorage браузера для этого сайта (как и локальные чаты). Кнопка Выйти в списке чатов сбрасывает снимок и серверную сессию в режиме Авто.
- На телефоне ОС может притормаживать работу вкладки или PWA в фоне: long-poll и сеть возобновляются, когда вы снова открываете приложение. Клиент при возврате на экран принудительно переподключает опрос и сбрасывает офлайн-очередь исходящих.
Обзор функций
Ниже — элементы интерфейса и поведение. При обновлении мессенджера этот список стоит дополнять.
Вход Экран входа
- Режим Авто: регистрация или вход, логин, пароль аккаунта, URL relay.
- Режим Вручную: ник, общая сид-фраза, URL relay (без аккаунта на сервере).
- Ссылка на эту справочную страницу — без входа.
Чаты Список и создание
- Список чатов в левой колонке; непрочитанные помечаются. Вверху колонки: Справка (эта страница в новой вкладке), Контакты, Выйти.
- Создание: название, участники, режим ключа чата (авто или общий секрет вручную).
- Личные чаты (типа «ЛС» с двумя участниками) в списке и в шапке на каждом устройстве подписываются ником собеседника, а не вашим именем — так удобнее ориентироваться.
Сообщения Переписка
- Сообщения шифруются ключом текущего чата.
- Под полем ввода — Файл, Голос, Видео и Стоп для записи: вложение шифруется на устройстве, на сервер relay попадает только шифротекст; после скачивания каждым получателем копия на сервере удаляется. Расшифрованные данные хранятся в браузере (IndexedDB).
- Сообщения с вложениями нельзя переслать в другой чат кнопкой «Переслать».
- Под пузырьком — кнопки Ответ, Переслать, Удалить (удаление — у себя или у всех по запросу).
- Статусы исходящих: отправка на сервер и прочтение (по согласию клиентов и настройкам конфиденциальности в настройках чата для активного личного диалога на двоих).
- Индикатор «печатает» — через сервер; его можно отключить в настройках чата с этим собеседником.
- Статус в сети / не в сети (по сигналам на сервере): в шапке чата и у друзей. Пункт «Не обмениваться статусом „в сети“» в настройках чата с собеседником отключает обмен в обе стороны на вашем устройстве; после снятия галочки всё снова работает.
- В меню переноса: скрытие ника в пересылке, глобальный запрет пересылки всех ваших сообщений (рассылается участникам), галочка на каждое сообщение и режим по умолчанию для новых.
- Запрет пересылки и скрытие ника — соглашение между клиентами; злоумышленник с другим клиентом теоретически может обойти.
Чат Шапка переписки
- Статус сети, кнопка Контакты, для групп — Группа и Настройки чата, Отпечаток — первые 16 символов hex от SHA-256(ключ чата + id чата); сверьте с собеседником голосом или другим каналом.
- Удалить чат — только у себя или для всех участников (по запросу).
- На телефоне кнопка ← возвращает к списку чатов.
Профиль Личный аватар и описание
- Кнопка Профиль в левой колонке открывает смену пароля аккаунта (режим Авто), аватар и короткое описание (био), видимое другим на сервере.
- Аватар обрезается в квадрат в браузере, при необходимости сжимается до лимита размера файла на сервере (см. настройки деплоя). После загрузки картинка обновляется у собеседников без ручной очистки кэша.
- Аватар и био — не содержимое E2E-чатов; они хранятся как обычные данные на relay.
Контакты Локальный список + поиск
- Список контактов хранится локально в браузере; дополнительно есть поиск зарегистрированных логинов на сервере по префиксу.
- Написать — открыть личный чат с этим ником (в списке чатов показывается ник друга).
- Звезда (☆/★) — ваша локальная отметка «проверил личность вне чата»; в переписке у сообщений этого ника показывается ✓ (это не криптографическая гарантия, а напоминание для вас).
Группы Участники, роли и аватары
- Реестр группы на сервере. Для групповых чатов relay хранит запись группы: название, участники, владелец (создатель), и флаги админ-прав.
- Создатель группы — админ автоматически. Он получает полный набор прав: добавлять участников, исключать участников, менять название, менять аватар, раздавать и снимать админ-права.
- Админы друг друга исключить не могут. Создателя исключить нельзя. Это правило проверяется на сервере.
- Всё через интерфейс. В шапке группового чата нажмите кнопку Группа:
- Название — поле и кнопка «Сохранить название» (доступно админу с правом смены названия).
- Аватар группы — «Загрузить/изменить» и «Удалить» (доступно админу с правом смены аватара). Клик по аватару открывает крупный просмотр.
- Участники — список всех логинов с бейджами «создатель/админ/вы». Для каждого участника доступно:
- Сделать админом / Снять админа (только если у вас есть право раздавать роли).
- Исключить (только если у вас есть право исключать и цель — не админ/не создатель).
- Добавить участника — поле логина и кнопка «Добавить» (если у вас есть право добавлять).
- Аватары — не E2E. Аватары пользователя и группы загружаются на сервер отдельными файлами (это не шифротекст сообщений).
Перенос Меню переноса
- Установить как приложение — см. раздел Установка как приложение (PWA) (на части устройств пункт скрыт, если установка неактуальна или вы уже в приложении).
- Экспорт — скачать файл .giz с зашифрованными чатами и друзьями; локальные вложения из IndexedDB включаются в архив (формат v2, base64), если каждый файл не больше 8 МиБ — крупнее не попадают в экспорт (после скачивания показывается счётчик пропущенных).
- Импорт — восстановить из файла (нужен тот же ключ, что при экспорте: в Вручную — сид-фраза; в Авто — тот же логин и пароль аккаунта).
- В режиме Авто пароль аккаунта в файл не выгружается — используйте менеджер паролей.
Сервер Офлайн и очередь
- Если получатель не в сети, сообщение попадает в его очередь на сервере.
- После успешной выдачи при опросе сообщение с сервера удаляется.
- Администратор может задать лимит размера очереди и путь сохранения на диск (см. документацию деплоя).
Уведомления
- При разрешении браузера — уведомления о новых сообщениях; играет короткий звук. На экране входа и в шапке переписки есть кнопка явного запроса разрешения (удобно для Chrome).
- В Chrome на macOS проверьте «Системные настройки → Уведомления → Google Chrome»: разрешены ли баннеры; при «Не беспокоить» уведомления не показываются.
- Если вкладка активна и открыт этот же чат — баннер не показывается; во вкладке в фоне или при скрытом документе — может показаться.
- Клиент регистрирует service worker для PWA (кэш оболочки, обновления). Полноценные push-уведомления при полностью закрытой вкладке в этой сборке не заявлены — рассчитывайте, что уведомления приходят, пока страница открыта (в том числе в фоновой вкладке или в установленном приложении с запущенным клиентом).
Подлинность: любой может ввести ваш ник
Сервер не проверяет, что вы «настоящий» владелец ника. Ниже — варианты, как всё равно убедиться, что пишет нужный человек (можно комбинировать). Выберите то, что подходит вам, или придумайте свой ритуал.
- Общий секрет «слово-вызывание». Заранее договоритесь о короткой фразе, которую вы вставляете в начале сессии или по запросу; подделать без знания фразы сложнее (но фразу нельзя светить в открытом чате).
- Вопрос–ответ из реальной жизни. Один задаёт вопрос, на который знает ответ только настоящий собеседник (без передачи ответа по этому же чату заранее).
- Сверка ключей вне мессенджера. В шапке чата кнопка Отпечаток показывает короткую строку от ключа чата — сравните с собеседником. Можно дополнительно сравнивать сид-фразу или QR с публичным ключом (в духе «safety number» в Signal).
- Локальная звезда у друга. После того как вы убедились, кто перед вами, отметьте ник звездой в списке друзей — в чатах рядом с сообщениями этого ника будет ✓ (только ваше устройство, не защита от подделки клиента).
- Отдельный доверенный канал. Первый контакт только через звонок, другой мессенджер или личную встречу; в BlackGhost переходите после того, как убедились в личности.
- Кодовые фразы по времени. Меняющийся пароль по договорённому алгоритму («сегодняшнее число + наше слово») — слабее криптографически, но лучше, чем ничего.
- Ничего не делать. Осознанный риск для низких ставок или когда подмена ника для вас не критична.
Полноценная «учётная запись» с паролем на ник на стороне сервера в этой архитектуре не реализована: это меняло бы модель доверия к relay.
Страница справки AsafNet BlackGhost. Вернуться на экран входа.