Model szyfrowania
Format .rkvey v5: preambuła, AEAD na kompartment, commity append-only i izolacja sekretów.
Format .rkvey v5 (Rust Key Vault) implementuje wielowarstwowy model szyfrowania zgodny z najlepszymi praktykami HKDF i AEAD. Model mentalny: hasło główne → klucz główny → klucze podrzędne → zaszyfrowane kompartmenty.
Każdy wpis jest podzielony na kompartmenty (metadane, chronione sekrety, manifest i pliki załączników), każdy z własnym kluczem HKDF. Odszyfrowanie jednego kompartmentu nie ujawnia pozostałych.
Model szyfrowania QubKey v5
Hasło główne
Dane wprowadzone przez użytkownika (UTF-8) — nigdy nie są przechowywane w postaci zwykłego tekstu
Argon2id
Sól
16 bajtów (preambuła)
Pamięć
64 MB
Iteracje
3
Równoległość
4
Wyjście
256 bitów
Klucz główny
256 bitów · Klucz główny skarbca
HKDF-SHA256
informacja="hdr"
Klucz nagłówka
klucz_nagłówka
HKDF-SHA256
informacja="idx"
Klucz indeksu
klucz_indeksu
HKDF-SHA256
informacja="przedział"
Klucz do przedziału
klucz_przedziału
Na wpis (v5)
HKDF(klucz_główny, sól=file∥entry_id, info=kind∥sub_id) → Klucz przedziału
Zaszyfrowane przegródki
Wyprowadzenie klucza
Wyprowadzenie przekształca hasło główne w użyteczne klucze kryptograficzne. Argon2id jest celowo czasochłonny i pamięciochłonny (~500 ms, 64 MB), aby wymusić limity offline. W v5 każdy kompartment wpisu otrzymuje następnie własny klucz przez HKDF.
Dane wejściowe użytkownika → hasło główne (UTF-8)
Argon2id → master_key (256 bitów) z losową solą
HKDF-SHA256 → index_key dla B-Tree
HKDF-SHA256 → compartment_key na wpis i typ kompartmentu (metadane, sekrety, załącznik…)
| Parametr | Wartość | Opis | Domyślnie |
|---|---|---|---|
Variant | Argon2id | Hybrydowy wariant zalecany przez OWASP — odporny na GPU i ataki kanałem pobocznym | — |
Memory | 64 MB | Pamięć na wyprowadzenie — zwiększa koszt sprzętowy równoległych ataków | 65536 KB |
Iterations | 3 | Przejścia przez pamięć — bezpieczeństwo/wydajność (~500 ms) | — |
Parallelism | 4 | Równoległe wątki | — |
Output | 32 bytes | Długość wyprowadzonego klucza | — |
Salt | 16 bytes | Losowa sól w preambule | — |
Szyfrowanie AEAD
AES-256-GCM (domyślny)
- Wsparcie sprzętowe AES-NI na nowoczesnych procesorach
- Nonce: 12 bajtów, tag uwierzytelniania: 16 bajtów
- Teoretyczny limit: ~64 GB zaszyfrowanych danych na klucz
Kiedy wybrać: maszyny z akceleracją sprzętową AES, codzienne użycie.
Domyślny szyfr na większości platform dla optymalnej wydajności.
XChaCha20-Poly1305 (opcjonalny)
- Rozszerzony nonce: 24 bajty (pomijalne prawdopodobieństwo kolizji)
- Brak zależności od sprzętu — stała wydajność na wszystkich CPU
- Zalecany dla długowiecznych kluczy
Kiedy wybrać: zarchiwizowane sejfy, maszyny bez AES-NI, preferencja ChaCha20.
Włączalny w zaawansowanych ustawieniach sejfu.
Struktura pliku
Opis struktury (v5):
preamble— Magic Bytes, wersja formatu, sól Argon2idheader.enc— zaszyfrowane metadane sejfu (nazwa, data utworzenia, ustawienia)index/— zaszyfrowany B-Tree do wyszukiwania O(log n) bez odszyfrowywania sekretówcompartments/— bloki AEAD według typu: metadane, chronione sekrety, manifest, załącznikiappend/— region commitów: nowe kompartmenty + migawka indeksu + walidowany footer
Integralność i commity
Odporność
Commity append-only gwarantują integralność przy przerwaniu:
- Nowe kompartmenty są dołączane na końcu pliku
- Zapisywana jest zaszyfrowana migawka indeksu
- Dane są synchronizowane na dysk (fsync)
- Walidowany footer zamyka commit (punkt spójności)
Realistyczny scenariusz: edytujesz wpis i zasilanie pada podczas zapisu. Po ponownym uruchomieniu QubKey znajduje najnowszy ważny footer — bez utraty danych, bez cichej korupcji. Okresowa kompaktacja zapisuje czysty plik, gdy zbyt dużo miejsca zajmuje nieaktualna zawartość.
Izolacja na kompartment
Przez HKDF-SHA256 każdy kompartment otrzymuje własny compartment_key, wyprowadzony z klucza głównego z ID wpisu i typem kompartmentu. Praktyczne konsekwencje:
- Wyświetlenie wpisu odszyfrowuje tylko metadane; sekrety pozostają zamaskowane do jawnego ujawnienia
- Załączniki są ładowane indywidualnie (pobranie / podgląd), nie przy otwieraniu sejfu
- Indeks B-Tree używa własnego
index_key, oddzielonego od danych - Zmiana sekretu nie wymusza ponownego zapisu niezmienionych plików załączników
Ta izolacja jest natywnie zaimplementowana w formacie .rkvey v5.
Prymitywy kryptograficzne
| Prymityw | Zastosowanie | Biblioteka |
|---|---|---|
| Argon2id | Hasło → wyprowadzenie klucza | argon2 (RustCrypto) |
| HKDF-SHA256 | Klucz → wyprowadzenie klucza podrzędnego | hkdf (RustCrypto) |
| AES-256-GCM | Szyfrowanie AEAD | aes-gcm (RustCrypto) |
| XChaCha20-Poly1305 | Szyfrowanie AEAD (alt) | chacha20poly1305 (RustCrypto) |
| HMAC-SHA256 | Integralność pliku | hmac (RustCrypto) |
| CSPRNG | Generowanie losowości | getrandom (OS) |