Skip to content

darker0n/CheburChat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Чебурчат

Сквозное шифрование личных сообщений во ВКонтакте. Расширение Chrome (Manifest V3), которое шифрует переписку прямо в интерфейсе ВК — сервер ВКонтакте и СОРМ видят только шифротекст, а ключи не покидают устройство.

License: MIT Manifest V3 Crypto: OpenPGP.js v6 Build: none

Сайт · Установка · Руководство пользователя · Технический документ

Обзор

Чебурчат добавляет E2E-шифрование поверх обычного веб-ВКонтакте, не меняя привычный интерфейс. Когда расширение установлено у обоих собеседников и они обменялись ключами, исходящие сообщения автоматически шифруются перед отправкой и расшифровываются после приёма. Если у получателя расширения нет — переписка идёт в открытом виде, как обычно.

Криптография не самописная: используется OpenPGP.js v6 — зрелая реализация от ProtonMail с двумя независимыми аудитами Cure53. Профиль ограниченный: Curve25519 (ECDH) + Ed25519 (подпись), без сжатия, обязательная подпись каждого сообщения.

Как это выглядит

Сообщение шифруется и расшифровывается прямо в окне чата ВКонтакте — привычный интерфейс не меняется:

Зашифрованное сообщение в чате ВКонтакте

Создание ключа, контакты и проверка отпечатков — в попапе расширения:

Создание ключа Контакты и состояния доверия Отпечаток ключа контакта
Создание ключа — приватность по умолчанию Контакты и состояния доверия Сверка отпечатка ключа

Что такое «Чебурчат»?

Название — отсылка к «Чебурнету»: так иронично называют изолированный, отгороженный от мира рунет (хроника интернет-цензуры в России — как к этому шло).

В России давят на VPN, но главное — вводят «белые списки»: во время отключений мобильного интернета (всё чаще с 2025 года) доступным остаётся только утверждённый перечень российских сайтов. VPN тут не помогает — суть не в блокировке отдельных ресурсов, а в том, что работают только сайты из списка.

ВКонтакте, Max, Mail.ru, сервисы «Яндекса» остаются в этом списке именно потому, что переписка в них не приватна: она идёт в открытом виде, хранится на серверах сервисов и доступна правоохранительным органам. В режиме белых списков работает ровно то, что прозрачно для государства, — ничего по-настоящему защищённого не остаётся.

Чебурчат закрывает эту дыру: даёт слой сквозного шифрования поверх работающих (но просматриваемых) сервисов вроде ВКонтакте. Переписка остаётся доступной даже в режиме белых списков — но больше не читается ни сервером ВК, ни СОРМ.

Подробнее про белые списки: Википедия · Meduza: «…кроме Чебурнета, ничего нет».

Архитектура

flowchart LR
  subgraph Page["вкладка vk.com"]
    CS["content script<br/>vk.js · vk_pure.js<br/><i>DOM-интеграция, UI-маркеры</i>"]
  end
  subgraph Ext["Расширение · Manifest V3"]
    SW["service worker<br/>worker.js<br/><b>крипта · trust · хранилище</b>"]
    POP["popup<br/>ключи · контакты · бэкап"]
    ST[("chrome.storage.local")]
  end
  CS <-->|chrome.runtime.sendMessage| SW
  POP <-->|chrome.runtime.sendMessage| SW
  SW <--> ST
Loading

Единый писатель. Вся криптография, записи в chrome.storage.local и логика доверия живут только в background-воркере. Content script никогда не пишет в хранилище напрямую — каждая операция идёт сообщением воркеру. Это защита от гонок при нескольких открытых вкладках; воркер делает per-record read-modify-write без перезаписи всей базы. MV3-воркер усыпляется и перезапускается, поэтому все операции идемпотентны и не зависят от долгоживущего in-memory состояния.

Протокол CHEBURCHAT:v1

Транспорт — обычный текст сообщения ВК в детектируемой обёртке. Подробности и канонические форматы — в TECHNICAL.md и MVP_SPEC.md.

sequenceDiagram
  participant A as Алиса · Чебурчат
  participant VK as Серверы ВК
  participant B as Боб · Чебурчат
  A->>VK: CHEBURCHAT:v1:key: (подписанный публичный ключ)
  VK->>B: то же сообщение
  B->>VK: CHEBURCHAT:v1:key: (свой ключ)
  VK->>A: то же
  Note over A,B: сверка отпечатков → контакт trusted
  A->>VK: CHEBURCHAT:v1:msg: (sign+encrypt к Бобу и себе)
  VK-->>B: только шифротекст
  Note over VK: сервер ВК и СОРМ видят лишь шифротекст
