Модель шифрования
Формат .rkvey v5: преамбула, AEAD на компартмент, append-only коммиты и изоляция секретов.
Формат .rkvey v5 (Rust Key Vault) реализует многоуровневую модель шифрования по best practices HKDF и AEAD. Ментальная модель: мастер-пароль → мастер-ключ → производные ключи → зашифрованные компартменты.
Каждая запись разделена на компартменты (метаданные, защищённые секреты, манифест и файлы вложений), каждый со своим ключом HKDF. Расшифрование одного компартмента не раскрывает остальные.
Модель шифрования QubKey v5
Мастер-пароль
Пользовательский ввод (UTF-8) — никогда не сохраняется в виде открытого текста.
Аргон2ид
Соль
16 байт (преамбула)
Память
64 МБ
Итерации
3
Параллелизм
4
Выход
256 бит
Мастер Ключ
256 бит · корневой ключ хранилища
ХКДФ-SHA256
информация="hdr"
Ключ заголовка
заголовок_ключ
ХКДФ-SHA256
информация="idx"
Индексный ключ
индексный_ключ
ХКДФ-SHA256
информация="отсек"
Ключ от отсека
ключ_отсека
За запись (v5)
HKDF(master_key, salt=file∥entry_id, info=kind∥sub_id) → Ключ отсека
Зашифрованные отсеки
Вывод ключа
Вывод преобразует мастер-пароль в пригодные криптографические ключи. Argon2id намеренно затратен по времени и памяти (~500 мс, 64 МБ), чтобы ограничить офлайн-атаки. В v5 каждый компартмент записи затем получает свой ключ через HKDF.
Ввод пользователя → мастер-пароль (UTF-8)
Argon2id → master_key (256 бит) со случайной солью
HKDF-SHA256 → index_key для B-Tree
HKDF-SHA256 → compartment_key на запись и тип компартмента (метаданные, секреты, вложение…)
| Параметр | Значение | Описание | По умолчанию |
|---|---|---|---|
Variant | Argon2id | Гибридный вариант, рекомендованный OWASP — устойчив к GPU и атакам по побочным каналам | — |
Memory | 64 MB | Память на вывод — повышает аппаратные затраты параллельных атак | 65536 KB |
Iterations | 3 | Проходы по памяти — безопасность/производительность (~500 мс) | — |
Parallelism | 4 | Параллельные потоки | — |
Output | 32 bytes | Длина выведенного ключа | — |
Salt | 16 bytes | Случайная соль в преамбуле | — |
AEAD-шифрование
AES-256-GCM (по умолчанию)
- Аппаратная поддержка AES-NI на современных процессорах
- Nonce: 12 байт, тег аутентификации: 16 байт
- Теоретический предел: ~64 ГБ зашифрованных данных на ключ
Когда выбирать: машины с аппаратным ускорением AES, ежедневное использование.
Шифр по умолчанию на большинстве платформ для оптимальной производительности.
XChaCha20-Poly1305 (опционально)
- Расширенный nonce: 24 байта (пренебрежимо мала вероятность коллизий)
- Нет зависимости от железа — стабильная производительность на всех CPU
- Рекомендуется для долгоживущих ключей
Когда выбирать: архивные хранилища, машины без AES-NI, предпочтение ChaCha20.
Включается в расширенных настройках хранилища.
Структура файла
Описание структуры (v5):
preamble— Magic Bytes, версия формата, соль Argon2idheader.enc— зашифрованные метаданные хранилища (имя, дата создания, настройки)index/— зашифрованный B-Tree для поиска O(log n) без расшифрования секретовcompartments/— AEAD-блоки по типу: метаданные, защищённые секреты, манифест, вложенияappend/— регион коммитов: новые компартменты + снимок индекса + проверенный footer
Целостность и коммиты
Устойчивость
Append-only коммиты гарантируют целостность при прерывании:
- Новые компартменты добавляются в конец файла
- Записывается зашифрованный снимок индекса
- Данные синхронизируются на диск (fsync)
- Проверенный footer завершает коммит (точка согласованности)
Реальный сценарий: вы редактируете запись и питание отключается во время записи. При перезапуске QubKey находит последний действительный footer — без потери данных, без тихой порчи. Периодическая компактификация записывает чистый файл, когда накапливается слишком много устаревших данных.
Изоляция на компартмент
Через HKDF-SHA256 каждый компартмент получает свой compartment_key, выведенный из мастер-ключа с ID записи и типом компартмента. Практические последствия:
- Просмотр записи расшифровывает только метаданные; секреты остаются скрытыми до явного раскрытия
- Вложения загружаются по отдельности (загрузка / предпросмотр), не при открытии хранилища
- Индекс B-Tree использует свой
index_key, отдельный от данных - Изменение секрета не обязательно перезаписывает неизменённые файлы вложений
Эта изоляция нативно реализована в формате .rkvey v5.
Криптографические примитивы
| Примитив | Использование | Библиотека |
|---|---|---|
| Argon2id | Пароль → вывод ключа | argon2 (RustCrypto) |
| HKDF-SHA256 | Ключ → вывод производного ключа | hkdf (RustCrypto) |
| AES-256-GCM | AEAD-шифрование | aes-gcm (RustCrypto) |
| XChaCha20-Poly1305 | AEAD-шифрование (alt) | chacha20poly1305 (RustCrypto) |
| HMAC-SHA256 | Целостность файла | hmac (RustCrypto) |
| CSPRNG | Генерация случайности | getrandom (OS) |