Skip to main content

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.
AspectoDetalle
AlgoritmoAES-256-GCM (Advanced Encryption Standard)
Clave256 bits (32 bytes), unica por entorno
IV (Vector de inicializacion)12 bytes aleatorios por cada operacion de cifrado
AutenticacionTag de 16 bytes (AEAD) para verificar integridad
FormatoPrefijo 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.
1

QuiroHiro envia el webhook

Junto con el cuerpo del mensaje, envia una firma en la cabecera HTTP.
2

QuiroHiro calcula la firma

Usa el secreto compartido y el cuerpo del mensaje para calcular la firma esperada.
3

Comparacion

Si las firmas coinciden, el webhook es autentico. Si no, se rechaza con error 401.
Esto previene que un atacante pueda enviar webhooks falsos al sistema.

Proteccion contra abusos

Rate limiting

Todas las rutas del API tienen limites de peticiones por IP:
Tipo de rutaLimiteVentana
Rutas estandar100 peticiones1 minuto
Rutas de administracion10 peticiones1 minuto
Webhooks500 peticiones1 minuto
Cuando se excede el limite, el servidor responde con 429 Too Many Requests e incluye cabeceras con informacion del limite:
  • X-RateLimit-Limit: Limite maximo
  • X-RateLimit-Remaining: Peticiones restantes
  • X-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):
AspectoDetalle
FlujoAuthorization Code Grant
TokensAccess token (corta duracion) + Refresh token (larga duracion)
RenovacionProactiva cada 30 minutos (antes de que expire)
AmbitoLimitado a: calendarios, citas, contactos, campos personalizados, usuarios
AlmacenamientoTokens 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:
ParametroValor
Ventana de deteccion5 minutos
Umbral10 cancelaciones en la ventana
Pausa automatica15 minutos
RecuperacionAutomatica 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

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.
Si. Desde la configuracion puedes desconectar completamente. Esto revoca los tokens de acceso y detiene toda sincronizacion. Las citas ya sincronizadas no se eliminan.
Solo los administradores de la sub-cuenta de QuiroHiro donde esta instalada la app.
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