Заметки без облака: 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
Post #2974
400