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
| Capa | Qué resuelve |
|---|---|
| Autenticación + 2FA | Quién eres, con verificación opcional por TOTP |
| RLS (Row Level Security) | Qué datos te pertenecen o te fueron compartidos |
| Almacenamiento privado | Que archivos y documentos no queden expuestos públicamente |
| Cifrado de disco | Protección física de la infraestructura y respaldos |
| Cifrado de sistema | Datos sensibles que el backend necesita seguir procesando |
| Cifrado de usuario | Información especialmente sensible, protegida con tu propia clave |
| Protección local | Secretos 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:
- activas 2FA desde ajustes y Clatri te muestra un código QR
- lo escaneas con tu app de autenticación
- confirmas con un código de 6 dígitos
- 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:
- la contraseña viaja por HTTPS al backend
- el backend genera un salt aleatorio de 16 bytes y deriva una clave de 32 bytes con Argon2id
- 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
- el backend devuelve la clave derivada a la app
- 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:
- se cifra con tu clave de usuario (AES-256-GCM)
- 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:
| Dominio | Metadatos | Archivos | Nivel |
|---|---|---|---|
| Salud | Cifrado de usuario + sistema | Cifrado de usuario + sistema | Máximo |
| Finanzas | Cifrado de sistema | Cifrado de sistema | Alto |
| Organización | Cifrado de sistema | Cifrado de sistema | Alto |
| Otros | Sin cifrado adicional | Almacenamiento privado | Base |
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ón | Contenido |
|---|---|
| Reporte de salud | Condiciones, episodios, prescripciones, medicamentos, métricas corporales, eventos médicos |
| Snapshot financiero | Cuentas, tarjetas, pagos recurrentes, obligaciones, activos, ahorros, inversiones y resumen con patrimonio neto |
| Movimientos financieros | Gastos 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.