Bezpieczeństwo

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

KDF

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

Metadane
Tajniki
Att. oczywisty
AES-256-GCM

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)

Argon2idmaster_key (256 bitów) z losową solą

HKDF-SHA256index_key dla B-Tree

HKDF-SHA256compartment_key na wpis i typ kompartmentu (metadane, sekrety, załącznik…)

ParametrWartośćOpisDomyślnie
VariantArgon2idHybrydowy wariant zalecany przez OWASP — odporny na GPU i ataki kanałem pobocznym
Memory64 MBPamięć na wyprowadzenie — zwiększa koszt sprzętowy równoległych ataków65536 KB
Iterations3Przejścia przez pamięć — bezpieczeństwo/wydajność (~500 ms)
Parallelism4Równoległe wątki
Output32 bytesDługość wyprowadzonego klucza
Salt16 bytesLosowa 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

preamble
header.enc
btree_root.enc
btree_nodes.enc
core_meta.enc
protected_secrets.enc
attachment_manifest.enc
attachment_blob_*.enc
commit_N
footer (validated)

Opis struktury (v5):

  • preamble — Magic Bytes, wersja formatu, sól Argon2id
  • header.enc — zaszyfrowane metadane sejfu (nazwa, data utworzenia, ustawienia)
  • index/ — zaszyfrowany B-Tree do wyszukiwania O(log n) bez odszyfrowywania sekretów
  • compartments/ — bloki AEAD według typu: metadane, chronione sekrety, manifest, załączniki
  • append/ — region commitów: nowe kompartmenty + migawka indeksu + walidowany footer

Integralność i commity

Odporność

Commity append-only gwarantują integralność przy przerwaniu:

  1. Nowe kompartmenty są dołączane na końcu pliku
  2. Zapisywana jest zaszyfrowana migawka indeksu
  3. Dane są synchronizowane na dysk (fsync)
  4. 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

PrymitywZastosowanieBiblioteka
Argon2idHasło → wyprowadzenie kluczaargon2 (RustCrypto)
HKDF-SHA256Klucz → wyprowadzenie klucza podrzędnegohkdf (RustCrypto)
AES-256-GCMSzyfrowanie AEADaes-gcm (RustCrypto)
XChaCha20-Poly1305Szyfrowanie AEAD (alt)chacha20poly1305 (RustCrypto)
HMAC-SHA256Integralność plikuhmac (RustCrypto)
CSPRNGGenerowanie losowościgetrandom (OS)