Saltar al contenido principal

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:

  1. Calcular el hash SHA-256 para enviar al servidor (verificación de contraseña)
  2. 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ámetroValor
Longitud mínima12 caracteres
AlmacenamientoNunca se almacena
TransmisiónNunca se transmite al servidor
UsoSe 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ámetroValor
AlgoritmoPBKDF2
Función hashSHA-256
Iteraciones300.000
Longitud de clave512 bits
Salt20 caracteres, único por usuario
Alfabeto del saltA-Z, a-z, 0-9, @, ! (64 caracteres)
Bibliotecapbkdf2 (npm)

Fórmula:

Master key = PBKDF2(master password, salt, 300000, 64, SHA-256)

Uso de la clave maestra:

  1. Descifrar la clave privada RSA del usuario (AES-256-CBC)
  2. 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ámetroValor
AlgoritmoRSA-OAEP
Longitud del módulo2048 bits
Exponente público65537 (0x010001)
Función hashSHA-256
Formato de almacenamientoPEM (PKCS#8 para privada, SPKI para pública)
BibliotecaWebCrypto 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ámetroValor
TipoSimétrica (AES-256-CBC)
Longitud100 caracteres
AlfabetoA-Z, a-z, 0-9, @, ! (64 caracteres)
Entropía de entrada~596 bits
Clave efectiva256 bits (para AES-256)
GeneraciónEn el cliente al crear la bóveda
Generadorcrypto.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ámetroValor
TipoSimétrica
Longitud100 caracteres
AlfabetoA-Z, a-z, 0-9, @, ! (64 caracteres)
Entropía de entrada~596 bits
Clave efectiva256 bits (para AES-256)
GeneraciónEn el cliente al crear el registro
Generadorcrypto.getRandomValues() (CSPRNG del navegador)
AlmacenamientoCifrada 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.

¿Por qué 100 caracteres en lugar de 256 bits directamente?
  • 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ámetroValor
TipoSimétrica
Longitud100 caracteres
AlfabetoA-Z, a-z, 0-9, @, ! (64 caracteres)
Entropía de entrada~596 bits
Clave efectiva256 bits (para AES-256)
GeneraciónEn el cliente al cargar el archivo
Generadorcrypto.getRandomValues() (CSPRNG del navegador)
AlmacenamientoCifrada 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:

  1. Se genera una clave de archivo adjunto aleatoria (256 bits)
  2. El archivo se cifra con esta clave (AES-256-CBC)
  3. La clave de archivo adjunto se cifra con la clave de registro
  4. Ambos objetos cifrados se envían al servidor

Cadena de descifrado

Secuencia de descifrado al acceder a un registro:

  1. El usuario introduce la contraseña maestra
  2. El cliente solicita el salt y los parámetros PBKDF2 al servidor
  3. El cliente calcula la clave maestra: PBKDF2(password, salt, 300000, 64, SHA-256)
  4. El cliente calcula el hash: SHA-256(master key)
  5. El cliente envía el hash al servidor para verificación
  6. El servidor verifica el hash y devuelve la clave privada RSA cifrada
  7. El cliente descifra la clave RSA con la clave maestra (AES-256-CBC)
  8. El cliente solicita los datos de la bóveda
  9. El servidor devuelve la clave de bóveda cifrada y los registros
  10. El cliente descifra la clave de bóveda con la clave privada RSA (WebCrypto RSA-OAEP)
  11. El cliente descifra la clave de registro con la clave de bóveda (AES-256-CBC)
  12. El cliente descifra los campos del registro con la clave de registro (AES-256-CBC)
  13. (Si es necesario) El cliente descifra la clave de archivo adjunto → descifra el archivo

Tabla de características de claves

ClaveAlgoritmoLongitudEntropíaDónde se generaDónde se almacena
Contraseña maestra≥12 caracteresDepende del usuarioUsuarioEn ningún lugar
Salt PBKDF220 caracteres~120 bitsServidorServidor (abierto)
Clave maestraPBKDF2-SHA256512 bits512 bitsClienteEn ningún lugar (en memoria)
RSA públicaRSA-OAEP2048 bitsClienteServidor (abierta)
RSA privadaRSA-OAEP2048 bitsClienteServidor (cifrada)
Clave de bóvedaAES-256-CBC100 chars → 256 bits~596 bits entradaClienteServidor (cifrada con RSA)
Clave de registroAES-256-CBC100 chars → 256 bits~596 bits entradaClienteServidor (cifrada)
Clave de archivo adjuntoAES-256-CBC100 chars → 256 bits~596 bits entradaClienteServidor (cifrada)
Clave del servidorAES-256-CFB256 bits256 bitsServidorArchivo 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.