Saltar al contenido principal

Seguridad y privacidad

Clatri maneja tu dinero, tu salud, tus documentos. Eso exige algo más que un login y una promesa de “tus datos están seguros”. La seguridad de Clatri funciona por capas, y cada capa resuelve un problema distinto. La pregunta correcta no es “si Clatri cifra o no cifra”, sino qué protege cada capa, qué depende del servidor y qué depende de ti.

Las capas

CapaQué resuelve
Autenticación + 2FAQuién eres, con verificación opcional por TOTP
RLS (Row Level Security)Qué datos te pertenecen o te fueron compartidos
Almacenamiento privadoQue archivos y documentos no queden expuestos públicamente
Cifrado de discoProtección física de la infraestructura y respaldos
Cifrado de sistemaDatos sensibles que el backend necesita seguir procesando
Cifrado de usuarioInformación especialmente sensible, protegida con tu propia clave
Protección localSecretos en el dispositivo y bloqueo de app

No son alternativas. Son complementarias. Si una falla, las demás siguen operando.

Dónde vive cada cosa

Tu información no está toda en el mismo lugar. Clatri separa intencionalmente la infraestructura en tres zonas independientes:

  • Tu dispositivo guarda tu sesión, la clave derivada y los secretos locales en el almacenamiento seguro del sistema operativo. Nunca se comunica directamente con la base de datos.
  • El backend vive en un servidor separado. Recibe tus solicitudes por HTTPS y usa tu JWT para conectarse a la base de datos — lo que significa que cada consulta que hace está sometida a las mismas restricciones RLS que si la hicieras tú directamente.
  • La base de datos y el almacenamiento viven en otra infraestructura distinta a la del backend. El backend no tiene acceso libre a tus datos: solo puede ver y modificar lo que tu JWT le permite según las políticas RLS de cada tabla.

Que estén separados importa: comprometer uno no da acceso automático a los otros. Un atacante que acceda al backend no tiene los datos en disco sin las credenciales de la base de datos. Alguien con acceso a la base de datos no tiene las claves de cifrado que viven en el backend. Y alguien con tu dispositivo en la mano se enfrenta al bloqueo de app y al almacenamiento seguro del sistema operativo.

Autenticación

Tu cuenta se autentica con JWT (JSON Web Token) — un token firmado que contiene tu identidad y que la app envía en cada solicitud. El backend lo valida antes de hacer cualquier cosa: si el token no es válido o expiró, la solicitud se rechaza. Pero autenticarte no significa acceder a todo. Eso lo controla la siguiente capa.

Autenticación de dos factores (2FA)

Desde Ajustes > Seguridad puedes activar 2FA con TOTP (Time-based One-Time Password) — un código numérico de 6 dígitos que cambia cada 30 segundos y que solo tu app de autenticación puede generar. Funciona con Google Authenticator, Microsoft Authenticator, Authy o cualquier app compatible con TOTP:

  1. activas 2FA desde ajustes y Clatri te muestra un código QR
  2. lo escaneas con tu app de autenticación
  3. confirmas con un código de 6 dígitos
  4. Clatri te muestra códigos de recuperación — guárdalos en un lugar seguro, no se vuelven a mostrar

A partir de ese momento, cada vez que inicies sesión (con Google o Apple), después del login normal Clatri te pide el código TOTP antes de darte acceso completo. Tu sesión arranca en un nivel de seguridad básico y sube al nivel completo solo cuando verificas el código.

2FA es opcional — tú decides si activarlo. Pero si lo activas y pierdes acceso a tu app de autenticación sin tener los códigos de recuperación, no podrás volver a entrar a tu cuenta. Por eso es importante guardar los códigos de recuperación en un lugar seguro cuando los configures.

RLS: permisos en la base de datos

Clatri usa Row Level Security en PostgreSQL. Cada fila de cada tabla tiene políticas que evalúan, por consulta:

  • tu user_id
  • la entidad activa
  • si eres propietario o la entidad fue compartida contigo
  • tu nivel de permiso (propietario, editor, visor)
  • los dominios a los que tienes acceso (finanzas, salud, gestión, chat)

No es un filtro de aplicación que se pueda saltar con una llamada directa a la API. Es una restricción a nivel de base de datos: si la política dice que no puedes leer esa fila, PostgreSQL no te la devuelve. Aplica tanto a datos estructurados como a archivos en el almacenamiento.

Almacenamiento privado

Imágenes y documentos se guardan en un bucket privado, organizados por entidad y tipo de contenido. No hay URLs públicas permanentes. Cuando necesitas acceder a un archivo, el camino depende de si ese archivo está cifrado o no:

  • Archivos sin cifrado adicional (avatares, audio, adjuntos generales): el backend genera una URL firmada con 2 horas de vigencia. La app la usa para cargar el archivo directamente desde el almacenamiento, y la cachea localmente hasta que expira. Pasadas las 2 horas, solicita una nueva.
  • Archivos cifrados (salud, finanzas, organización): nunca reciben una URL firmada. La app le pide el archivo al backend, que lo descarga del almacenamiento, lo descifra en memoria con las claves que correspondan (sistema, usuario o ambas), y devuelve los bytes descifrados directamente. El archivo cifrado en el almacenamiento nunca queda expuesto.

Cifrado de disco

La base de datos y sus respaldos viven sobre infraestructura con cifrado a nivel de disco. Si alguien obtuviera acceso físico al medio de almacenamiento, no tendría los datos en claro.

Esta capa protege la infraestructura. No decide quién puede leer un registro dentro de Clatri — eso es trabajo de RLS.

Cifrado de sistema

El cifrado de sistema existe para un escenario concreto: que alguien obtenga acceso computacional a la base de datos — no físico al disco, sino a los datos mismos — y aún así no pueda leer la información sensible de los usuarios. Los campos y archivos cifrados con esta capa son ilegibles sin la clave de sistema, que vive en el backend, no en la base de datos.

Se usa para:

  • datos y documentos financieros
  • datos y documentos de organización personal
  • ciertos datos identificatorios de la entidad

La implementación usa AES-256-GCM — cifrado autenticado que protege tanto la confidencialidad como la integridad del dato. Cada valor se cifra con un nonce aleatorio de 12 bytes, lo que significa que cifrar el mismo texto dos veces produce resultados diferentes.

Como la clave la administra el backend y no el usuario, funciones como compartir una entidad, revisar documentos o ejecutar automatizaciones siguen funcionando sin pedirte una contraseña extra en cada paso.

Cifrado de usuario

El cifrado de usuario existe para la información más delicada — hoy, principalmente datos y documentos de salud. Aquí la idea es que el desbloqueo no dependa solo del servidor, sino también de una clave que nace de tu propia contraseña.

Tu contraseña de encriptación

Al terminar el onboarding, Clatri te pide una contraseña de encriptación. Es una credencial separada de tu login, con requisitos propios: mínimo 8 caracteres, mayúsculas, minúsculas, números y símbolos.

Cuando la configuras:

  1. la contraseña viaja por HTTPS al backend
  2. el backend genera un salt aleatorio de 16 bytes y deriva una clave de 32 bytes con Argon2id
  3. el backend guarda el salt y un token de verificación — el resultado de cifrar una cadena conocida con tu clave derivada, para poder comprobar en el futuro que una contraseña reconstruye la clave correcta
  4. el backend devuelve la clave derivada a la app
  5. la app la guarda en el almacenamiento seguro del sistema operativo

Lo que no se guarda en el servidor: ni tu contraseña, ni la clave derivada, ni una copia descifrable de tus datos. Solo el salt y el token de verificación.

Doble capa

Cuando la clave de usuario está disponible, los datos protegidos pasan por dos capas de cifrado:

  1. se cifra con tu clave de usuario (AES-256-GCM)
  2. ese resultado se vuelve a cifrar con la clave de sistema (AES-256-GCM)

