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
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
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)
Argon2id → master_key (256 bits) con salt aleatorio
HKDF-SHA256 → index_key para el B-Tree
HKDF-SHA256 → compartment_key por entrada y tipo de compartimento (metadatos, secretos, adjunto…)
| Parámetro | Valor | Descripción | Predeterminado |
|---|---|---|---|
Variant | Argon2id | Variante híbrida recomendada por OWASP — resistente a GPU y ataques de canal lateral | — |
Memory | 64 MB | Memoria por derivación — aumenta el coste de hardware de ataques paralelos | 65536 KB |
Iterations | 3 | Pasadas sobre la memoria — equilibrio seguridad/rendimiento (~500 ms) | — |
Parallelism | 4 | Hilos paralelos | — |
Output | 32 bytes | Longitud de la clave derivada | — |
Salt | 16 bytes | Salt 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
Descripción de la estructura (v5):
preamble— magic bytes, versión del formato, salt Argon2idheader.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 secretoscompartments/— bloques AEAD por tipo: metadatos, secretos protegidos, manifiesto, adjuntosappend/— 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:
- Los nuevos compartimentos se añaden al final del archivo
- Se escribe una instantánea cifrada del índice
- Los datos se sincronizan con el disco (fsync)
- 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
| Primitiva | Uso | Biblioteca |
|---|---|---|
| Argon2id | Contraseña → derivación de clave | argon2 (RustCrypto) |
| HKDF-SHA256 | Clave → derivación de subclaves | hkdf (RustCrypto) |
| AES-256-GCM | Cifrado AEAD | aes-gcm (RustCrypto) |
| XChaCha20-Poly1305 | Cifrado AEAD (alternativo) | chacha20poly1305 (RustCrypto) |
| HMAC-SHA256 | Integridad del archivo | hmac (RustCrypto) |
| CSPRNG | Generación aleatoria | getrandom (SO) |