TGViewer
Flutter Pulse Flutter Pulse @flutterpulse · 1.01K subscribers
Post #2974 400
Заметки без облака: P2P, железное шифрование и режим «под принуждением» 🛡️

Проблема централизованных хранилищ знакома всем: пожар в дата-центре, бан по решению корпорации или утечка базы — и твои данные потеряны. Автор статьи решил это радикально: создал приложение для заметок, где нет ни единого центрального сервера ☁️❌

Архитектура построена на принципе Local-First: данные живут в JSON-файлах на твоих устройствах и синхронизируются напрямую (P2P). Самое необычное — это две полностью независимые кодовые базы: десктоп на Python/PySide6 и мобильная на Flutter/Kotlin. Они написаны отдельно, но строго совместимы «до байта» — проверяется кросс-тестами 🤝

🗂 Хранение и поиск
«Источником истины» — обычная папка с файлами. Перенос на новый телефон = копирование каталога или экспорт в ZIP. Поисковый индекс (FTS5 + rapidfuzz) — просто кэш, который перестраивается из файлов за секунды. Понимает опечатки и даты в запросе 🔍

🔗 Синхронизация (P2P, без облака)
Устройства находятся в LAN через mDNS, сопрягаются по QR-коду с одноразовым токеном. Связь — взаимный TLS с certificate pinning (как в Syncthing). Соединение держится открытым, изменения улетают мгновенно ⚡
Движок синка — журнал операций (op-log) + версионные вектора. Обмениваются только дельтами. Конфликты решаются просто: побеждает свежее изменение, а удаление имеет абсолютный приоритет над редактированием 🗑️

🔐 Шифрование: паранойя в хорошем смысле
Включается опционально, защищает 5-значным PIN. Но слабый PIN здесь — не проблема, благодаря железу:
1.  AES-256 на каждый файл. Путь к файлу вшит в AAD — переместил файл = расшифровать нельзя.
2.  PIN не расшифровывает данные. Он уходит в TPM / Android Keystore (TEE), где на неизвлекаемом ключе рождается секрет. Без конкретного чипа перебор невозможен 🔒
3.  Scrypt + экспоненциальные таймауты + автоуничтожение мастер-ключа после 5 неудач (счётчик защищён от сброса).
4.  Даже Root-доступ не достанет ключ из TEE.

🤫 Киллер-фича: Режим «под принуждением» (Duress Mode)
Вводишь PIN задом наперёд → происходит необратимое криптографическое стирание мастер-ключа. Данные становятся мусором. Приложение открывает правдоподобную «подложку» с пустыми заметками. Факта уничтожения не видно — плавный выход из-под давления 🎭

🧪 Тестирование: ИИ против ИИ
Код писался в паре с ИИ, а ломали его — рой независимых ИИ-агентов. Три раунда аудита. Каждая уязвимость закрывалась регрессионным тестом (проверяли: внезапное отключение питания, утечки, сброс брутфорса, расхождение состояний).
Главное — единая тестовая сетка для Python и Dart, гарантирующая, что десктоп и мобила никогда не расходятся в данных ✅

💻 Всё открыто под GPL-3.0. Есть демо-видео. Баланс между удобством (PIN, LAN-синк) и параноидальной безопасностью найден идеально ⚖️

Читать полную статью с деталями архитектуры и кода: здесь

FlutterPulse — канал о мире Flutter!

#flutter #dart #flutterpulse #flutterpulsehabr #security #p2p #encryption #localfirst
More from @flutterpulse
  1. Oct 1, 2026Обзор пакетов на тему Rich Text, Markdown & HTML Editor appflowy_editor 6.2.0 Высоконастра…
  2. Oct 1, 2026Обновлённые пакеты за последние 24 часа jnigen 1.0.1 Инструмент для вызова Java API из Dar…
  3. Oct 1, 2026photo post
  4. Sep 30, 2026Как теплотехник в 50 лет стер границу между КИПиА и IT: пишем универсальный Android‑SCADA…
  5. Sep 30, 2026Обновлённые пакеты за последние 24 часа Bones_API 1.17.0 Фреймворк для создания API-бэкенд…
  6. Sep 30, 2026photo post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →