Modelo de seguridad

Esta página describe qué protege Rempar, cómo, y qué no protege. El documento de referencia es el protocolo v1, cuyas cadenas están congeladas.

Objetivo

Una compromisión completa del servidor, de sus copias de seguridad y de su administrador no debe revelar ningún secreto: ni contraseña maestra, ni contenido, ni siquiera el nombre de un elemento.

Derivación de las claves (solo en el dispositivo)

password     = NFKC(saisie)
master_key   = Argon2id(password, kdf_salt, m=65536 KiB, t=3, p=4, 32 octets)
auth_key     = HKDF-SHA256(master_key, info="rempart/auth/v1")
wrap_key     = HKDF-SHA256(master_key, info="rempart/wrap/v1")
  • kdf_salt: 16 bytes aleatorios, creados con la cuenta o la bóveda local.
  • auth_key se envía al servidor como contraseña de cuenta. No permite derivar nada más.
  • wrap_key nunca sale del dispositivo. Sella la clave de la bóveda.
  • Los clientes rechazan parámetros Argon2id más débiles que m=19456, t=2, p=1, incluso si el servidor los propone.

Formato de sellado

seal(key, plaintext, aad) = base64( 0x01 || nonce(24) || XChaCha20-Poly1305(key, nonce, plaintext, aad) )

Cada uso tiene su cadena AAD congelada: rempart/vaultkey/v1, rempart/itemkey/v1|<item_id>, rempart/item/v1|<item_id>, rempart/export/v1, etc. Un blob no puede reproducirse en otro contexto ni adjuntarse a otro elemento.

Bóveda y elementos

  • vault_key: 32 bytes aleatorios, creados una vez por bóveda.
  • Cada elemento tiene su propia item_key de 32 bytes. El blob almacenado es { k: seal(vault_key, item_key), c: seal(item_key, contenu) }.
  • La lista se muestra desde un índice sellado local. Abrir una ficha solo descifra esa ficha.
  • Los identificadores de elementos son UUID v4 vinculados en los dos AAD.

Kit de emergencia

32 bytes aleatorios, mostrados una sola vez en Crockford base32. recovery_wrap = HKDF(recovery_key, "rempart/recovery-wrap/v1") sella una copia de la clave de la bóveda; recovery_auth = HKDF(recovery_key, "rempart/recovery-auth/v1") autentica una restauración ante el servidor.

Cuenta y tokens

  • Preconexión antienumeración: se devuelve una sal ficticia determinista para los correos desconocidos.
  • Token de acceso por dispositivo (60 min) y token de actualización con rotación (30 días). Un segundo uso de un token ya renovado revoca el dispositivo (token_reused).
  • 2FA TOTP opcional, recomendada. Obligatoria para los administradores.
  • Todas las rutas sensibles tienen límite de frecuencia.

En el dispositivo

  • Secretos ocultos con 12 puntos fijos, vueltos a ocultar tras 30 s.
  • Portapapeles vaciado tras 30 s (ajustable de 10 s a 2 min). Las frases de recuperación nunca se copian enteras.
  • Bloqueo tras 5 min, al suspender y al cerrar; la clave de la bóveda se pone a cero en memoria.
  • Esperas progresivas tras cada fallo: 30 s, 1 min, 5 min. Nunca un borrado silencioso.
  • Android: FLAG_SECURE impide las capturas. iOS y macOS: velo de privacidad en el selector de aplicaciones.
  • Biometría: la clave de la bóveda se confía al llavero del sistema protegido por Touch ID, Face ID o la huella dactilar, nunca a un archivo.

Qué no cubre el modelo

  • Un dispositivo comprometido mientras la bóveda está abierta (software espía, registrador de teclas).
  • Una contraseña maestra débil: Argon2id ralentiza el ataque, no lo hace imposible.
  • La pérdida simultánea de la contraseña maestra y del kit de emergencia.
  • Los metadatos de la cuenta: correo electrónico, número de elementos, tamaño de los blobs, fechas y plataformas de los dispositivos.

Informar de una vulnerabilidad

Escriba a security@rempar.org. Acusamos recibo en 48 horas y publicamos una corrección antes de cualquier divulgación.


¿Una pregunta sin respuesta aquí? support@rempar.org