Jerarquía de claves
El modelo criptográfico de Passwork se basa en una jerarquía de claves, donde cada nivel protege al siguiente.
Resumen de la jerarquía
Master password
↓ (PBKDF2)
User master key
↓ (AES-256-CBC)
Private RSA key
↓ (RSA-OAEP)
Vault key
↓ (AES-256-CBC)
Record key
↓ (AES-256-CBC)
├── Record data
└── Attachment keys
↓ (AES-256-CBC)
File contents
Esquema completo de claves
Nivel 0: Inicio de sesión del usuario
El usuario introduce la contraseña maestra. Se obtiene el salt (20 caracteres) del servidor. Se ejecuta PBKDF2 en el cliente (300.000 iteraciones, SHA-256).
Nivel 1: Clave maestra del usuario
El resultado de PBKDF2 es la clave maestra (512 bits). Se utiliza para dos propósitos:
- Calcular el hash SHA-256 para enviar al servidor (verificación de contraseña)
- Descifrar la clave privada RSA del usuario (AES-256-CBC)
Nivel 2: Claves RSA
La clave privada RSA (2048 bits) se almacena en el servidor en forma cifrada. La clave pública RSA se almacena en texto plano. La clave privada se utiliza para descifrar las claves de bóveda (RSA-OAEP).
Nivel 3: Clave de bóveda
La clave de bóveda (256 bits) se almacena como una copia separada para cada usuario con acceso. Cada copia se cifra con la clave pública RSA del usuario correspondiente.
Nivel 4: Clave de registro
La clave de registro (256 bits) se cifra con la clave de bóveda. Se utiliza para cifrar: campo de contraseña, campos personalizados, secreto TOTP, claves de archivos adjuntos.
Nivel 5: Claves de archivos adjuntos
Cada archivo tiene su propia clave de archivo adjunto (256 bits). La clave de archivo adjunto se cifra con la clave de registro. El contenido del archivo se cifra con la clave de archivo adjunto.
Rama alternativa (sección Bandeja de entrada)
Cuando un registro se transfiere directamente a un usuario (sin pasar por la bóveda), la clave de registro se cifra directamente con la clave pública RSA del destinatario.
Descripciones detalladas de claves
Nivel 0: Contraseña maestra
La contraseña maestra es un secreto conocido únicamente por el usuario.
| Parámetro | Valor |
|---|---|
| Longitud mínima | 12 caracteres |
| Almacenamiento | Nunca se almacena |
| Transmisión | Nunca se transmite al servidor |
| Uso | Se introduce en cada inicio de sesión (o se restaura desde localStorage) |
Nivel 1: Clave maestra del usuario
La clave maestra se deriva de la contraseña maestra utilizando PBKDF2.
| Parámetro | Valor |
|---|---|
| Algoritmo | PBKDF2 |
| Función hash | SHA-256 |
| Iteraciones | 300.000 |
| Longitud de clave | 512 bits |
| Salt | 20 caracteres, único por usuario |
| Alfabeto del salt | A-Z, a-z, 0-9, @, ! (64 caracteres) |
| Biblioteca | pbkdf2 (npm) |
Fórmula:
Master key = PBKDF2(master password, salt, 300000, 64, SHA-256)
Uso de la clave maestra:
- Descifrar la clave privada RSA del usuario (AES-256-CBC)
- Calcular el hash para la verificación del servidor (SHA-256)
Nivel 2: Claves RSA del usuario
Par de claves asimétricas para el intercambio seguro de claves simétricas.
| Parámetro | Valor |
|---|---|
| Algoritmo | RSA-OAEP |
| Longitud del módulo | 2048 bits |
| Exponente público | 65537 (0x010001) |
| Función hash | SHA-256 |
| Formato de almacenamiento | PEM (PKCS#8 para privada, SPKI para pública) |
| Biblioteca | WebCrypto API (crypto.subtle) |
Clave pública:
- Se almacena en el servidor en texto plano
- Se utiliza para cifrar las claves de bóveda al otorgar acceso
Clave privada:
- Se almacena en el servidor en forma cifrada
- Cifrada con la clave maestra del usuario (AES-256-CBC)
- Se descifra localmente tras introducir la contraseña maestra
Generación de claves RSA: La API WebCrypto genera el par de claves. La clave pública se envía inmediatamente al servidor. La clave privada se cifra con la clave maestra mediante AES-256-CBC y se envía al servidor en forma cifrada.
Nivel 3: Clave de bóveda
La clave de bóveda es una clave simétrica que protege todos los registros dentro de la bóveda.
| Parámetro | Valor |
|---|---|
| Tipo | Simétrica (AES-256-CBC) |
| Longitud | 100 caracteres |
| Alfabeto | A-Z, a-z, 0-9, @, ! (64 caracteres) |
| Entropía de entrada | ~596 bits |
| Clave efectiva | 256 bits (para AES-256) |
| Generación | En el cliente al crear la bóveda |
| Generador | crypto.getRandomValues() (CSPRNG del navegador) |
Transformación de clave: La cadena de 100 caracteres se convierte en una clave AES de 256 bits mediante una función de derivación de clave (KDF). Durante el cifrado, se genera un salt aleatorio de 64 bits que, junto con la clave original, se utiliza para derivar la clave final de 256 bits. El salt se guarda con el texto cifrado.
Almacenamiento: Se crea una copia separada de la clave de bóveda para cada usuario con acceso. Cada copia se cifra con la clave pública RSA del usuario correspondiente (RSA-OAEP). Todas las copias se almacenan en el servidor. Cada usuario solo puede descifrar su propia copia con su clave privada RSA.
Nivel 4: Clave de registro
La clave de registro es una clave única para cifrar el contenido de un registro. Se genera individualmente para cada registro.
| Parámetro | Valor |
|---|---|
| Tipo | Simétrica |
| Longitud | 100 caracteres |
| Alfabeto | A-Z, a-z, 0-9, @, ! (64 caracteres) |
| Entropía de entrada | ~596 bits |
| Clave efectiva | 256 bits (para AES-256) |
| Generación | En el cliente al crear el registro |
| Generador | crypto.getRandomValues() (CSPRNG del navegador) |
| Almacenamiento | Cifrada con la clave de bóveda (AES-256-CBC) |
Transformación de clave: La cadena de 100 caracteres se convierte en una clave AES de 256 bits mediante una función de derivación de clave (KDF). Durante el cifrado, se genera un salt aleatorio de 64 bits que, junto con la clave original, se utiliza para derivar la clave final de 256 bits. El salt se guarda con el texto cifrado.
- Unificación — formato único para todas las claves simétricas (bóveda, registro, archivo adjunto)
- Entropía redundante — 596 bits de entrada garantizan la máxima fortaleza de la clave de salida de 256 bits
- Preparación para el futuro — cambiar a claves más largas no requerirá modificar los generadores
- Protección contra colisiones — la probabilidad de colisión de claves es prácticamente nula
Lo que se cifra con la clave de registro (AES-256-CBC):
- Campo de contraseña
- Todos los campos personalizados (nombre, valor, tipo)
- Secreto TOTP
- Claves de archivos adjuntos
- Revisiones del registro (valores anteriores)
Vector de inicialización (IV): Se genera automáticamente un IV único de 128 bits para cada operación de cifrado. El IV se incluye en el resultado del cifrado.
Ruta alternativa (sección Bandeja de entrada): Cuando un registro se transfiere directamente a un usuario (sin acceso a la bóveda), la clave de registro se cifra con la clave pública RSA del destinatario.
Nivel 5: Clave de archivo adjunto
La clave de archivo adjunto es una clave única para cifrar un archivo.
| Parámetro | Valor |
|---|---|
| Tipo | Simétrica |
| Longitud | 100 caracteres |
| Alfabeto | A-Z, a-z, 0-9, @, ! (64 caracteres) |
| Entropía de entrada | ~596 bits |
| Clave efectiva | 256 bits (para AES-256) |
| Generación | En el cliente al cargar el archivo |
| Generador | crypto.getRandomValues() (CSPRNG del navegador) |
| Almacenamiento | Cifrada con la clave de registro (AES-256-CBC) |
Transformación de clave: Al igual que las claves de bóveda y registro, la cadena de 100 caracteres se convierte en una clave AES de 256 bits mediante KDF con un salt de 64 bits.
Proceso de cifrado del archivo:
- Se genera una clave de archivo adjunto aleatoria (256 bits)
- El archivo se cifra con esta clave (AES-256-CBC)
- La clave de archivo adjunto se cifra con la clave de registro
- Ambos objetos cifrados se envían al servidor
Cadena de descifrado
Secuencia de descifrado al acceder a un registro:
- El usuario introduce la contraseña maestra
- El cliente solicita el salt y los parámetros PBKDF2 al servidor
- El cliente calcula la clave maestra:
PBKDF2(password, salt, 300000, 64, SHA-256) - El cliente calcula el hash:
SHA-256(master key) - El cliente envía el hash al servidor para verificación
- El servidor verifica el hash y devuelve la clave privada RSA cifrada
- El cliente descifra la clave RSA con la clave maestra (AES-256-CBC)
- El cliente solicita los datos de la bóveda
- El servidor devuelve la clave de bóveda cifrada y los registros
- El cliente descifra la clave de bóveda con la clave privada RSA (WebCrypto RSA-OAEP)
- El cliente descifra la clave de registro con la clave de bóveda (AES-256-CBC)
- El cliente descifra los campos del registro con la clave de registro (AES-256-CBC)
- (Si es necesario) El cliente descifra la clave de archivo adjunto → descifra el archivo
Tabla de características de claves
| Clave | Algoritmo | Longitud | Entropía | Dónde se genera | Dónde se almacena |
|---|---|---|---|---|---|
| Contraseña maestra | — | ≥12 caracteres | Depende del usuario | Usuario | En ningún lugar |
| Salt PBKDF2 | — | 20 caracteres | ~120 bits | Servidor | Servidor (abierto) |
| Clave maestra | PBKDF2-SHA256 | 512 bits | 512 bits | Cliente | En ningún lugar (en memoria) |
| RSA pública | RSA-OAEP | 2048 bits | — | Cliente | Servidor (abierta) |
| RSA privada | RSA-OAEP | 2048 bits | — | Cliente | Servidor (cifrada) |
| Clave de bóveda | AES-256-CBC | 100 chars → 256 bits | ~596 bits entrada | Cliente | Servidor (cifrada con RSA) |
| Clave de registro | AES-256-CBC | 100 chars → 256 bits | ~596 bits entrada | Cliente | Servidor (cifrada) |
| Clave de archivo adjunto | AES-256-CBC | 100 chars → 256 bits | ~596 bits entrada | Cliente | Servidor (cifrada) |
| Clave del servidor | AES-256-CFB | 256 bits | 256 bits | Servidor | Archivo en el servidor |
Principios de seguridad de la jerarquía
Aislamiento de niveles
Comprometer una clave en un nivel no revela claves en otros niveles:
- La filtración de una clave de registro no revela otros registros
- La filtración de una clave de bóveda no revela registros en otras bóvedas
- La filtración de una clave privada RSA requiere conocer la clave maestra
Almacenamiento minimizado
- La contraseña maestra y la clave maestra no se almacenan permanentemente
- La clave privada RSA se almacena únicamente en forma cifrada
- Las claves de registro y archivo adjunto se almacenan únicamente en forma cifrada
Unicidad de claves
- Cada usuario tiene un par de claves RSA único
- Cada bóveda tiene una clave única
- Cada registro tiene una clave única
- Cada archivo adjunto tiene una clave única
Zero-Knowledge
El servidor almacena únicamente:
- Datos cifrados
- Claves cifradas
- Claves públicas
- Hashes para verificación (que no permiten recuperar el secreto)
El servidor no puede descifrar los datos del usuario.