Loading
  • Ключевой анонс — две строки: человекочитаемое приглашение + CHEBURCHAT:v1:key:<base64url-json>. Полезная нагрузка подписана detached-подписью OpenPGP.
  • СообщениеCHEBURCHAT:v1:msg:<base64url>: sign+encrypt одной операцией к ключу контакта и собственному (encrypt-to-self — чтобы перечитывать свою историю).
  • Версионируется (v1); неизвестные версии помечаются как неподдерживаемые, а не парсятся вслепую.

Состояния доверия

missingnewtrusted; changed при конфликте ключа; rejected при явном отклонении. Автошифрование — только для trusted. decrypt_failed — состояние уровня сообщения и на доверие контакта не влияет. Идентичность платформенно-нейтральна — контакты ключуются парой (platform, accountId), что оставляет задел под другие платформы (Max).

Структура проекта

src/
├── background/   worker.js — роутер сообщений; crypto.js — OpenPGP; store.js — chrome.storage
├── content/      vk.js — DOM-интеграция ВК; vk_pure.js — чистые хелперы (тестируемы отдельно)
├── common/       protocol.js, constants.js, canonical.js, fingerprint.js, base64url.js, helpers.js
├── popup/        popup.{html,css,js} — основной UI (onboarding, контакты, бэкап ключа)
└── options/      options.{html,js} — расширенные настройки
tests/            *.test.js — Node.js test runner
docs/             MVP_SPEC.md (источник правды), TECHNICAL.md, USER_GUIDE.md
site/             исходники cheburchat.com (выносится в отдельный репозиторий)

Модель угроз

✅ Защищает содержимое от сервера ВК, сети/провайдера и СОРМ — по проводу только шифротекст
❌ Не защищает вредоносное ПО / скомпрометированное устройство; метаданные (кто, кому, когда — это видит ВК); скриншоты и буфер обмена

Расшифрованный текст рендерится inline в DOM ВК, ввод — в нативном поле. Активный клиентский JS самого ВК технически имеет доступ к DOM/вводу — это вне модели защиты беты (граница защиты — сервер/сеть, не само устройство). Приватный ключ в бете хранится локально без отдельного пароля — известный security debt, закрытие post-beta. Полная модель — в TECHNICAL.md.

Установка

Бета пока не в Chrome Web Store — ставится вручную из исходников (сборка не нужна). Пошагово: cheburchat.com/install.

1. Скачать ZIP последней версии из Releases и распаковать
2. chrome://extensions → включить «Режим разработчика»
3. «Загрузить распакованное расширение» → выбрать папку
4. Создать ключ в попапе и сохранить резервную копию

Пользовательская инструкция — docs/USER_GUIDE.md.

Разработка

Vanilla JS, без сборки и бандлера — расширение грузится прямо из исходников через manifest.json. Требуется Chrome 127+.

npm install      # только dev-зависимости (eslint, тест-раннер не нужен — встроен в node)
npm test         # тесты: крипта, протокол, trust-переходы, парсинг, лимиты
npm run check    # проверка наличия обязательных файлов
npx eslint .     # линтинг

Зависимость рантайма одна — openpgp. Источник правды по протоколу и поведению — docs/MVP_SPEC.md.

Roadmap (планы на будущее)

Идея Чебурчата — приватность поверх сервисов, которые остаются доступны даже в режиме белых списков. В том же направлении планы:

  • Мессенджер Max — поддержка Max как ещё одного транспорта. Модель идентичности уже платформенно-нейтральная ((platform, accountId)), менять протокол не придётся.
  • Транспорт поверх почты — шифрованная переписка через Mail.ru и Яндекс.Почту (они тоже в белых списках) — на случай, когда общего мессенджера нет.
  • Аудиозвонки — защищённые звонки поверх уже разрешённых сервисов видеоконференцсвязи (WebRTC через Яндекс Телемост и подобные), по принципу OlcRTC.

Лицензия

MIT.

About

Сквозное шифрование личных сообщений во ВКонтакте — расширение Chrome (MV3, OpenPGP.js)

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors