К содержимому

Защита и приватность

Где лежат заметки и от чего их защищает замок

«Черновик» — демо-концепт. Здесь описано без прикрас, что он делает с данными, что шифрует и где защита заканчивается.

демо · концепт

Где лежат данные

Заметки и история правок хранятся в IndexedDB вашего браузера, в базе scratch-notes. Это обычное локальное хранилище сайта: у сервера нет копии, у проекта нет бэкенда и аккаунтов.

  • Другой браузер или профиль не видит эти данные.
  • Очистка данных сайта в браузере удаляет заметки. Делайте копию через «Данные».
  • Приватное окно стирает всё при закрытии.
  • В localStorage лежит одна настройка: режим «Правка / Рядом / Просмотр».

Что уходит в сеть

Только загрузка самого сайта: HTML, стили, шрифты и скрипт приложения с этого же домена. Содержимое заметок, теги, поисковые запросы и пароли никуда не отправляются. Политика безопасности сайта (Content-Security-Policy) разрешает только свои ресурсы и запрещает встроенные скрипты, поэтому приложение даже технически не может обратиться к стороннему адресу. Аналитики и трекеров нет.

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

Как устроено шифрование

Шифрование включается для отдельной заметки. Используется стандартный WebCrypto браузера, своих шифров нет.

Параметры
ЧтоЗначение
Вывод ключаPBKDF2-HMAC-SHA-256, 600 000 итераций, соль 16 случайных байт на заметку
ШифрAES-256-GCM, случайный IV 96 бит на каждое сохранение
Привязкаидентификатор заметки входит в AAD: шифртекст нельзя подменить другой заметкой
Парольнормализуется (NFKC), не хранится нигде; ключ неизвлекаемый (extractable: false) и живёт только в памяти вкладки
Что шифруетсятекст заметки и все снимки её истории
Что не шифруетсятеги, даты, идентификатор, размер шифртекста, факт шифрования

Почему не Argon2: в WebCrypto его нет, а свой код для шифрования писать не нужно. Поэтому взят PBKDF2 с рекомендованным числом итераций. Против перебора на GPU он слабее Argon2, так что пароль должен быть длинным: лучше фраза из нескольких слов.

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

От чего защищает, а от чего нет

Защищает

  • Человека, который получил доступ к файлам браузера на выключенном или заблокированном компьютере.
  • Утечку резервной копии или экспорта: зашифрованные заметки там остаются шифртекстом.
  • Подмену и порчу шифртекста: GCM это обнаружит и откажется расшифровывать.

Не защищает

  • Вредоносное расширение браузера, кейлоггер или вирус на устройстве: пока заметка открыта, текст есть в памяти страницы.
  • Слабый или повторно использованный пароль.
  • Метаданные: теги и даты видны без пароля.
  • Забытый пароль: восстановить его невозможно, сброса нет.
  • Следы на диске: браузер может оставить старые версии данных в своих файлах до их перезаписи.

Безопасный просмотр Markdown

Текст заметки разбирает собственный парсер, после чего результат проходит санитайзер по списку разрешённых тегов и атрибутов. Сырой HTML в заметке выводится как текст. Ссылки только http, https, mailto и tel, с rel="noopener noreferrer nofollow ugc". Скрипты, стили, формы, SVG, обработчики событий и javascript:-адреса не проходят. Санитайзер проверяется корпусом из сотен XSS-векторов в автотестах.

Формат данных и копии

Резервная копия — JSON-файл с версией формата. Зашифрованные заметки в нём остаются зашифрованными.

{
  "format": "scratch-notes-backup",
  "version": 1,
  "exportedAt": "2026-10-30T12:00:00.000Z",
  "notes": [{
    "id": "uuid", "body": "# Текст", "tags": ["тег"], "pinned": false,
    "createdAt": 1790000000000, "updatedAt": 1790000000000,
    "versions": [{ "at": 1790000000000, "from": 1790000000000, "body": "..." }]
  }]
}

Зашифрованная заметка вместо body хранит блок enc: { v, kdf, iter, salt, iv, ct }, всё в base64. Экспорт в .zip кладёт обычные заметки как .md с front matter (теги, даты), а зашифрованные как .scratch-enc.json.

Как всё удалить

В приложении: «Данные» → «Стереть все данные». Либо через настройки браузера: данные сайта → удалить. Сайт не хранит ничего на сервере, поэтому после этого следов не остаётся.

Открыть приложение