Ficha Técnica de Seguridad
Última actualización: 22 de septiembre de 2026
Esta ficha describe las medidas técnicas con las que Ikovita protege la plataforma, los archivos y las sesiones, y los lineamientos HL7 FHIR con los que estructura la información clínica. Complementa la Política de Seguridad Informática y el apartado de medidas de seguridad del Aviso de Privacidad.
1. Dónde se ejecuta la plataforma
El sitio web y la API se ejecutan en un servidor virtual privado (VPS) contratado con Hostinger. Ese servidor atiende la aplicación y la API; no es el almacén de los documentos clínicos. El acceso administrativo al VPS queda restringido al personal autorizado.
El tráfico hacia el sitio y la API viaja cifrado con HTTPS (TLS). El navegador recibe además una política de transporte estricto (HSTS) que obliga a usar HTTPS en visitas posteriores, incluida la de los subdominios.
2. Dónde se guardan los archivos
Estudios, recetas, fotografías de perfil, cédulas y demás archivos se almacenan en DigitalOcean Spaces (almacenamiento de objetos), en la región sfo3 (San Francisco, Estados Unidos). No se guardan en el disco del VPS.
Los archivos nuevos se suben en modo privado. Quien no tenga una dirección firmada y vigente no puede abrirlos, aunque conozca el nombre del archivo. La subida va del navegador directo a Spaces mediante una dirección de carga firmada y de corta vigencia: el archivo no se copia al disco del VPS en el camino.
Protección de cada archivo
- Acceso de lectura mediante enlaces firmados. Para documentos clínicos la firma caduca a los 15 minutos.
- Nombre aleatorio en el almacén, de modo que la ruta no se deduce del nombre original.
- Entornos de desarrollo y producción separados en carpetas distintas del mismo almacén, para no mezclar archivos de prueba con los reales.
- Tamaño máximo de 15 MB por archivo y cuota de 5 GB por cuenta.
- Rechazo de tipos que el navegador podría ejecutar (HTML, SVG, JavaScript y ejecutables), aunque el remitente declare otro tipo.
Las imágenes que aparecen en correos (por ejemplo, el logotipo de una aseguradora) salen por una ruta aparte y acotada. Esa ruta no sirve documentos clínicos ni otra información de salud.
3. Sesión y tokens
La sesión se sostiene con dos tokens firmados (JWT), con emisor y audiencia fijos de Ikovita. El token de acceso dura 1 hora. El token de renovación dura 32 días y no puede usarse como token de acceso: la API lo rechaza si se presenta en una petición normal.
En el sitio web los tokens viajan en cookies que el JavaScript de la página no puede leer (HttpOnly), marcadas Secure cuando la conexión es HTTPS y con SameSite en modo Lax. En producción el nombre de la cookie usa el prefijo __Host-, que impide fijarla desde otro dominio o con una ruta distinta de la raíz. La respuesta de inicio de sesión no incluye los tokens en el cuerpo: solo la cookie.
En la aplicación móvil, que no usa cookies del navegador, los tokens viajan en la cabecera de autorización. El servidor aplica las mismas reglas de firma, vigencia y renovación.
Renovación y robo de sesión
- Cada renovación emite un par nuevo e invalida el token de renovación anterior.
- En la base de datos solo se guarda la huella (hash) del token de renovación, no el token en claro.
- Si se reutiliza un token de renovación que ya no es el vigente, la API cierra la sesión.
- Cada token lleva un identificador único, de modo que dos emisiones no son intercambiables.
- Cerrar sesión borra las cookies. Cambiar la contraseña deja de aceptar los tokens emitidos antes.
Las contraseñas se guardan con un hash bcrypt, nunca en texto claro. Si el correo no existe, la comparación se hace igual contra un hash fijo, para no revelar por el tiempo de respuesta qué cuentas están registradas. Los códigos de un solo uso (recuperación de contraseña y vinculación de expediente) también se guardan como hash y caducan en minutos.
4. Datos clínicos en la base
La base operativa es un servicio administrado de MongoDB. Además del cifrado que aporta el proveedor, Ikovita cifra en la aplicación los campos clínicos antes de guardarlos: evolución, diagnóstico e indicaciones de la consulta, recetas, estudios, citas y valores de salud. En producción la API no arranca si falta la clave de ese cifrado.
5. Controles del navegador
Cada respuesta del sitio lleva una política de seguridad de contenido (CSP) con un identificador de un solo uso. Los scripts que no traigan ese identificador quedan bloqueados. La página no puede incrustarse en otro sitio, no carga objetos embebidos y solo pide imágenes o archivos a la propia plataforma, a la API y al almacén de DigitalOcean Spaces.
- El navegador no interpreta un archivo como un tipo distinto del declarado (protección contra confusión de tipo).
- La cámara, el micrófono y la ubicación solo pueden pedirse desde el propio sitio, y solo cuando una función los necesita (por ejemplo, la videoconsulta).
- Las pantallas de expediente, administración y consulta no se guardan en cachés compartidas.
- Inicio de sesión, registro y operaciones sensibles tienen límite de intentos por periodo.
6. Quién puede ver qué
Cada petición a datos de un paciente pasa por el rol y por el vínculo autorizado (el propio titular, un médico o un familiar a quien él dio acceso). El personal y los proveedores solo alcanzan lo necesario para su función. Los accesos y cambios relevantes del expediente quedan en bitácora.
7. Lineamientos HL7 FHIR
De forma voluntaria, Ikovita usa el estándar HL7 FHIR (Fast Healthcare Interoperability Resources) como referencia técnica para estructurar y exportar información de salud. Esa adopción no implica sujeción a legislación extranjera.
Las mediciones se guardan como recurso Observation y el titular se expone como recurso Patient. La consulta de observaciones se entrega en JSON, dentro de un Bundle de tipo búsqueda, con el total de resultados. Cada observación queda en estado final, ligada al paciente y con la fecha de la medición.
Codificación LOINC
Cuando el tipo de medición tiene un código LOINC conocido, se guarda ese código. Si no lo tiene, se usa un código local: no se inventa un LOINC.
- Pasos: 55423-8.
- Frecuencia cardiaca: 8867-4.
- Duración del sueño: 93832-4.
- Peso corporal: 29463-7.
Leer el recurso Patient exige el mismo acceso que el resto de los datos de identidad. Leer las observaciones exige acceso completo al expediente y el identificador del paciente: la API no devuelve mediciones si no se indica de quién son. Quien no tenga vínculo autorizado no puede leer el expediente aunque conozca el identificador.
Ningún sistema es invulnerable. Ikovita mantiene y revisa estas medidas, y aplica el protocolo de incidentes cuando un evento de seguridad lo exige.