Clusker

Сейф паролей, который не прочитает даже наш сервер

Пароли в Clusker шифруются на вашем устройстве. Сервер хранит байты, которые не может открыть, и ни API, ни агент, ни поиск не умеют их выдать.

В Clusker проекты, документы и задачи лежат в одном месте, и пароли тоже там. Вход в хостинг клиента хранится рядом с проектом, к которому относится, а не в отдельном приложении. Удобно — и сразу вопрос: если пароли живут в том же продукте, что и всё остальное, кто ещё может их прочитать?

Ответ зашит в устройство сейфа, а не спрятан в настройках: никто, кроме вас. Ни наш сервер, ни человек с доступом к базе, ни ИИ-агент, подключённый к вашему аккаунту.

Шифруется до того, как покинет устройство

У сейфа свой мастер-пароль. Он не совпадает с паролем входа в Clusker и нигде не хранится — ни на сервере, ни в браузере. Когда вы открываете сейф, вся работа с ключами идёт на вашем устройстве:

  • Мастер-пароль проходит через Argon2id: 64 МиБ памяти, три итерации. Получается ключ, которым разворачивается ваш личный приватный ключ X25519, — сам он хранится зашифрованным AES-256-GCM.
  • У каждой записи свой случайный ключ, содержимое шифруется AES-256-GCM. Ключ записи в свою очередь завёрнут, и развернуть его могут только ключи, расшифрованные на устройстве.
  • На сервер уходит шифротекст. Название записи — тоже внутри него.

Открытым на сервере остаётся нарочно скучное: к какому проекту относится запись, какого она рода (вход, карта, ключ или заметка) и когда её завели или меняли. Этого хватает, чтобы разложить список по проектам. И не хватает, чтобы что-нибудь узнать.

Нет ручки — нечему утечь

Clusker построен вокруг API: веб-приложение и ИИ-агенты, подключённые через MCP, ходят в один и тот же JSON API. Для задач и документов это ровно то, что нужно. Для сейфа — ровно то, что опасно: если бы какая-то ручка отдавала пароли, рано или поздно её бы кто-нибудь позвал.

Поэтому такой ручки нет. Сейф исключён из всех путей, по которым его содержимое могло бы куда-то уехать:

  • Агенты и MCP. Инструментов для сейфа нет вовсе. Дело не в том, что у токена нет прав, — просто не существует метода, на который эти права можно было бы выдать.
  • Markdown-зеркало и git. Документы Clusker — это markdown-файлы, их можно открыть в любом редакторе. Записи сейфа в эти файлы не пишутся никогда.
  • Общий поиск. Записи сейфа в поисковый индекс не попадают: серверу просто нечего индексировать.
  • Гостевые ссылки. Страница, открытая гостю, не выносит записи сейфа наружу.

В этом разница между настройкой и устройством. Настройку можно выключить по ошибке, из-за бага или из лучших побуждений администратора. Ручку, которой нет, выключить нельзя.

Закрыт по умолчанию

Сейф открывается заблокированным при каждом входе. Он закрывается сам через десять минут без действий и при закрытии вкладки. Пароль показывается только по нажатию «Показать», а скопированный пароль стирается из буфера обмена через 30 секунд. Каждый показ, копирование и правка попадают в журнал доступа — там записано, кто и когда, но никогда не сам секрет. Расшифрованное живёт только в памяти открытой вкладки.

Touch ID и Face ID без участия сервера

Сейф открывается ещё и по Touch ID или Face ID. Работает это на расширении WebAuthn prf: после того как палец или лицо проверены, аутентификатор выдаёт 32 байта, выведенные из секрета passkey, который странице не показывается и привязан к нашему домену. Из этих байтов выводится ключ, которым тот же приватный ключ заворачивается второй раз.

Эта вторая обёртка лежит в браузере на этом устройстве — и больше нигде. Положить её на сервер было бы удобнее, и именно поэтому мы так не сделали. Passkey в связке ключей iCloud синхронизируется между устройствами. Лежи обёртка у нас, человек, укравший и вход в Clusker, и ваш Apple ID, открыл бы сейф, ни разу не подойдя к вашему компьютеру. Когда обёртка на устройстве, такая связка ему ничего не даёт. Цена небольшая, и мы приняли её сознательно: если очистить данные сайта, быстрый вход придётся включить заново.

Биометрия не добавляет серверу ни одной ручки и ничего не заменяет. Мастер-пароль остаётся корнем всего.

То, что не баг

Если вы забыли мастер-пароль, записи под ним потеряны. Восстановления нет и не будет. Это прямое следствие первого правила: сервер, который умеет вернуть вам пароли, умеет их и прочитать. Из всего, что здесь написано, это единственное, что стоит знать заранее, прежде чем положиться на сейф.

Почему сейф — последним

Сейф мы строили, когда проекты, документы, задачи и права уже устоялись. Это единственная часть Clusker, где ошибка обходится дороже задержки, и шифрование должно ложиться поверх модели доступа, которая перестала меняться, а не наоборот. Сквозные проверки гоняют настоящие ключи X25519 через настоящие ручки сервера, а не заглушки.

Следующее — общий сейф для команды. Это сложнее, чем звучит, когда сам сервер не может выдать ни одного ключа. Расскажем, когда выкатим.

Читают также

Все записи

Журнал изменений4 мин чтения

Что вышло в начале сентября

Граф связей у документов, совместная правка страниц и холстов, комментарии с markdown и семь починок по нашему же смотру.