15 KiB
Product Requirements Document (PRD): Кроссплатформенный Менеджер Паролей
1. Обзор продукта
Локальный, строго типизированный кроссплатформенный менеджер паролей с поддержкой многопользовательского режима, надежным шифрованием данных "в покое" (data-at-rest) и подготовленной архитектурой для будущей облачной синхронизации и интеграции с браузерными расширениями.
Технологический стек:
- Backend / Ядро: Rust (Tauri) — отвечает за криптографию, работу с ФС, БД и системными API (биометрия).
- Frontend: Angular (TypeScript) — отвечает за UI, строгую ООП-архитектуру, управление состояниями и валидацию.
- База данных: SQLite (через Rust).
2. Архитектура безопасности и хранения данных
Безопасность строится на принципе нулевого доверия к окружению (Zero Trust Local Storage). Даже при полной компрометации устройства (кража диска или копирование файла БД), злоумышленник не должен получить доступ к данным без знания Мастер-пароля.
2.1. Криптографическая схема
- Деривация ключа (Key Derivation): Мастер-пароль пользователя никогда не хранится в явном виде. При вводе он пропускается через функцию Argon2id (устойчивую к атакам на GPU/ASIC) вместе со случайной солью. Результатом является Ключ Шифрования Данных (Data Encryption Key - DEK).
- Шифрование полезной нагрузки: Для шифрования самих паролей и заметок используется алгоритм XChaCha20-Poly1305 (AEAD — Authenticated Encryption with Associated Data). Он быстрее и безопаснее стандартного AES на программном уровне и проверяет целостность данных.
- Что шифруется: Логины, пароли, заметки и привязанные почты шифруются. Метаданные (UUID записи, дата создания) можно оставить открытыми для упрощения синхронизации в будущем.
2.2. База данных (SQLite) и многопользовательский режим
- Каждый пользователь имеет свой отдельный файл базы данных (например,
vault_<user_uuid>.sqlite). Это изолирует данные пользователей друг от друга и радикально упрощает будущую синхронизацию (не нужно фильтровать чужие записи). - Схема таблицы
accounts(задел под синхронизацию):id(TEXT, UUIDv4) — Первичный ключ.service_name(TEXT) — Название сервиса.encrypted_data(BLOB) — Зашифрованный JSON с логином, паролем, ссылкой и тегами.nonce(BLOB) — Уникальный вектор инициализации для расшифровки XChaCha20.updated_at(INTEGER) — Unix timestamp последнего изменения. Критично для будущей синхронизации (разрешение конфликтов LWW - Last Write Wins).is_deleted(BOOLEAN) — Soft-delete (мягкое удаление). При удалении запись не стирается, а помечается удаленной, чтобы при будущей синхронизации другие устройства узнали об удалении.
2.3. Биометрия (Touch ID / Windows Hello)
- Логика работы: При успешном вводе Мастер-пароля, полученный ключ DEK шифруется средствами операционной системы (через системный Keyring/Связку ключей/Windows Credential Manager) и сохраняется там.
- При следующем входе приложение запрашивает биометрическую аутентификацию через системный API (в Rust для этого используются крейты
keyringили платформозависимые вызовы). При успехе ОС отдает приложению DEK, и база расшифровывается без ввода пароля.
3. Frontend Архитектура (Angular + OOP)
Код должен быть максимально модульным, тестируемым и следовать принципам SOLID.
3.1. Основные слои (Dependency Injection)
- Domain Models (Модели данных): Классы
Account,UserVault,Tag. Модели не содержат бизнес-логики, только структуру и методы-геттеры/сеттеры. - Services (Бизнес-логика):
TauriIpcService: Абстракция надwindow.__TAURI__.invoke. Реализует паттерн Adapter, изолируя Angular от специфики Tauri.CryptoStrategyService: Реализует паттерн Strategy для выбора метода авторизации (Мастер-пароль или Биометрия).VaultService: Управляет состоянием расшифрованных паролей в оперативной памяти (в виде RxJSBehaviorSubject). При блокировке приложения этот сервис немедленно очищает данные из памяти.
- Components (UI): Разделены на "Умные" (Smart/Container) — общаются с сервисами, и "Глупые" (Dumb/Presentational) — только отображают данные (кнопки, формы ввода, карточки паролей).
3.2. Паттерны проектирования в UI
- Observer (через RxJS): Компоненты подписываются на изменения в
VaultService. Если в фоновом режиме (или через окно быстрого добавления) добавился пароль, список в главном окне обновляется реактивно. - Visitor: Для будущей реализации экспорта (в CSV, JSON). Класс
Accountпринимает "посетителя"CsvExportVisitor, который знает, как правильно отформатировать поля аккаунта для выгрузки, не нарушая инкапсуляцию самого аккаунта.
4. Подготовка к будущим фичам (Future-Proofing)
4.1. Задел для облачной синхронизации
Так как на старте используется локальный SQLite с полями updated_at и is_deleted (Soft-delete), в будущем реализация синхронизации сведется к написанию фонового процесса (в Rust), который будет:
- Запрашивать у сервера все записи с
updated_atбольше, чем время последней синхронизации. - Отправлять на сервер локальные записи, которые изменились с момента последней синхронизации.
- Сервер (когда он появится) будет просто передавать зашифрованные BLOB-ы (E2E шифрование), ничего не зная о содержимом.
4.2. Задел для браузерного расширения
Чтобы расширение могло общаться с десктопным приложением (забирать пароли и сохранять новые), приложение на Tauri должно выступать в роли сервера.
- Архитектурное решение: В ядре Rust поднимается легковесный локальный WebSocket-сервер или используется механизм Native Messaging (стандарт для Chrome/Firefox).
- Все запросы от браузера проверяются на подлинность (расширение и десктопное приложение обмениваются криптографическими токенами при первичном сопряжении). На текущем этапе (MVP) этот сервер не реализуется, но API-функции для получения конкретного пароля по URL сайта на стороне Rust проектируются заранее, чтобы их можно было легко обернуть в сетевой интерфейс позже.
5. Требования к UI / UX
- Горячие клавиши (Global Shortcuts): Окно "быстрого добавления/поиска" (Spotlight-like) вызывается системным шорткатом (например,
Cmd/Ctrl + Shift + Space). Работает глобально, даже если главное окно закрыто. Реализуется черезtauri-plugin-global-shortcut. - Генератор паролей: Интегрирован прямо в форму создания аккаунта. При фокусе на поле "Пароль" предлагается сгенерированная строка. Сложность (длина, спецсимволы) настраивается в параметрах.
- Автоматическая блокировка: По таймеру бездействия (настраивается пользователем, например, 5 минут) или при блокировке операционной системы приложение уничтожает расшифрованные данные из памяти Angular и требует повторного сканирования биометрии или ввода пароля.
6. Структура проекта (Репозиторий и src-файлы)
Проект строится по принципу монорепозитория, разделенного на два изолированных контекста: системный бэкенд (Tauri/Rust) и фронтенд-интерфейс (Angular).
6.1. Backend: Ядро на Rust (/src-tauri/src/)
Структура следует принципам чистого кода, жестко отделяя инфраструктуру Tauri от чистой бизнес-логики и работы с базой данных.
main.rs— Точка входа. Регистрация плагинов, глобальных шорткатов, инициализация БД и запуск Tauri-приложения.commands/— Обработчики вызовов от фронтенда (Tauri IPC Commands). Здесь функции получают аргументы от UI и делегируют работу ядру.auth.rs(апи для авторизации и сканирования биометрии)vault.rs(сохранение и получение записей)
core/— Изолированная бизнес-логика, которая ничего не знает про Tauri (максимально тестируемый код).crypto.rs(реализация шифрования XChaCha20-Poly1305 и деривации ключей Argon2id)password_gen.rs(генератор надежных паролей)
database/— Слой абстракции над SQLite.schema.sql(миграции базы данных)models.rs(структуры данных Rust для маппинга таблиц БД)repository.rs(SQL-запросы и транзакции)
events/— Система Push-событий (Event-Driven Architecture).emitter.rs(отправка событийsystem-locked,vault-updatedво фронтенд).
6.2. Frontend: Angular App (/src/)
Используется современный подход с Angular Standalone-компонентами (без лишнего бойлерплейта в виде NgModules). Структура директорий базируется на Domain-Driven Design (DDD) для строгого соблюдения принципов ООП.
main.ts— Точка входа фреймворка Angular.app/— Корневая директория логики UI.core/— Базовая инфраструктура и Сервисы-синглтоны (существуют в единственном экземпляре).services/tauri-event-bus.service.ts(RxJS-адаптер, слушающий события от Rust)services/crypto-strategy.service.ts(паттерн Strategy для авторизации)services/vault.service.ts(хранение расшифрованного стейта в оперативной памяти)
models/— Глобальные TypeScript-интерфейсы и ООП-классы Моделей.account.model.ts(включая методы для валидации и приема паттерна Visitor)user.model.ts
shared/— «Глупые» (Dumb/Presentational) компоненты и UI-кит. Они не содержат бизнес-логики, только принимают данные и отдают события кликов.components/account-card/(карточка аккаунта)components/password-input/(компонент поля ввода с индикатором надежности)
features/— «Умные» (Smart) компоненты, разделенные по бизнес-доменам приложения.auth/(экраны ввода мастер-пароля и биометрии)main-window/(весь интерфейс главного окна со списком паролей и настройками)spotlight/(изолированное окно быстрого добавления/поиска, вызываемое горячими клавишами)
styles/— Глобальные стили, Tailwind конфигурации и CSS-переменные темы.assets/— Статические файлы (локальные шрифты, иконки).