Seguridad

Modelo de cifrado

Formato .rkvey v5: preámbulo, AEAD por compartimento, commits append-only e aislamiento de secretos.

El formato .rkvey v5 (Rust Key Vault) implementa un modelo de cifrado multicapa según las buenas prácticas HKDF y AEAD. El modelo mental: contraseña maestra → clave maestra → subclaves → compartimentos cifrados.

Cada entrada se divide en compartimentos (metadatos, secretos protegidos, manifiesto y archivos adjuntos), cada uno con su propia clave HKDF. Descifrar un compartimento no revela los demás.

Modelo de cifrado QubKey v5

Contraseña maestra

Entrada del usuario (UTF-8): nunca se almacena en texto sin formato

KDF

Argón2id

Sal

16 bytes (preámbulo)

Memoria

64 megas

Iteraciones

3

Paralelismo

4

Producción

256 bits

Llave maestra

256 bits · clave raíz de bóveda

HKDF-SHA256

información="hdr"

Tecla de encabezado

clave_encabezado

HKDF-SHA256

información="idx"

Clave de índice

clave_indice

HKDF-SHA256

info="compartimento"

Llave del compartimento

llave_compartimento

Por entrada (v5)

HKDF(master_key, salt=file∥entry_id, info=kind∥sub_id) → Clave de compartimento

Metadatos
Misterios
Att. manifiesto
AES-256-GCM

Compartimentos cifrados

Derivación de claves

La derivación transforma su contraseña maestra en claves criptográficas utilizables. Argon2id es intencionalmente intensivo en tiempo y memoria (~500 ms, 64 MB) para imponer límites de velocidad offline. En v5, cada compartimento de entrada recibe después su propia clave vía HKDF.

Entrada del usuario → contraseña maestra (UTF-8)

Argon2idmaster_key (256 bits) con salt aleatorio

HKDF-SHA256index_key para el B-Tree

HKDF-SHA256compartment_key por entrada y tipo de compartimento (metadatos, secretos, adjunto…)

ParámetroValorDescripciónPredeterminado
VariantArgon2idVariante híbrida recomendada por OWASP — resistente a GPU y ataques de canal lateral
Memory64 MBMemoria por derivación — aumenta el coste de hardware de ataques paralelos65536 KB
Iterations3Pasadas sobre la memoria — equilibrio seguridad/rendimiento (~500 ms)
Parallelism4Hilos paralelos
Output32 bytesLongitud de la clave derivada
Salt16 bytesSalt aleatorio en el preámbulo

Cifrado AEAD

AES-256-GCM (predeterminado)

  • Soporte hardware AES-NI en procesadores modernos
  • Nonce: 12 bytes, etiqueta de autenticación: 16 bytes
  • Límite teórico: ~64 GB de datos cifrados por clave

Cuándo elegirlo: equipos con aceleración hardware AES, uso diario.

Cifra predeterminada en la mayoría de plataformas para un rendimiento óptimo.

XChaCha20-Poly1305 (opcional)

  • Nonce ampliado: 24 bytes (probabilidad de colisión despreciable)
  • Sin dependencia de hardware — rendimiento constante en todas las CPU
  • Recomendado para claves de larga duración

Cuándo elegirlo: bóvedas archivadas, equipos sin AES-NI, preferencia por ChaCha20.

Activable en los ajustes avanzados de la bóveda.

Estructura del archivo

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)

Descripción de la estructura (v5):

  • preamble — magic bytes, versión del formato, salt Argon2id
  • header.enc — metadatos cifrados de la bóveda (nombre, fecha de creación, ajustes)
  • index/ — B-Tree cifrado para búsqueda O(log n) sin descifrar secretos
  • compartments/ — bloques AEAD por tipo: metadatos, secretos protegidos, manifiesto, adjuntos
  • append/ — región de commits: nuevos compartimentos + instantánea del índice + footer validado

Integridad y commits

Resiliencia

Los commits append-only garantizan la integridad ante interrupciones:

  1. Los nuevos compartimentos se añaden al final del archivo
  2. Se escribe una instantánea cifrada del índice
  3. Los datos se sincronizan con el disco (fsync)
  4. Un footer validado cierra el commit (punto de consistencia)

Escenario real: edita una entrada y se va la luz durante la escritura. Al reiniciar, QubKey encuentra el footer válido más reciente — sin pérdida de datos ni corrupción silenciosa. La compactación periódica reescribe un archivo limpio cuando hay demasiado espacio obsoleto.

Isolación por compartimento

Mediante HKDF-SHA256, cada compartimento obtiene su propio compartment_key, derivado de la clave maestra con el ID de entrada y el tipo de compartimento. Consecuencias prácticas:

  • Visualizar una entrada descifra solo los metadatos; los secretos permanecen enmascarados hasta la revelación explícita
  • Los adjuntos se cargan individualmente (descarga / vista previa), no al abrir la bóveda
  • El índice B-Tree utiliza su propio index_key, separado de los datos
  • Modificar un secreto no reescribe necesariamente los archivos adjuntos sin cambios

Esta aislamiento está implementada de forma nativa en el formato .rkvey v5.

Primitivas criptográficas

PrimitivaUsoBiblioteca
Argon2idContraseña → derivación de claveargon2 (RustCrypto)
HKDF-SHA256Clave → derivación de subclaveshkdf (RustCrypto)
AES-256-GCMCifrado AEADaes-gcm (RustCrypto)
XChaCha20-Poly1305Cifrado AEAD (alternativo)chacha20poly1305 (RustCrypto)
HMAC-SHA256Integridad del archivohmac (RustCrypto)
CSPRNGGeneración aleatoriagetrandom (SO)