El dato almacenado queda envuelto por ambas capas. Para leerlo hacen falta ambas claves. Para descifrarlo se recorre el camino inverso: primero la capa de sistema, luego la de usuario.

En tiempo de ejecución

La app no envía tu contraseña en cada mensaje al agente. Lo que envía, cuando la operación lo requiere, es la clave derivada en el header X-User-Encryption-Key, dentro de la conexión HTTPS/TLS. El backend la usa para descifrar o cifrar contenido protegido durante esa operación concreta.

Dicho de otra forma:

  • la contraseña se usa solo para configuración, desbloqueo, cambio o reset
  • la clave derivada se usa para operaciones normales sobre contenido protegido

Dispositivo nuevo

Si entras desde un dispositivo que no tiene la clave derivada local, Clatri te pide tu contraseña de encriptación una vez. El backend la valida contra el salt guardado, rederiva la clave y la devuelve para que la app la almacene localmente.

Cambio y reset de contraseña

Si cambias la contraseña conociendo la anterior, Clatri rota la clave y recifra todo el contenido afectado — prescripciones, documentos médicos, archivos de salud.

Si haces un reset sin conocer la anterior, se genera una nueva configuración criptográfica, pero el contenido protegido con la clave previa deja de ser recuperable. Eso no es un bug: es la consecuencia directa de que el desbloqueo dependa de una credencial que el servidor no puede reconstruir por ti.

Qué se cifra y cómo

No todo se cifra igual. La política depende del dominio:

DominioMetadatosArchivosNivel
SaludCifrado de usuario + sistemaCifrado de usuario + sistemaMáximo
FinanzasCifrado de sistemaCifrado de sistemaAlto
OrganizaciónCifrado de sistemaCifrado de sistemaAlto
OtrosSin cifrado adicionalAlmacenamiento privadoBase

En todos los casos, RLS y almacenamiento privado aplican. El cifrado es la capa adicional.

Protección local en el dispositivo

La app guarda secretos locales — la clave derivada, la contraseña de encriptación y metadata de migración — en el almacenamiento seguro del sistema operativo:

  • iOS/macOS: Keychain, con accesibilidad firstUnlockThisDevice
  • Android: SharedPreferences cifradas por el sistema

Todos los valores se almacenan con claves scoped al usuario, lo que previene acceso cruzado entre cuentas en el mismo dispositivo.

Bloqueo de app

En Ajustes puedes activar el bloqueo de app. Cuando está habilitado, si la app pasa más de 5 minutos en segundo plano, se bloquea y te pide autenticación local para reabrirse:

  • Face ID o Touch ID en Apple
  • Huella o biometría en Android
  • PIN, patrón o código del sistema como respaldo, si la plataforma lo permite

Esto protege el acceso físico al dispositivo. No sustituye la contraseña de encriptación — son capas distintas.

Tus datos son tuyos

Desde Ajustes → Exportar datos puedes descargar tu información en archivos Excel:

ExportaciónContenido
Reporte de saludCondiciones, episodios, prescripciones, medicamentos, métricas corporales, eventos médicos
Snapshot financieroCuentas, tarjetas, pagos recurrentes, obligaciones, activos, ahorros, inversiones y resumen con patrimonio neto
Movimientos financierosGastos e ingresos por rango de fechas, con desglose por categoría

Puedes exportar una sola entidad como archivo Excel (.xlsx) o varias entidades como archivo ZIP. No hay candados ni periodos de espera — tu información te pertenece y puedes llevártela cuando quieras.

En resumen

La seguridad de Clatri no depende de una sola cerradura. Combina permisos estrictos a nivel de base de datos, almacenamiento privado, cifrado por capas con AES-256-GCM, derivación de claves con Argon2id y protección local en el dispositivo. Si una capa se compromete, las demás siguen limitando el acceso a tu información.