Защита и приватность
Где лежат заметки и от чего их защищает замок
«Черновик» — демо-концепт. Здесь описано без прикрас, что он делает с данными, что шифрует и где защита заканчивается.
демо · концепт
Где лежат данные
Заметки и история правок хранятся в 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.
Как всё удалить
В приложении: «Данные» → «Стереть все данные». Либо через настройки браузера: данные сайта → удалить. Сайт не хранит ничего на сервере, поэтому после этого следов не остаётся.