Перейти к содержимому

Блог

Сквозное шифрование заметок: как оно устроено в FixNote

Фраза из 12 слов, свой ключ на каждую версию заметки и сервер, который хранит только шифр: что видит сервер FixNote и что будет, если потерять фразу.

Владимир, сооснователь FixNote · Опубликовано · Обновлено · 4 мин

Заметки хранят то, что не хочется показывать посторонним: планы, деньги, здоровье, черновики писем. Можно ли синхронизировать их через облако так, чтобы их не прочитал даже сервис? В FixNote заметка шифруется на вашем устройстве, а сервер получает только то, что прочитать не может. Ниже по шагам: откуда берутся ключи, как шифруется заметка, что всё же видит сервер и что делать, если потерять фразу восстановления.

Что такое сквозное шифрование заметок

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

В FixNote это касается синхронизации. Без аккаунта заметки вообще не покидают устройство. Синхронизация между устройствами входит в подписку Pro; на бесплатном плане с аккаунтом она только скачивает.

Всё начинается с 12 слов

Когда вы создаёте аккаунт, приложение генерирует 16 случайных байт (128 бит) и показывает их как фразу из 12 английских слов по стандарту BIP39. Слова легко записать на бумагу, а последнее слово содержит контрольную сумму, поэтому опечатку при вводе приложение заметит сразу. После показа FixNote просит ввести несколько слов по их номерам, чтобы убедиться, что фраза записана.

Из этого секрета на устройстве выводятся остальные ключи: для заметок, для названий папок, для проверки фразы, для ссылок и пара ключей для входящих данных. Ни фраза, ни ключи на сервер не уходят. В приложении для компьютера секрет хранится в системном хранилище паролей (Диспетчер учётных данных Windows, Связка ключей macOS). В браузере он лежит в хранилище браузера, зашифрованный ключом, который скрипты могут использовать, но не могут прочитать.

Подробнее о самой фразе рассказано в статье про фразу восстановления.

Как шифруется заметка

Каждый раз, когда заметка уходит на сервер, FixNote шифрует её новым случайным ключом алгоритмом XChaCha20-Poly1305 из библиотеки libsodium. Этот шифр проверяет целостность: если изменить в шифре хотя бы один байт, расшифровка не пройдёт.

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

Названия папок шифруются отдельным ключом. Картинки и файлы шифруются каждый своим ключом и лежат в хранилище тоже только в виде шифра.

Что видит сервер

Сервер нужен для синхронизации, и кое-что ему всё же видно. О ваших заметках и папках он знает следующее:

  • Сервер хранит шифр каждой заметки и её зашифрованный ключ.
  • Он видит идентификаторы заметок и папок и то, какая папка вложена в какую.
  • Он знает время создания и изменения, номер версии и отметки удаления и закрепления.
  • Он видит, обычная это заметка или заметка дня, и дату заметки дня.
  • Он знает ваш email, чтобы присылать код для входа, и размер зашифрованных файлов.

Текста заметок, заголовков, названий папок и содержимого картинок в открытом виде на сервере нет. Если базу украдут, злоумышленник получит набор случайных на вид байт.

Как подключить новое устройство

На новом устройстве войдите по коду из письма. Дальше есть два пути: ввести 12 слов или выбрать «Подтвердить на другом устройстве». Во втором случае на устройстве, где вы уже вошли, появится запрос «Новое устройство просит доступ к заметкам» с шестизначным кодом. Тот же код показывает новое устройство. Если коды совпали, нажмите «Разрешить»: старое устройство зашифрует секрет одноразовым ключом нового, и прочитать его сможет только оно. Если коды разные, кто-то подменил ключ по дороге, и запрос нужно отклонить.

Общие заметки, ссылки и Telegram

У общей заметки (Pro) свой ключ, и он запечатан отдельно для каждого участника его публичным ключом. Правки в реальном времени между участниками тоже идут зашифрованными. У публичной ссылки на заметку ключ стоит в адресе после знака #, а эту часть адреса браузер на сервер не отправляет.

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

Что уходит модели, когда вы спрашиваете ассистента

Поиск по заметкам, включая поиск по смыслу, работает на устройстве. Модели уходят ваш вопрос и фрагменты, найденные для него, а также заметки, которые ассистент прочитает по ходу ответа. Всю базу целиком модель не получает. Если не хочется отправлять наружу даже это, подключите свой ключ OpenAI-совместимого провайдера или Ollama в приложении для компьютера. В режиме «Только на этом устройстве» FixNote не обращается к нашему серверу вообще: нет синхронизации, Telegram, общих заметок и FixNote AI.

Что будет, если потерять фразу

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

Поэтому сделайте это сегодня: откройте Настройки → «Аккаунт и синхронизация», нажмите «Показать фразу восстановления», введите код из письма и перепишите 12 слов на бумагу. Храните её там же, где важные документы. Остальные подробности собраны на страницах Шифрование и Безопасность.

Вопросы

Может ли FixNote прочитать мои заметки?
Нет. Сервер хранит только шифр, а ключи есть лишь на ваших устройствах. Фрагменты заметок получает модель, и только когда вы задаёте вопрос ассистенту.
Что будет, если я потеряю фразу восстановления?
На устройствах, где вы уже вошли, заметки останутся, и там фразу можно показать снова после кода из письма. Если потеряны и фраза, и все устройства, заметки не восстановит никто.
Какой алгоритм шифрования использует FixNote?
XChaCha20-Poly1305 из библиотеки libsodium. Ключи выводятся на устройстве из случайного секрета в 128 бит, который записан фразой из 12 слов по стандарту BIP39.
Нужно ли шифрование, если я не пользуюсь синхронизацией?
Без аккаунта заметки вообще не покидают устройство. Шифрование включается, когда вы входите в аккаунт и заметки начинают синхронизироваться.

Эта статья на других языках: English · Español

Попробуйте FixNote

Бесплатно и без аккаунта: Windows, macOS и браузер.

Ещё статьи