Архитектура
конфиденциальности
Мы построили систему, в которой даже сами не можем получить доступ к вашим личным данным и паролям. Это не декларация намерений — это математическая гарантия.
Четыре гарантии
Ключ только у вас
Ваша фраза восстановления (12 слов BIP39) генерируется в браузере. Она никогда не покидает ваш браузер и не отправляется на сервер. Без неё никто не откроет ваши зашифрованные данные.
Приватный ключ зашифрован
P-256 приватный ключ хранится на сервере, но зашифрован AES-256-GCM ключом, производным от вашей фразы. Взломать без фразы — вычислительно невозможно (2¹²⁸ вариантов).
Admin не может сбросить пароль
Для аккаунтов с ключом восстановления сброс пароля через admin panel заблокирован. Смена пароля требует cryptographic challenge-response подписи вашим приватным ключом.
Vault и Credentials зашифрованы
Пароли в хранилище и учётные данные проектов зашифрованы в браузере до отправки. Сервер хранит только зашифрованный blob — расшифровать без мастер-пароля невозможно.
Что хранит сервер
Честная таблица: что мы храним и может ли admin увидеть это в открытом виде.
| Данные | Что хранится на сервере | Admin видит? |
|---|---|---|
| Email в открытом виде (нужен для входа и уведомлений) | да | |
| Имя / Аватар | Публичные метаданные профиля | да |
| Пароль аккаунта | bcrypt-хеш (необратимый, алгоритм стоимостью 12) | да |
| Фраза восстановления | НЕ хранится — только в вашем браузере / на бумаге | ❌ Нет (E2E) |
| Приватный ключ P-256 | JWK зашифрован AES-256-GCM ключом из вашей фразы | ❌ Нет (E2E) |
| Публичный ключ P-256 | SPKI base64url (только для верификации подписей) | да |
| Vault (пароли) | AES-256-GCM зашифрованный blob (ключ из мастер-пароля) | ❌ Нет (E2E) |
| Учётные данные проектов | AES-256-GCM зашифрованный blob (ключ из мастер-пароля) | ❌ Нет (E2E) |
| Секреты 2FA (генератор кодов) | Шифротекст AES-256-GCM, ключ из окружения приложения (не из вашего пароля) | нет, пока не утёк ключ приложения |
| Контент проектов / задач | Открытый текст (access-controlled) | да |
| Файлы проектов | Объектное хранилище на том же сервере, открытый вид | да |
| Аккаунты мессенджеров | Только метаданные: платформа, название, логин. Пароли и сессии — на вашем устройстве | да |
| Статистика посещений | Маршрут, реферер, user-agent, хеш IP (сырой IP не хранится) | да |
* «Admin видит: Да» означает, что технически доступно при компрометации сервера. Мы это честно указываем — частичная прозрачность лучше ложных обещаний. Контент проектов (задачи, доки) — следующая стадия E2E (roadmap).
Как работает восстановление
Регистрация / Setup
В браузере генерируется случайная P-256 ключевая пара. Из вашей фразы (PBKDF2 × 200 000 итераций, SHA-256) выводится AES-ключ. Приватный ключ шифруется этим AES-ключом. На сервер отправляется: публичный ключ (открыто) + зашифрованный приватный ключ. Фраза остаётся только у вас.
Восстановление пароля
Вы вводите email → сервер возвращает зашифрованный приватный ключ + одноразовый nonce (10 минут). В браузере: фраза → AES-ключ → расшифровать приватный ключ → подписать nonce алгоритмом ECDSA P-256. Подпись отправляется на сервер. Сервер проверяет подпись публичным ключом. При успехе — разрешается смена пароля.
Admin Panel
Для ZK-защищённых аккаунтов кнопка «Сбросить пароль» в admin panel заменена на «🔐 Сброс заблокирован». Admin технически может поменять поле password_hash в БД напрямую — но зашифрованные данные останутся нечитаемыми без фразы восстановления.
Технический стек
Генерация ключей
Web Crypto API (нативный браузер, не библиотека)
Алгоритм подписи
ECDSA P-256 / SHA-256
Шифрование ключа
AES-256-GCM (12-байт IV, 128-бит тег)
Деривация фразы → ключ
PBKDF2-SHA256, 200 000 итераций
Vault / Creds шифрование
AES-256-GCM (PBKDF2 от мастер-пароля)
Хеш пароля аккаунта
bcrypt, стоимость 12
Фраза восстановления
BIP39, 12 слов = 128 бит энтропии
Challenge TTL
10 минут, одноразовый, помечается usedAt
Что мы не делаем и почему
Не логируем расшифрованные данные
Логи сервера содержат только метаданные (ID, время). Зашифрованные blob-ы не декодируются на сервере — это технически невозможно без вашего ключа.
Не предлагаем email-восстановление для ZK-аккаунтов
Email-коды можно перехватить (admin контролирует почтовый сервис). Фраза восстановления не проходит через наши серверы вообще.
Не храним мастер-пароль vault
Мастер-пароль вводится в браузере → PBKDF2 → AES-ключ. Сервер видит только зашифрованный blob. Забытый мастер-пароль = потеря vault (это намеренно).
Не делаем «сброс по запросу» для admin
Для ZK-аккаунтов это архитектурно заблокировано. Admin может изменить пароль в БД напрямую, но после входа пользователь увидит только зашифрованные данные.
Честные ограничения
Мы строим прозрачную систему, но не хотим вводить вас в заблуждение. Вот что не защищает ZK-модель на текущем этапе:
- ⚠Контент проектов и задач хранится в открытом виде в БД. При компрометации сервера он читаем. E2E-шифрование контента — в roadmap.
- ⚠Email и имя видны admin-у — они нужны для работы сервиса (уведомления, идентификация).
- ⚠Потеря фразы = необратимая потеря зашифрованных данных. Бэкапа на нашей стороне нет. Храните фразу надёжно.
- ⚠Компрометация браузера (вредоносные расширения, XSS) может позволить прочитать ключи в памяти. Используйте надёжный браузер.
Хотите защититься прямо сейчас?
Настройте ключ восстановления в личном кабинете. Это займёт 2 минуты.