Compromiso con la seguridad
QuiroHiro maneja datos sensibles de pacientes y credenciales de acceso a sistemas clinicos. La seguridad no es una funcionalidad adicional, es la base sobre la que esta construido todo el sistema.Cifrado de credenciales
Todas las credenciales (API Keys, tokens OAuth, secretos) se almacenan cifradas en la base de datos.| Aspecto | Detalle |
|---|---|
| Algoritmo | AES-256-GCM (Advanced Encryption Standard) |
| Clave | 256 bits (32 bytes), unica por entorno |
| IV (Vector de inicializacion) | 12 bytes aleatorios por cada operacion de cifrado |
| Autenticacion | Tag de 16 bytes (AEAD) para verificar integridad |
| Formato | Prefijo enc:v1: + datos cifrados en base64 |
Cada vez que se cifra un dato, se genera un IV aleatorio nuevo. Esto significa que aunque cifres el mismo valor dos veces, el resultado sera diferente, lo que previene ataques de patron.
Que se cifra
- API Keys de PracticeHub
- Tokens de acceso de QuiroHiro (access token + refresh token)
- Cualquier secreto almacenado en base de datos
Que NO se almacena
- Contrasenas de usuarios
- Datos de tarjetas de credito
- Datos clinicos de pacientes (solo se transmiten, no se almacenan)
Verificacion de webhooks
Los webhooks de QuiroHiro se verifican con HMAC-SHA256 antes de procesarse.QuiroHiro calcula la firma
Usa el secreto compartido y el cuerpo del mensaje para calcular la firma esperada.
Proteccion contra abusos
Rate limiting
Todas las rutas del API tienen limites de peticiones por IP:| Tipo de ruta | Limite | Ventana |
|---|---|---|
| Rutas estandar | 100 peticiones | 1 minuto |
| Rutas de administracion | 10 peticiones | 1 minuto |
| Webhooks | 500 peticiones | 1 minuto |
429 Too Many Requests e incluye cabeceras con informacion del limite:
X-RateLimit-Limit: Limite maximoX-RateLimit-Remaining: Peticiones restantesX-RateLimit-Reset: Cuando se renueva la ventana
Proteccion de memoria
El sistema de rate limiting tiene un limite maximo de 10.000 entradas en memoria. Si se alcanza, se limpian automaticamente las entradas expiradas para prevenir agotamiento de memoria.Autorizacion OAuth 2.0
La conexion con QuiroHiro utiliza OAuth 2.0 con tokens por ubicacion (location):| Aspecto | Detalle |
|---|---|
| Flujo | Authorization Code Grant |
| Tokens | Access token (corta duracion) + Refresh token (larga duracion) |
| Renovacion | Proactiva cada 30 minutos (antes de que expire) |
| Ambito | Limitado a: calendarios, citas, contactos, campos personalizados, usuarios |
| Almacenamiento | Tokens cifrados con AES-256-GCM |
Proteccion de datos de pacientes
Sanitizacion de logs
QuiroHiro incluye un sanitizador de PII (Informacion de Identificacion Personal) que automaticamente oculta datos sensibles en los logs del sistema:- Nombres de pacientes
- Emails
- Telefonos
- Direcciones
- Cualquier dato que pueda identificar a una persona
Aislamiento multi-tenant
Cada clinica opera en un entorno completamente aislado:- Credenciales independientes: Cada clinica tiene sus propios tokens y API keys
- Datos segregados: Los datos de una clinica nunca se mezclan con los de otra
- Configuracion independiente: Mapeos, zona horaria y preferencias son por clinica
Proteccion XSS
La interfaz de configuracion implementa proteccion contra ataques XSS (Cross-Site Scripting):- Todos los datos que se muestran en la interfaz se escapan con
escapeHtml() - Los templates literales nunca insertan datos sin sanitizar
- Los formularios validan datos de entrada antes de enviarlos
Proteccion anti-bucle y disponibilidad
Aunque no son estrictamente medidas de seguridad, estos sistemas protegen contra situaciones que podrian comprometer la disponibilidad:- Deduplicacion de webhooks: Ventana de 60 segundos para evitar procesamiento duplicado
- Locks concurrentes: Maximo 5.000 locks activos con TTL de 2 minutos
Circuit breaker (proteccion contra cancelaciones masivas)
Si se detectan demasiadas cancelaciones en poco tiempo, el sistema pausa automaticamente la sincronizacion para esa clinica y direccion:| Parametro | Valor |
|---|---|
| Ventana de deteccion | 5 minutos |
| Umbral | 10 cancelaciones en la ventana |
| Pausa automatica | 15 minutos |
| Recuperacion | Automatica tras la pausa |
El circuit breaker es por clinica y por direccion (PH a QH o QH a PH). Si se activa en una direccion, la otra sigue funcionando normalmente. Cuando se activa, genera una alerta visible en el dashboard.
Preguntas frecuentes sobre seguridad
Donde se almacenan mis datos?
Donde se almacenan mis datos?
Los datos de configuracion (mapeos, tokens cifrados, logs de sincronizacion) se almacenan en Supabase (PostgreSQL gestionado). Los datos de pacientes solo se transmiten entre PracticeHub y QuiroHiro, no se almacenan en QuiroHiro.
Puedo desconectar la integracion en cualquier momento?
Puedo desconectar la integracion en cualquier momento?
Si. Desde la configuracion puedes desconectar completamente. Esto revoca los tokens de acceso y detiene toda sincronizacion. Las citas ya sincronizadas no se eliminan.
Quien puede acceder a la configuracion?
Quien puede acceder a la configuracion?
Solo los administradores de la sub-cuenta de QuiroHiro donde esta instalada la app.
Se comparten datos entre clinicas?
Se comparten datos entre clinicas?
No. Cada clinica es un tenant completamente aislado. No hay forma de acceder a los datos de otra clinica.
Preguntas frecuentes
Mas preguntas y respuestas