Files
bare/docs/decisions/006-e2ee-webcrypto.md
mayatnikovandClaude Fable 5 ae55c846aa ADR-015…024 и спецификации v1: криптография, протокол, хранение, UI, деплой, план
Закрыты все открытые вопросы проектирования. Пароль не покидает клиент
(два ключа из мастера), TOFU для публичных ключей, устройства и конверт,
атомарный rekey комнат, регистрация и контакты, схема SQLite и драйвер
без cgo, сессии и CSRF, деплой через nginx+systemd, правила пушей,
айдентика «Скобы» на системном mono. Иконки PWA в web/icons.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015DbCjVfTFq4ZFG8juD45YJ
2026-08-22 10:53:24 +03:00

1.7 KiB

ADR-006: E2EE на WebCrypto, ключ за паролем

Уточнён ADR-015 (два ключа из мастера) и ADR-016 (доверие к публичным ключам).

Контекст

Оператор не должен уметь читать сообщения. Крипто-библиотеки на клиенте противоречат нулю зависимостей и аудируемости — вся криптография должна быть нативной.

Решение

Только WebCrypto. Идентичность пользователя — ECDH-пара P-256. Приватный ключ шифруется ключом, выведенным из пароля (PBKDF2 — единственный KDF в WebCrypto; параметры и парольная политика — ADR-013), и хранится на сервере как блоб. Рядом с приватным ключом в блобе — секрет аккаунта для экспорта истории (ADR-014). Чаты 1:1: ECDH shared secret → AES-GCM.

Следствия

  • Сервер видит только шифротекст — и блоба, и сообщений.
  • Сброс пароля невозможен by design: пароль — материал ключа. Забыл — значит забыл.
  • Мультидевайс-вход: новый девайс вводит пароль, скачивает блоб, расшифровывает ключ.
  • Стойкость блоба к оффлайн-перебору равна стойкости пароля. Контрмеры — ADR-013.