Сквозное шифрование дневника
С сентября 2026 года GrowScope шифрует гроу-дневник каждого аккаунта сквозным способом и по умолчанию — это не переключатель в настройках, который можно включить по желанию. Содержимое дневника (растения, журналы полива/питания/климата/PPFD, заметки, сохранённый текст истории AI) шифруется на собственном устройстве пользователя до того, как оно вообще отправляется на сервер, и расшифровывается только на собственном устройстве пользователя. Сервер хранит для этого содержимого только шифротекст; он никогда не держит ключ, способный его прочитать. Эта страница документирует реальный механизм, а не маркетинговое резюме о нём.
Как это сделать в GrowScope
- При первом открытии приложения после этого релиза (новая регистрация или существующий аккаунт) автоматически запускается полноэкранный шаг настройки — нажимать кнопку для его начала не нужно.
- Фраза восстановления из 12 слов (мнемоника BIP-39, 128 бит энтропии) генерируется локально, на устройстве, и показывается один раз.
- Пользователь должен подтвердить два случайно выбранных слова из фразы, прежде чем продолжить — этот шаг нельзя пропустить или закрыть, потому что это единственная проверка того, что фраза действительно была записана.
- После подтверждения дневник шифруется и переносится одним PUT-запросом текущего снимка данных; каждая последующая запись автоматически проходит через шифрование на весь срок жизни аккаунта.
- На втором устройстве или после очистки хранилища браузера приложение вместо этого запрашивает ту же фразу из 12 слов для разблокировки дневника — для устройства, на котором она уже кэширована локально, она больше не запрашивается.
Шифрование дневника (grow_data)
- Категория
- Приватность и безопасность
- Назначение
- Шифровать всё содержимое гроу-дневника на стороне клиента так, чтобы сервер всегда хранил только шифротекст.
- Ввод
- От пользователя ничего, кроме одноразового подтверждения фразы восстановления — само шифрование автоматическое при каждом сохранении
- Расположение
- Работает прозрачно при каждом сохранении/загрузке дневника; единственный видимый шаг — экран фразы восстановления (обязателен при первом шифровании и снова, если устройству нужно разблокироваться)
- Действие пользователя
- Подтвердить два слова из сгенерированной фразы восстановления из 12 слов (только при первой настройке)
- Повторно ввести полную фразу из 12 слов для разблокировки на новом устройстве или после очистки хранилища браузера
- Результат
- Дневник хранится на сервере как непрозрачные зашифрованные байты (`grow_data.ciphertext` + `grow_data.nonce` + номер версии ключа) вместо читаемого JSON-блока. Также хранится обёрнутый ключ шифрования конкретного аккаунта и его соль (`users.wrapped_mek`, `wrapped_mek_nonce`, `kek_salt`), но они криптографически бесполезны без фразы восстановления пользователя.
- Используется в
- Каждое чтение/запись дневника — растения, журналы, заметки, сохранённый текст истории AI
- Связанные функции
- Нет
Примечания
- Иерархия ключей, точно: энтропия фразы восстановления из 12 слов растягивается в ключ шифрования ключа (KEK) через Argon2id (на стороне клиента, ~64 МиБ затрат памяти) со случайной солью для каждого аккаунта. Этот KEK оборачивает (шифрует через AES-256-GCM) отдельно сгенерированный 256-битный главный ключ шифрования (MEK) — именно обёрнутый MEK, а не саму фразу, загружают на сервер. Отдельные записи шифруются ключами, выведенными из MEK через HKDF-SHA256 со строкой контекста, специфичной для записи (например, дневник использует фиксированную строку контекста «grow_data», поскольку на аккаунт приходится один дневник), поэтому скомпрометированный производный ключ не раскрывает MEK или любую другую запись. Собственно шифрование содержимого использует AES-256-GCM (аутентифицированное шифрование — изменённый шифротекст не расшифровывается, а не молча выдаёт мусор).
- Фраза восстановления генерируется один раз, локально, и никогда не передаётся на сервер и не хранится им в пригодном для использования виде — только обёрнутый через AES-GCM MEK и публичная соль KDF. Это значит, что фраза — единственная точка восстановления: потеря её вместе с потерей всех устройств, на которых ключ уже кэширован, означает, что данные этого дневника не сможет восстановить никто, включая GrowScope. Это осознанная цена того, что дизайн действительно zero-knowledge, а не просто «зашифрован» — вариант восстановления на стороне сервера потребовал бы, чтобы сервер хранил нечто, способное восстановить ключ, а именно этого дизайн и избегает.
- Единственное раскрытое исключение из «сервер никогда не видит открытый текст», сформулированное точно: этот дизайн zero-knowledge для хранения и синхронизации — всегда; он намеренно НЕ zero-knowledge для AI-функций, и никогда не описывается как таковой. Каждая функция, использующая AI-кредиты, работает одинаково — AI-анализ растения (оценки здоровья/развития/кроны), Трихомный трекер, AI-скаутинг вредителей, консультант по удобрениям, текстовый анализ оптимизатора размещения оборудования (AI), AI-анализ различий в Сравнении растений, еженедельные отчёты Grow Coach и AI-генерация арта карточек. В каждом из них триггер — это нажатие кнопки действия: ваше устройство расшифровывает только те конкретные данные, которые нужны этому действию (например, выбранные вами фото или недавние записи растения — никогда весь дневник целиком), отправляет их один раз на сервер GrowScope, который пересылает их стороннему провайдеру модели (Anthropic Claude или, через OpenRouter, Google Gemini — выбирается автоматически по задаче, пользователь его не выбирает) для генерации этого одного ответа, и возвращает его. После этого ничего из этого запроса не записывается в таблицу базы данных или в лог на стороне GrowScope.
- Почему это не сделано на устройстве вместо этого: более раннее техническое задание требовало полностью локальную модель на устройстве (через WebLLM/MLC-LLM, квантованную модель на 1–3 млрд параметров, работающую в браузере) как единственный способ сделать AI-функции тоже zero-knowledge. Это было отклонено для GrowScope в его нынешнем виде: оптимизация дозы удобрений, анализ фото трихом/вредителей и разрешение сущностей нескольких растений — это как раз те задачи, в которых маленькие модели на устройстве слабее всего, а это платные функции с расходом кредитов (например, консультант по удобрениям стоит 45 кредитов за вызов), оценённые по цене качества уровня Claude/Gemini. Молча понизить их качество под лозунгом «zero-knowledge» было бы худшим исходом для пользователей, которые полагаются на это качество. Этот компромисс сделан осознанно и изложен здесь прямо, а не скрыт: для того единственного действия, которое вы явно запрашиваете, сторонний провайдер обрабатывает относящийся к нему открытый текст.
- Существующие (до релиза) аккаунты мигрируют лениво: шаг настройки запускается при следующем реальном открытии приложения владельцем этого аккаунта, а не через фоновую/пакетную задачу. Аккаунт, который больше никогда не открывают после этого релиза, просто остаётся в старом, незашифрованном формате хранения бессрочно — это принятый компромисс требования показать фразу восстановления реальному, присутствующему пользователю, а не сгенерировать её без присмотра.
Частые вопросы
Может ли GrowScope прочитать мой гроу-дневник?
Нет. Дневник шифруется на вашем устройстве до отправки, и сервер всегда хранит только зашифрованные байты плюс обёрнутую копию ключа шифрования, которая криптографически бесполезна без вашей фразы восстановления — которую GrowScope никогда не получает и не хранит.
Что произойдёт, если я потеряю фразу восстановления из 12 слов?
Если вы также потеряете все устройства, на которых ключ уже кэширован локально, данные этого дневника нельзя будет восстановить — ни вам, ни GrowScope. Это прямая цена того, что шифрование действительно zero-knowledge: на сервере нет ничего, способного восстановить ваш ключ, на что можно было бы опереться.
Это опционально, как переключатель в настройках, который можно включить или выключить?
Нет, уже нет. С сентября 2026 года зашифрован каждый аккаунт — новый и существующий; отказаться нельзя, и нельзя вернуть уже зашифрованный аккаунт к незашифрованному хранению.
Как это работает с AI-анализом фото или AI-советами по гроу, если сервер не может прочитать мои данные?
Только когда вы явно запускаете AI-действие (любую функцию, расходующую AI-кредиты — анализ фото, консультант по удобрениям, генерацию карточек и остальные): соответствующие данные расшифровываются на вашем устройстве, отправляются один раз на сервер GrowScope и пересылаются стороннему провайдеру модели (Anthropic Claude или, через OpenRouter, Google Gemini) для генерации этого одного ответа — а затем не сохраняются. Ничего не отправляется AI-провайдеру автоматически или в фоне, и никогда не больше данных, чем нужно этому конкретному действию.
Почему сам AI не работает на устройстве, чтобы тоже оставаться zero-knowledge?
Это было рассмотрено и отклонено: маленькая модель, полностью работающая в браузере (1–3 млрд параметров), не может сравниться по качеству с моделями уровня Claude/Gemini в задачах, которые реально выполняют AI-функции GrowScope — оптимизация дозы удобрений, анализ фото трихом/вредителей, разрешение сущностей нескольких растений, — а это платные функции с расходом кредитов, оценённые по цене этого качества. Вместо того чтобы молча понижать их качество, дизайн держит хранение и синхронизацию zero-knowledge всегда и прямо раскрывает, что AI-запрос на конкретное действие — единственное место, где открытый текст обрабатывается на сервере.