Обзор системы SafePass
Границы доверия
- Процессы Flutter и браузерного расширения хранят мастер-пароль и открытый ключ сейфа только во время работы с разблокированным сейфом.
- Версионированные форматы конвертов определяет
crypto_core. Он использует переносимые реализации RustCrypto для Argon2id, HKDF-SHA-256, AES-256-GCM и Ed25519. Нативный C ABI и браузерные привязки WASM используют одно ядро. - API выдаёт короткоживущие JWT после регистрации или входа по OPAQUE. Он хранит зашифрованные ревизии и зашифрованный клиентом конверт восстановления ключа сейфа, привязанный к аккаунту. Состояния входа, сохраняемые между запросами, зашифрованы отдельным ключом сервера. API не расшифровывает записи и конверты восстановления.
- PostgreSQL и облачные резервные копии считаются недоверенными в отношении конфиденциальности сейфа.
- Native Messaging используется для необязательной интеграции с настольным приложением. Без него расширение работает с собственным кэшем и HTTPS API.
Пути передачи данных
Flutter / браузерное расширение
│ открытый текст остаётся в памяти разблокированного клиента
▼
crypto_core (вывод ключей и AES-GCM)
│ конверт и непрозрачные метаданные ревизии
▼
ASP.NET Core API ───── PostgreSQL
│
└── транзакции PostgreSQL сохраняют параллельные вершиныКаждое изменение создаёт новую ревизию. Хранилище PostgreSQL в API вызывает тот же валидатор переходов Rust sync_core, что и граф в памяти, через C ABI с ограничением размера входа и защитой от паник Rust. Rust и .NET используют общие тестовые векторы контракта. PostgreSQL отвечает за блокировки транзакций, хранение и курсоры аккаунта. Подтверждённая пользователем ревизия разрешения ссылается на все вершины, которые она закрывает. Предыдущие зашифрованные ревизии остаются в истории. HTTP-тесты используют детерминированное тестовое хранилище и интеграцию с PostgreSQL, включая параллельные запросы слияния.
Видимые метаданные
Сервис синхронизации видит идентификаторы аккаунтов, непрозрачные идентификаторы записей и ревизий, связи с родительскими ревизиями, время операций, размеры шифротекста, время запросов и сетевые метаданные. Названия, имена пользователей, пароли, заметки и URI шифруются внутри содержимого записи на клиенте. Хранилище не следует описывать как свободное от метаданных.
Граница развёртывания
В PostgreSQL API хранит зашифрованные ревизии, файлы верификаторов OPAQUE, короткоживущие зашифрованные состояния входа и хеши обновляемых токенов. В рабочем Compose-стеке публичный TLS завершается на Caddy, PostgreSQL находится во внутренней сети, а секреты API монтируются из защищённых файлов хоста. API использует ограниченную роль базы данных, миграции выполняются от отдельной роли.
Резервные копии PostgreSQL шифруются с помощью age до выхода из контейнера базы данных. Проверка восстановления загружает каждый архив во временную базу. Для запуска нужны исходный ключ подписи JWT, параметры сервера OPAQUE, ключ шифрования сессий OPAQUE, учётные данные ролей базы и конфигурация TLS. Семейство токенов каждого устройства можно отозвать отдельно, его максимальный срок жизни составляет 90 дней.