Saltar a contenido

Investigacion: Auditoria en Arquitectura Zero-Knowledge

Identificador: INV-011 Version: 1.0.0 Fecha: 2025-12-05 Autor: KnowledgeDrone, ComplianceDrone Relacionado: INV-001, INV-008 Estado: Completado Tipo: Investigacion de Seguridad, Cumplimiento y Privacidad


1. Resumen Ejecutivo

Esta investigacion aborda uno de los desafios mas complejos en sistemas de privacidad: como auditar un sistema donde el servidor no puede ver los datos del usuario. MedTime implementa una arquitectura zero-knowledge donde los datos PHI estan cifrados E2E y el servidor almacena "blobs opacos" que no puede descifrar.

1.1. Paradoja Central

PARADOJA DE AUDITORIA ZERO-KNOWLEDGE:

Las regulaciones exigen:
- Audit logs detallados de acceso a datos sensibles
- Trazabilidad completa de quien accedio que y cuando
- Capacidad de investigar incidentes de seguridad

Zero-Knowledge garantiza:
- El servidor NO puede ver el contenido de los datos
- Solo el paciente puede descifrar su informacion
- El servidor solo ve "blobs" cifrados

PREGUNTA: Como auditar algo que no puedes ver?

1.2. Conclusion Principal

Estrategia Viabilidad Cumplimiento Privacidad
Audit logs de metadata Alta Cumple LFPDPPP/HIPAA Preservada
Hashes de integridad Alta Cumple Preservada
Timestamps verificables Alta Cumple Preservada
Audit logs cifrados Media Cumple Maxima
Counters ciegos Alta Parcial Preservada
Auditor tercero Baja Cumple Reducida

Recomendacion V1.0:Implementar auditoria basada enmetadata + hashes de integridad + timestamps verificables, sin exponer contenido PHI.


2. Contexto y Problema

2.1. Arquitectura Zero-Knowledge de MedTime (Referencia INV-008)

Segun la investigacion INV-008: Cifrado de Perfil e Identificacion, MedTime implementa:

ARQUITECTURA ACTUAL (V1.0):

+------------------+     +--------------------+     +------------------+
|    CLIENTE       |     |    SERVIDOR        |     |    CLIENTE       |
|   (Paciente)     |     |    (MedTime)       |     |   (Receptor)     |
+------------------+     +--------------------+     +------------------+
|                  |     |                    |     |                  |
| - Master Key     |     | - Blind Index      |     | - Clave Publica  |
| - Recovery Key   |     |   (email_hash)     |     | - Clave Privada  |
| - Clave Privada  |     | - Blob cifrado     |     |                  |
|                  |     |   (NO descifrable) |     |                  |
| PUEDE VER:       |     | PUEDE VER:         |     | PUEDE VER:       |
| - Todos sus datos|     | - Metadata         |     | - Datos compart. |
|                  |     | - Timestamps       |     |   descifrados    |
|                  |     | - Tamano de blobs  |     |                  |
|                  |     | - Hashes           |     |                  |
+------------------+     +--------------------+     +------------------+

2.1.1. Componentes criticos de INV-008

Componente Descripcion Relevancia para Auditoria
Blind Index HMAC-SHA256 del email para busqueda Permite identificar usuario sin ver email
Split-Key (Shamir 2-of-3) Clave dividida en 3 partes Recuperacion auditable sin exponer clave
Argon2id KDF Derivacion de clave robusta Previene ataques de fuerza bruta
AES-256-GCM Cifrado autenticado Tag de autenticacion para integridad

2.2. El Problema de Auditoria

ESCENARIO: Incidente de seguridad - acceso no autorizado sospechado

SIN ZERO-KNOWLEDGE:
1. Revisar audit log -> "Usuario X accedio a medicamento Metformina 500mg"
2. Verificar si acceso fue legitimo
3. Investigacion completa

CON ZERO-KNOWLEDGE:
1. Revisar audit log -> "Usuario X accedio a blob ID 7f8a9b..."
2. No sabemos QUE datos fueron accedidos
3. Solo sabemos CUANDO y por QUIEN

PREGUNTA: Es esto suficiente para cumplimiento regulatorio?

2.3. Tipos de Informacion Disponible

En una arquitectura zero-knowledge, el servidor tiene acceso a:

Tipo Descripcion Ejemplo
Metadata estructural Informacion sobre la estructura de datos "Usuario tiene 5 entradas de medicamentos"
Metadata temporal Timestamps de operaciones "Ultima modificacion: 2025-12-05 10:30:00"
Metadata de tamano Tamano de blobs cifrados "Blob de 2.3KB"
Identificadores ciegos Hashes no reversibles "email_hash: 7f8a9b2c..."
Hashes de integridad Verificacion sin revelar contenido "SHA-256 del blob: abc123..."
Contadores Numeros sin contexto "Operaciones de escritura: 47"

3. Marco Regulatorio

3.1. Requisitos LFPDPPP (Mexico)

La Ley Federal de Proteccion de Datos Personales en Posesion de los Particulares (LFPDPPP 2025) establece requisitos especificos de auditoria:

3.1.1. Requisitos de Auditoria (Art. 9, 19, 20)

Requisito Descripcion Aplicacion Zero-Knowledge
Trazabilidad Registro de quien accede a datos personales Cumple: Registro de user_id + timestamp
Responsabilidad Documentar medidas de seguridad implementadas Cumple: Documentar arquitectura E2E
Control de acceso Registrar intentos de acceso exitosos y fallidos Cumple: Metadata de autenticacion
Integridad Garantizar que datos no han sido alterados Cumple: Hashes de integridad
Retencion Conservar registros por periodo definido Cumple: Logs de metadata por 5 anos

3.1.2. Derechos ARCO y Auditoria

DERECHOS ARCO EN ARQUITECTURA ZERO-KNOWLEDGE:

ACCESO:
- El usuario descifra sus propios datos
- Servidor proporciona blob cifrado
- Audit log: "Usuario X solicito acceso a sus datos"

RECTIFICACION:
- Usuario descifra, modifica, re-cifra
- Servidor recibe nuevo blob
- Audit log: "Usuario X actualizo blob ID Y"

CANCELACION:
- Usuario solicita eliminacion
- Servidor elimina blob y metadata asociada
- Audit log: "Usuario X elimino blob ID Y"

OPOSICION:
- Usuario revoca consentimiento de comparticion
- Servidor revoca tokens de acceso
- Audit log: "Usuario X revoco acceso a blob ID Y para receptor Z"

3.1.3. Requisitos de Retencion LFPDPPP 2025

Tipo de Registro Retencion Minima Notas
Logs de acceso 5 anos Desde ultima interaccion
Logs de consentimiento Duracion del tratamiento + 5 anos Para demostrar base legal
Logs de ARCO 5 anos Desde solicitud
Logs de incidentes 10 anos Recomendacion de la Secretaria

Fuente: Mexico Privacy Law (LFPDPPP): A 2025 Guide to Compliance

3.2. Requisitos HIPAA (Futuro - Expansion USA)

3.2.1. HIPAA Security Rule - Audit Controls (45 CFR 164.312(b))

La norma HIPAA requiere implementar "hardware, software, and/or procedural mechanisms that record and examine activity in information systems that contain or use electronic protected health information (ePHI)."

Requisito HIPAA Descripcion Aplicacion Zero-Knowledge
User Audit Trail Identificar usuarios que acceden Cumple: user_id en todos los logs
System Audit Trail Registrar dispositivos, IP, timestamps Cumple: Metadata de sistema
Application Audit Trail Registrar acciones dentro de la app Parcial: Acciones sin contenido
Tamper-proof logs Logs inmutables Cumple: Hash chain + WORM storage
6 years retention Retencion minima Cumple: Configurable

3.2.2. Auditoria sin Exposicion de PHI

EJEMPLO DE AUDIT LOG HIPAA-COMPLIANT EN ZERO-KNOWLEDGE:

{
  "event_id": "evt_2025120510300001",
  "timestamp": "2025-12-05T10:30:00.000Z",
  "event_type": "DATA_ACCESS",
  "user_id": "usr_7f8a9b2c",  // Blind index del usuario
  "session_id": "ses_abc123",
  "device_id": "dev_xyz789",
  "ip_address": "192.168.1.100",  // O hash del IP
  "action": "READ",
  "resource_type": "MEDICATION_BLOB",
  "resource_id": "blob_def456",  // ID del blob, no contenido
  "resource_hash": "sha256:abc123...",  // Hash para integridad
  "result": "SUCCESS",
  "metadata": {
    "blob_size_bytes": 2048,
    "encryption_version": "1.0",
    "key_version": 3
  }
}

NOTA: En ningun momento se registra:
- Nombre del medicamento
- Dosis
- Frecuencia
- Ningún dato PHI

Fuente: HIPAA Audit Logs: Complete Requirements for Healthcare Compliance in 2025

3.3. Requisitos LGPD (Futuro - Expansion Brasil)

3.3.1. Principios de Auditoria LGPD

La Lei Geral de Protecao de Dados establece:

Principio LGPD Aplicacion a Auditoria Implementacion Zero-Knowledge
Transparencia Usuario puede solicitar logs de acceso Proporcionar logs de metadata
Seguranca Proteger logs de auditoria Cifrar logs, hash chain
Responsabilizacao Demostrar cumplimiento Audit trail inmutable
Minimizacao Solo datos necesarios en logs No incluir PHI en logs

3.3.2. DSAR (Data Subject Access Request) bajo LGPD

FLUJO DSAR EN ZERO-KNOWLEDGE:

1. Usuario solicita copia de todos sus datos
   -> Audit log: "DSAR recibido de usuario X"

2. Sistema recopila:
   a) Blobs cifrados (usuario descifra)
   b) Metadata de processing
   c) Logs de acceso (sin PHI)
   d) Consentimientos registrados

3. Paquete DSAR:
   - encrypted_data.zip (solo usuario descifra)
   - access_logs.json (metadata visible)
   - consent_records.json (datos de consentimiento)
   - processing_info.json (como se procesan datos)

4. Audit log: "DSAR completado para usuario X, entregado via [canal]"

Fuente: How Does GDPR Impact Log Management?


4. Tipos de Eventos Auditables

4.1. Eventos de Sistema (sin PHI)

Estos eventos son completamente seguros de registrar sin comprometer privacidad:

4.1.1. Eventos de Autenticacion

Evento Datos Registrados No Registrar
LOGIN_SUCCESS user_hash, timestamp, device_id, IP, method nombre, email real
LOGIN_FAILED user_hash (si existe), timestamp, IP, razon contrasena intentada
LOGOUT session_id, timestamp, tipo (voluntario/timeout) -
MFA_CHALLENGE user_hash, method, timestamp codigo enviado
MFA_SUCCESS user_hash, method, timestamp codigo ingresado
MFA_FAILED user_hash, method, timestamp, intentos -
PASSWORD_CHANGE user_hash, timestamp, success nueva contrasena
RECOVERY_INITIATED user_hash, method, timestamp recovery key
RECOVERY_SUCCESS user_hash, timestamp -
SESSION_CREATED session_id, user_hash, device, expiry -
SESSION_REVOKED session_id, reason, timestamp -

4.1.2. Eventos de Sistema

Evento Datos Registrados No Registrar
SYNC_STARTED user_hash, device_id, timestamp -
SYNC_COMPLETED user_hash, items_synced_count, duration contenido
SYNC_CONFLICT user_hash, blob_id, resolution datos conflictivos
KEY_ROTATION user_hash, old_key_version, new_key_version claves
DEVICE_REGISTERED user_hash, device_id, platform, timestamp -
DEVICE_REMOVED user_hash, device_id, timestamp -
APP_VERSION user_hash, version, platform -
ERROR_OCCURRED error_code, component, timestamp stack trace con PHI

4.2. Eventos de Usuario (metadata)

Eventos relacionados con acciones del usuario sobre sus datos:

4.2.1. Operaciones CRUD sobre Datos Cifrados

PATRON DE LOGGING PARA OPERACIONES CRUD:

CREATE:
{
  "event": "DATA_CREATED",
  "user_hash": "usr_7f8a9b2c",
  "resource_type": "MEDICATION",  // Tipo, no contenido
  "resource_id": "blob_new123",
  "timestamp": "2025-12-05T10:30:00Z",
  "encrypted_size": 1024,
  "metadata": {
    "encryption_algo": "AES-256-GCM",
    "key_version": 3
  }
}
// NO registrar: nombre medicamento, dosis, etc.

READ:
{
  "event": "DATA_READ",
  "user_hash": "usr_7f8a9b2c",
  "resource_type": "MEDICATION",
  "resource_id": "blob_def456",
  "timestamp": "2025-12-05T11:00:00Z",
  "access_type": "FULL"  // o "PARTIAL", "METADATA_ONLY"
}
// NO registrar: que datos fueron leidos

UPDATE:
{
  "event": "DATA_UPDATED",
  "user_hash": "usr_7f8a9b2c",
  "resource_type": "MEDICATION",
  "resource_id": "blob_def456",
  "timestamp": "2025-12-05T11:30:00Z",
  "old_hash": "sha256:abc123...",
  "new_hash": "sha256:def456...",
  "size_delta": +256  // bytes
}
// NO registrar: que campos cambiaron

DELETE:
{
  "event": "DATA_DELETED",
  "user_hash": "usr_7f8a9b2c",
  "resource_type": "MEDICATION",
  "resource_id": "blob_def456",
  "timestamp": "2025-12-05T12:00:00Z",
  "deletion_type": "SOFT"  // o "HARD", "SCHEDULED"
}
// NO registrar: contenido eliminado

4.2.2. Eventos de Comparticion

Evento Datos Registrados No Registrar
SHARE_INITIATED sender_hash, recipient_hash, resource_count, timestamp recursos especificos
SHARE_ACCEPTED share_id, recipient_hash, timestamp -
SHARE_DECLINED share_id, recipient_hash, timestamp razon
SHARE_REVOKED share_id, sender_hash, timestamp -
SHARE_EXPIRED share_id, expiry_time -
SHARE_ACCESSED share_id, recipient_hash, timestamp datos accedidos

4.3. Eventos Regulatorios (ARCO/DSR)

Eventos especificos para cumplimiento regulatorio:

4.3.1. Solicitudes de Derechos ARCO

EVENTOS ARCO AUDITABLES:

ARCO_ACCESS_REQUEST:
{
  "event": "ARCO_REQUEST",
  "type": "ACCESS",
  "user_hash": "usr_7f8a9b2c",
  "timestamp": "2025-12-05T09:00:00Z",
  "request_id": "arco_req_001",
  "channel": "IN_APP",  // o "EMAIL", "WRITTEN"
  "status": "RECEIVED"
}

ARCO_ACCESS_FULFILLED:
{
  "event": "ARCO_FULFILLED",
  "type": "ACCESS",
  "request_id": "arco_req_001",
  "timestamp": "2025-12-05T09:30:00Z",
  "delivery_method": "IN_APP_DOWNLOAD",
  "data_categories_included": ["MEDICATIONS", "PROFILE", "LOGS"],
  "encrypted_package_hash": "sha256:xyz789..."
}

ARCO_RECTIFICATION:
{
  "event": "ARCO_REQUEST",
  "type": "RECTIFICATION",
  "user_hash": "usr_7f8a9b2c",
  "timestamp": "2025-12-05T10:00:00Z",
  "request_id": "arco_req_002",
  "affected_resources_count": 2,  // cuantos, no cuales
  "status": "PROCESSING"
}

ARCO_CANCELLATION:
{
  "event": "ARCO_REQUEST",
  "type": "CANCELLATION",
  "user_hash": "usr_7f8a9b2c",
  "timestamp": "2025-12-05T11:00:00Z",
  "request_id": "arco_req_003",
  "scope": "FULL_ACCOUNT",  // o "PARTIAL"
  "retention_period_days": 30,
  "status": "SCHEDULED"
}

4.3.2. Eventos de Consentimiento

Evento Datos Registrados Retencion
CONSENT_GRANTED user_hash, purpose, timestamp, version Duracion + 5 anos
CONSENT_WITHDRAWN user_hash, purpose, timestamp Duracion + 5 anos
CONSENT_EXPIRED user_hash, purpose, expiry_date 5 anos
PRIVACY_NOTICE_ACCEPTED user_hash, version, timestamp Duracion + 5 anos
TERMS_ACCEPTED user_hash, version, timestamp Duracion + 5 anos

5. Estrategias de Auditoria Zero-Knowledge

5.1. Audit Logs Cifrados

5.1.1. Concepto

Los audit logs pueden cifrarse de forma que solo auditores autorizados puedan leerlos, mientras el servidor no puede ver el contenido.

flowchart TD
    A[Evento ocurre] --> B[Generar log entry]
    B --> C{Contiene PHI?}
    C -->|No| D[Almacenar en plaintext]
    C -->|Si| E[Cifrar con clave auditor]
    E --> F[Almacenar cifrado]
    D --> G[Hash chain]
    F --> G
    G --> H[Almacenar hash en blockchain o WORM]

    I[Auditor autorizado] --> J[Solicitar logs]
    J --> K[Descifrar con clave auditor]
    K --> L[Revisar contenido]

5.1.2. Implementacion: Public Key Encryption for Audit Logs

Basado en investigacion de University of Texas - Building an Encrypted and Searchable Audit Log:

ARQUITECTURA DE AUDIT LOGS CIFRADOS:

1. GENERACION DE CLAVES:
   - Auditor genera par de claves (pub_audit, priv_audit)
   - pub_audit se distribuye a todos los clientes
   - priv_audit se guarda en HSM

2. CREACION DE ENTRY:
   log_entry = {
     "timestamp": "2025-12-05T10:30:00Z",
     "event": "DATA_ACCESS",
     "user_id": "real_user_email@domain.com",  // Dato sensible
     "resource": "Medicamento: Metformina 500mg"  // PHI
   }

   // Cifrar entry
   encrypted_entry = Encrypt(pub_audit, log_entry)

   // Almacenar
   store(encrypted_entry)

3. BUSQUEDA (sin descifrar todo):
   - Auditor crea "search capability" para keyword
   - Sistema busca sobre indices cifrados
   - Solo entries relevantes se descifran

4. ACCESO:
   - Solo auditor con priv_audit puede descifrar
   - Servidor nunca ve contenido de logs

5.1.3. Ventajas y Desventajas

Aspecto Ventaja Desventaja
Privacidad Logs con PHI sin exposicion Complejidad criptografica
Cumplimiento Trazabilidad completa Requiere auditor externo
Performance Busqueda sobre cifrado Overhead de cifrado
Disponibilidad N/A Single point of failure en clave

5.1.4. Recomendacion MedTime

Para V1.0: No implementar audit logs cifrados para PHI. Mantener logs de metadata unicamente.

Para V2.0+: Evaluar implementacion con auditor tercero certificado (ver seccion 4.5).

5.2. Hashes de Integridad

5.2.1. Concepto

En lugar de registrar el contenido, se registra un hash criptografico que permite verificar integridad sin revelar datos.

EJEMPLO:

Usuario modifica medicamento:
- Antes: hash_before = SHA-256(blob_cifrado_antes)
- Despues: hash_after = SHA-256(blob_cifrado_despues)

Audit log:
{
  "event": "DATA_MODIFIED",
  "resource_id": "blob_123",
  "hash_before": "sha256:abc123...",
  "hash_after": "sha256:def456...",
  "timestamp": "2025-12-05T10:30:00Z"
}

VERIFICACION DE INTEGRIDAD:
1. Obtener blob actual
2. Calcular hash
3. Comparar con ultimo hash_after en logs
4. Si coincide: datos no han sido alterados fuera de sistema

5.2.2. Implementacion: Hash Chain (Blockchain-lite)

Basado en Cossack Labs - Audit Logs Security:

ESTRUCTURA DE HASH CHAIN:

Entry[0]:
{
  "sequence": 0,
  "timestamp": "2025-12-05T00:00:00Z",
  "event_hash": SHA-256(event_data),
  "prev_hash": "GENESIS",
  "chain_hash": SHA-256(sequence + timestamp + event_hash + prev_hash)
}

Entry[1]:
{
  "sequence": 1,
  "timestamp": "2025-12-05T00:01:00Z",
  "event_hash": SHA-256(event_data),
  "prev_hash": Entry[0].chain_hash,
  "chain_hash": SHA-256(sequence + timestamp + event_hash + prev_hash)
}

Entry[N]:
{
  "sequence": N,
  "timestamp": "...",
  "event_hash": SHA-256(event_data),
  "prev_hash": Entry[N-1].chain_hash,
  "chain_hash": SHA-256(...)
}

PROPIEDADES:
- Si se modifica Entry[K], todos los hashes desde K+1 se invalidan
- Deteccion de eliminacion: secuencia rota
- Deteccion de insercion: timestamps anomalos

5.2.3. Publicacion de Anchors

Para prevenir truncacion, se publican "anchors" periodicos:

Metodo Descripcion Frecuencia Costo
Blockchain publica Hash en Ethereum/Bitcoin Diario $1-50/tx
Timestamping Authority RFC 3161 TSA Por batch $0.01-0.10/ts
WORM Storage Write-once media Continuo $$/GB
Multi-party witness Varios terceros firman Diario Bajo

Recomendacion MedTime V1.0: Timestamping Authority RFC 3161 con batches cada hora.

5.3. Timestamps Verificables

5.3.1. RFC 3161 Timestamps

FLUJO DE TIMESTAMP VERIFICABLE:

1. Servidor genera digest de batch de logs:
   batch_hash = SHA-256(log_entries[1..N])

2. Solicitar timestamp a TSA:
   timestamp_token = TSA.sign(batch_hash, current_time)

3. Almacenar token:
   {
     "batch_id": "batch_20251205_1030",
     "entries_from": 10001,
     "entries_to": 10500,
     "batch_hash": "sha256:xyz...",
     "timestamp_token": "base64:...",
     "tsa_certificate": "...",
     "timestamp": "2025-12-05T10:30:00Z"
   }

4. Verificacion posterior:
   - Recalcular batch_hash de entries
   - Verificar firma del TSA
   - Confirmar timestamp es correcto

5.3.2. Proveedores TSA Recomendados

Proveedor Cumplimiento Costo Disponibilidad
DigiCert eIDAS, RFC 3161 $0.05/ts 99.99%
GlobalSign eIDAS, RFC 3161 $0.03/ts 99.9%
Entrust eIDAS, RFC 3161 $0.07/ts 99.99%

5.4. Counters Ciegos

5.4.1. Concepto

Registrar contadores de eventos sin contexto detallado, suficiente para detectar anomalias sin exponer PHI.

EJEMPLOS DE COUNTERS CIEGOS:

Por usuario (agregado mensual):
{
  "user_hash": "usr_7f8a9b2c",
  "period": "2025-12",
  "counters": {
    "logins": 47,
    "medication_views": 156,
    "medication_creates": 3,
    "medication_updates": 12,
    "medication_deletes": 1,
    "shares_initiated": 2,
    "shares_received": 0,
    "sync_events": 89,
    "errors": 3
  }
}

// NO incluye:
// - Que medicamentos
// - Cuando exactamente
// - Con quien compartio

DETECCION DE ANOMALIAS:
- Si un usuario normalmente tiene 50 medication_views/mes
- Y de repente tiene 5000
- Posible exfiltracion de datos
- Investigar SIN ver contenido

5.4.2. Aplicacion en MedTime

Counter Proposito Umbral de Anomalia
login_attempts Detectar brute force >10/hora
data_reads Detectar exfiltracion >100/hora
data_exports Detectar bulk export >5/dia
share_events Detectar comparticion masiva >10/dia
failed_decryptions Detectar ataques a claves >5/sesion

5.5. Auditor Tercero de Confianza

5.5.1. Modelo de Auditor Externo

flowchart TD
    subgraph "MedTime (No ve datos)"
        A[Servidor] --> B[Logs cifrados]
        A --> C[Metadata]
    end

    subgraph "Auditor Tercero Certificado"
        D[HSM con clave] --> E[Descifra logs]
        E --> F[Analisis]
        F --> G[Reportes anonimizados]
    end

    subgraph "Regulador"
        H[Solicitud de auditoria]
        I[Recibe reportes]
    end

    B --> D
    C --> D
    G --> I
    H --> D

5.5.2. Requisitos del Auditor Tercero

Requisito Descripcion Verificacion
Certificacion ISO 27001, SOC 2 Type II Certificado vigente
Independencia Sin relacion comercial con MedTime Declaracion jurada
Seguridad HSM FIPS 140-2 Level 3 Certificado hardware
Jurisdiccion Misma jurisdiccion que datos Contrato legal
Confidencialidad NDA con penalizaciones Contrato

5.5.3. Flujo de Auditoria con Tercero

1. SOLICITUD DE AUDITORIA (Regulador o Paciente):
   - Especificar alcance (fechas, eventos)
   - Justificacion legal
   - Autorizacion del paciente (si aplica)

2. PREPARACION (MedTime):
   - Extraer logs cifrados del periodo
   - Generar paquete con metadata
   - Enviar a Auditor Tercero

3. ANALISIS (Auditor):
   - Descifrar logs en ambiente seguro
   - Analizar segun criterios solicitados
   - Generar reporte anonimizado

4. ENTREGA (Auditor -> Solicitante):
   - Reporte sin PHI identificable
   - Hallazgos y conclusiones
   - Destruir copias descifradas

5. REGISTRO (MedTime):
   - Log de que auditoria ocurrio
   - Hash del reporte
   - Sin contenido del reporte

6. Manejo de Solicitudes ARCO

6.1. Acceso (El Usuario Descifra sus Propios Datos)

6.1.1. Flujo de Solicitud de Acceso

sequenceDiagram
    participant U as Usuario
    participant A as App MedTime
    participant S as Servidor
    participant L as Sistema de Logs

    U->>A: Solicitar mis datos
    A->>S: GET /api/v1/arco/access
    S->>L: Log: ARCO_ACCESS_REQUEST
    S->>S: Recopilar blobs cifrados
    S->>S: Recopilar metadata
    S->>S: Recopilar logs de acceso
    S->>A: Paquete cifrado + metadata
    A->>A: Descifrar con clave usuario
    A->>U: Mostrar datos
    L->>L: Log: ARCO_ACCESS_FULFILLED

6.1.2. Contenido del Paquete ARCO-Acceso

{
  "arco_request_id": "arco_acc_001",
  "generated_at": "2025-12-05T10:30:00Z",
  "data_controller": "MedTime Technologies",
  "data_subject_hash": "usr_7f8a9b2c",

  "encrypted_personal_data": {
    "profile": "base64_encrypted_blob...",
    "medications": ["blob1...", "blob2..."],
    "medical_events": ["blob3...", "blob4..."],
    "notes": ["blob5..."]
  },

  "metadata": {
    "account_created": "2024-01-15T08:00:00Z",
    "last_login": "2025-12-05T09:00:00Z",
    "total_logins": 547,
    "devices_registered": 2,
    "tier": "Pro",
    "storage_used_bytes": 15360000
  },

  "access_logs": [
    {
      "timestamp": "2025-12-04T10:00:00Z",
      "event": "DATA_READ",
      "resource_type": "MEDICATION",
      "result": "SUCCESS"
    }
    // ... ultimos 90 dias
  ],

  "consent_records": [
    {
      "purpose": "MEDICATION_REMINDERS",
      "granted_at": "2024-01-15T08:05:00Z",
      "status": "ACTIVE"
    }
  ],

  "third_party_sharing": [
    {
      "recipient_type": "HEALTHCARE_PROVIDER",
      "recipient_hash": "prov_abc123",
      "shared_at": "2025-06-01T10:00:00Z",
      "revoked_at": null
    }
  ]
}

6.1.3. Audit Log de Acceso ARCO

{
  "event_id": "evt_arco_001",
  "event_type": "ARCO_ACCESS_FULFILLED",
  "timestamp": "2025-12-05T10:30:00Z",
  "user_hash": "usr_7f8a9b2c",
  "request_id": "arco_acc_001",
  "delivery_method": "IN_APP_DOWNLOAD",
  "package_hash": "sha256:package_integrity_hash",
  "data_categories": ["PROFILE", "MEDICATIONS", "LOGS", "CONSENTS"],
  "items_count": 156,
  "response_time_ms": 3500
}

6.2. Rectificacion

6.2.1. Flujo de Rectificacion en Zero-Knowledge

PROBLEMA: Usuario quiere corregir un dato erroneo
         Servidor NO puede verificar si el dato es correcto

SOLUCION: El usuario es responsable de la veracidad

FLUJO:
1. Usuario identifica error en sus datos (client-side)
2. Usuario corrige el dato
3. Cliente re-cifra datos corregidos
4. Cliente sube nuevo blob
5. Servidor registra evento de rectificacion (sin ver contenido)

AUDIT LOG:
{
  "event": "ARCO_RECTIFICATION",
  "user_hash": "usr_7f8a9b2c",
  "timestamp": "2025-12-05T11:00:00Z",
  "resources_modified": 1,
  "old_hash": "sha256:abc...",
  "new_hash": "sha256:def...",
  "user_attestation": true  // Usuario afirma que correccion es veraz
}

6.2.2. Consideraciones Legales de Rectificacion

Aspecto Implicacion Mitigacion
Veracidad MedTime no puede verificar Usuario firma declaracion
Trazabilidad Se pierde version anterior Mantener hash de version previa
Disputas Imposible resolver sin descifrar Proceso de mediacion

6.3. Cancelacion (Derecho al Olvido)

6.3.1. Tipos de Cancelacion

CANCELACION PARCIAL:
- Usuario solicita eliminar categoria especifica
- Ej: "Eliminar todos mis medicamentos"
- Blobs de esa categoria se eliminan
- Otros datos permanecen

CANCELACION TOTAL:
- Usuario solicita eliminar cuenta completa
- Periodo de gracia de 30 dias
- Tras periodo: eliminacion irreversible
- Backup cifrado ofrecido antes

CANCELACION POR INACTIVIDAD:
- Si usuario inactivo por 24 meses
- Notificaciones de advertencia
- Tras 30 dias sin respuesta: cancelacion

6.3.2. Proceso de Cancelacion Auditable

flowchart TD
    A[Solicitud de Cancelacion] --> B{Tipo?}
    B -->|Parcial| C[Identificar blobs]
    B -->|Total| D[Marcar cuenta para eliminacion]

    C --> E[Eliminar blobs]
    D --> F[Periodo de gracia 30 dias]

    E --> G[Log: ARCO_CANCELLATION_PARTIAL]
    F --> H{Usuario cancelo solicitud?}

    H -->|Si| I[Reactivar cuenta]
    H -->|No| J[Eliminar todo]

    I --> K[Log: ARCO_CANCELLATION_ABORTED]
    J --> L[Log: ARCO_CANCELLATION_COMPLETED]

    L --> M[Retener logs minimos por 5 anos]

6.3.3. Datos Retenidos Post-Cancelacion

Segun LFPDPPP y HIPAA, ciertos datos deben retenerse incluso despues de cancelacion:

Dato Retencion Justificacion
Logs de auditoria 5 anos (LFPDPPP) / 6 anos (HIPAA) Requisito legal
Registros de consentimiento 5 anos desde cancelacion Prueba de base legal
Hash de usuario Permanente (desvinculado) Prevenir reuso
Facturacion Segun ley fiscal local Requisito contable

6.4. Oposicion

6.4.1. Escenarios de Oposicion en MedTime

ESCENARIO 1: Oposicion a comparticion
- Usuario compartio datos con medico
- Ahora quiere revocar acceso
- Accion: Revocar tokens de acceso del medico

ESCENARIO 2: Oposicion a analytics
- Usuario consintio a analytics anonimos
- Ahora se opone
- Accion: Excluir de futuros analytics, eliminar datos historicos

ESCENARIO 3: Oposicion a comunicaciones
- Usuario recibe recordatorios de medicamentos
- Se opone a notificaciones
- Accion: Desactivar notificaciones (puede afectar funcionalidad)

ESCENARIO 4: Oposicion a procesamiento automatizado
- MedTime usa ML para sugerir horarios
- Usuario se opone a decisiones automatizadas
- Accion: Desactivar sugerencias ML

6.4.2. Audit Log de Oposicion

{
  "event_id": "evt_oposicion_001",
  "event_type": "ARCO_OPPOSITION",
  "timestamp": "2025-12-05T12:00:00Z",
  "user_hash": "usr_7f8a9b2c",
  "opposition_scope": "THIRD_PARTY_SHARING",
  "affected_recipients": ["prov_abc123", "prov_def456"],
  "effective_date": "2025-12-05T12:00:00Z",
  "user_notification": true,
  "recipients_notified": true
}

7. Implementacion Recomendada V1.0

7.1. Que Auditar

7.1.1. Matriz de Eventos y Nivel de Detalle

Categoria Eventos Detalle PHI Incluido
Autenticacion Login, Logout, MFA Alto No
Sesiones Crear, Revocar, Expirar Alto No
Datos CRUD operations Medio No (solo hashes)
Comparticion Iniciar, Aceptar, Revocar Alto No (solo IDs)
ARCO Todas las solicitudes Alto No
Errores Excepciones, Fallos Alto No (sin stack traces PHI)
Sistema Sync, Keys, Devices Medio No

7.1.2. Esquema de Audit Log V1.0

{
  "$schema": "medtime-audit-log-v1",
  "event": {
    "id": "string (UUID v7)",
    "type": "enum (ver catalogo)",
    "timestamp": "ISO 8601 con microsegundos",
    "sequence": "integer autoincremental"
  },
  "actor": {
    "type": "enum (USER, SYSTEM, ADMIN, API)",
    "id_hash": "string (blind index)",
    "session_id": "string",
    "device_id": "string",
    "ip_hash": "string (opcional)"
  },
  "action": {
    "verb": "enum (CREATE, READ, UPDATE, DELETE, ...)",
    "resource_type": "enum (MEDICATION, PROFILE, SHARE, ...)",
    "resource_id": "string (ID, no contenido)",
    "result": "enum (SUCCESS, FAILURE, PARTIAL)",
    "error_code": "string (si aplica)"
  },
  "integrity": {
    "resource_hash_before": "string (si aplica)",
    "resource_hash_after": "string (si aplica)",
    "payload_hash": "string (hash de este log entry)"
  },
  "chain": {
    "prev_hash": "string (hash del entry anterior)",
    "chain_hash": "string (hash de cadena)"
  },
  "metadata": {
    "app_version": "string",
    "platform": "enum (IOS, ANDROID, WEB)",
    "additional": "object (datos no-PHI adicionales)"
  }
}

7.1.3. Catalogo de Tipos de Evento

AUTENTICACION:
- AUTH_LOGIN_SUCCESS
- AUTH_LOGIN_FAILED
- AUTH_LOGOUT
- AUTH_MFA_CHALLENGE
- AUTH_MFA_SUCCESS
- AUTH_MFA_FAILED
- AUTH_PASSWORD_CHANGED
- AUTH_RECOVERY_INITIATED
- AUTH_RECOVERY_COMPLETED

SESIONES:
- SESSION_CREATED
- SESSION_REFRESHED
- SESSION_EXPIRED
- SESSION_REVOKED

DATOS:
- DATA_CREATED
- DATA_READ
- DATA_UPDATED
- DATA_DELETED
- DATA_EXPORTED

COMPARTICION:
- SHARE_INITIATED
- SHARE_ACCEPTED
- SHARE_DECLINED
- SHARE_REVOKED
- SHARE_EXPIRED
- SHARE_ACCESSED

ARCO:
- ARCO_ACCESS_REQUESTED
- ARCO_ACCESS_FULFILLED
- ARCO_RECTIFICATION_REQUESTED
- ARCO_RECTIFICATION_COMPLETED
- ARCO_CANCELLATION_REQUESTED
- ARCO_CANCELLATION_COMPLETED
- ARCO_OPPOSITION_REQUESTED
- ARCO_OPPOSITION_APPLIED

CONSENTIMIENTO:
- CONSENT_GRANTED
- CONSENT_WITHDRAWN
- CONSENT_EXPIRED

SISTEMA:
- SYNC_STARTED
- SYNC_COMPLETED
- SYNC_FAILED
- KEY_ROTATED
- DEVICE_REGISTERED
- DEVICE_REMOVED

SEGURIDAD:
- SECURITY_ANOMALY_DETECTED
- SECURITY_RATE_LIMIT_EXCEEDED
- SECURITY_SUSPICIOUS_ACTIVITY

7.2. Como Almacenar

7.2.1. Arquitectura de Almacenamiento

+------------------+     +------------------+     +------------------+
|   APP CLIENT     |     |   API GATEWAY    |     |   AUDIT SERVICE  |
+------------------+     +------------------+     +------------------+
|                  |     |                  |     |                  |
| Generar evento   |---->| Validar request  |---->| Recibir evento   |
|                  |     | Agregar metadata |     | Validar schema   |
|                  |     |                  |     | Agregar sequence |
+------------------+     +------------------+     | Calcular hashes  |
                                                  | Encadenar        |
                                                  +--------+---------+
                                                           |
                    +--------------------------------------+
                    |
          +---------+---------+
          |                   |
+---------v---------+ +-------v---------+
|   HOT STORAGE     | |  COLD STORAGE   |
| (PostgreSQL)      | | (S3 + Glacier)  |
+-------------------+ +-----------------+
| - Ultimos 90 dias | | - Historico     |
| - Indices rapidos | | - Comprimido    |
| - Full-text search| | - Cifrado       |
+-------------------+ +-----------------+
          |
          v
+---------+---------+
|   TSA SERVICE     |
| (Timestamping)    |
+-------------------+
| - Batch cada hora |
| - RFC 3161        |
| - Anchor externo  |
+-------------------+

7.2.2. Esquema de Base de Datos

-- Tabla principal de audit logs
CREATE TABLE audit_logs (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    sequence BIGSERIAL NOT NULL,
    event_type VARCHAR(50) NOT NULL,
    timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(),

    -- Actor
    actor_type VARCHAR(20) NOT NULL,
    actor_id_hash VARCHAR(64) NOT NULL,
    session_id VARCHAR(64),
    device_id VARCHAR(64),
    ip_hash VARCHAR(64),

    -- Action
    action_verb VARCHAR(20) NOT NULL,
    resource_type VARCHAR(50),
    resource_id VARCHAR(64),
    result VARCHAR(20) NOT NULL,
    error_code VARCHAR(50),

    -- Integrity
    resource_hash_before VARCHAR(64),
    resource_hash_after VARCHAR(64),
    payload_hash VARCHAR(64) NOT NULL,

    -- Chain
    prev_hash VARCHAR(64) NOT NULL,
    chain_hash VARCHAR(64) NOT NULL,

    -- Metadata
    app_version VARCHAR(20),
    platform VARCHAR(20),
    additional JSONB,

    -- Indexes
    CONSTRAINT unique_sequence UNIQUE (sequence),
    CONSTRAINT unique_chain_hash UNIQUE (chain_hash)
);

-- Indices para consultas comunes
CREATE INDEX idx_audit_timestamp ON audit_logs(timestamp);
CREATE INDEX idx_audit_actor ON audit_logs(actor_id_hash);
CREATE INDEX idx_audit_event_type ON audit_logs(event_type);
CREATE INDEX idx_audit_resource ON audit_logs(resource_type, resource_id);

-- Tabla de timestamps externos (anchors)
CREATE TABLE audit_anchors (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    batch_id VARCHAR(64) NOT NULL,
    sequence_from BIGINT NOT NULL,
    sequence_to BIGINT NOT NULL,
    batch_hash VARCHAR(64) NOT NULL,
    timestamp_token BYTEA NOT NULL,
    tsa_provider VARCHAR(100) NOT NULL,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),

    CONSTRAINT unique_batch UNIQUE (batch_id)
);

7.2.3. Seguridad del Almacenamiento

Capa Medida Implementacion
Transporte TLS 1.3 Obligatorio
Reposo AES-256 Managed encryption
Acceso RBAC Solo admin de auditoria
Integridad Hash chain Verificacion continua
Disponibilidad Replicacion Multi-AZ
Immutabilidad Append-only Triggers de BD

7.3. Retencion

7.3.1. Politica de Retencion por Tipo de Evento

Categoria Hot Storage Cold Storage Total
Autenticacion 90 dias 5 anos 5 anos
Sesiones 30 dias 2 anos 2 anos
Datos (CRUD) 90 dias 6 anos 6 anos (HIPAA)
Comparticion 90 dias 5 anos 5 anos
ARCO 365 dias 10 anos 10 anos
Consentimiento 365 dias Indefinido Mientras aplique
Sistema 30 dias 1 ano 1 ano
Seguridad 365 dias 10 anos 10 anos

7.3.2. Proceso de Archivado

FLUJO DE ARCHIVADO:

1. DIARIO (02:00 UTC):
   - Identificar logs > 90 dias en hot storage
   - Comprimir con gzip
   - Cifrar con clave de archivado
   - Subir a S3 con lifecycle policy
   - Verificar integridad post-upload
   - Eliminar de hot storage

2. MENSUAL (primer domingo):
   - Verificar integridad de hash chain
   - Generar reporte de anomalias
   - Mover archivos > 1 ano a Glacier
   - Actualizar indices de busqueda

3. ANUAL (enero 1):
   - Auditar politicas de retencion
   - Eliminar logs que exceden retencion
   - Generar certificado de destruccion
   - Revisar costos de almacenamiento

7.3.3. Destruccion Segura

PROCESO DE DESTRUCCION:

1. IDENTIFICACION:
   - Query: logs con retention_expires < NOW()
   - Generar lista de IDs a destruir

2. VERIFICACION:
   - Confirmar que no hay holds legales
   - Verificar que no hay investigaciones activas
   - Obtener aprobacion automatizada o manual

3. DESTRUCCION:
   - Hot storage: DELETE con vacuum
   - Cold storage: Lifecycle policy a delete
   - Glacier: Initiate vault lock deletion

4. CERTIFICACION:
   - Generar certificado de destruccion
   - Incluir: rango de IDs, fecha, metodo
   - Firmar con clave de compliance
   - Almacenar certificado por 10 anos

5. AUDIT:
   - Log de la destruccion misma
   - Este log se retiene 10 anos

8. Conclusiones

8.1. Viabilidad de Auditoria Zero-Knowledge

La auditoria en arquitectura zero-knowledge es viableycumple con requisitos regulatorios cuando se implementa correctamente:

Requisito Regulatorio Estrategia Cumplimiento
LFPDPPP: Trazabilidad Metadata + blind index CUMPLE
LFPDPPP: ARCO Usuario descifra CUMPLE
HIPAA: Audit controls Logs de metadata CUMPLE
HIPAA: Integrity Hash chain CUMPLE
LGPD: DSAR Paquete cifrado CUMPLE
Todos: Retencion Politica configurable CUMPLE

8.2. Trade-offs Aceptados

Aspecto Ganancia Perdida
Privacidad Maxima proteccion PHI Soporte tecnico limitado
Compliance Cumple regulaciones Mayor complejidad operativa
Investigacion Logs seguros No se puede ver contenido
Usabilidad Confianza del usuario Recuperacion compleja

8.3. Recomendaciones Finales

8.3.1. Para V1.0

  1. Implementar inmediatamente:
  2. Audit logs de metadata sin PHI
  3. Hash chain para integridad
  4. Timestamps RFC 3161
  5. Counters ciegos para anomalias

  6. Diferir a V1.1:

  7. Auditor tercero de confianza
  8. Audit logs cifrados con PHI

  9. Diferir a V2.0+:

  10. Searchable encryption sobre logs
  11. Blockchain para anchoring

8.3.2. Checklist de Implementacion V1.0

  • Definir esquema de audit log
  • Implementar hash chain
  • Configurar almacenamiento hot/cold
  • Integrar con TSA
  • Implementar flujos ARCO
  • Crear dashboard de anomalias
  • Documentar politicas de retencion
  • Entrenar equipo de soporte
  • Auditar implementacion

9. Referencias

9.1. Fuentes Regulatorias

9.2. Fuentes Tecnicas - Audit Logs Criptograficos

9.3. Fuentes Tecnicas - Zero-Knowledge y E2E

9.4. Documentos MedTime Relacionados


Documento generado por KnowledgeDrone y ComplianceDrone para SpecQueen - "En el universo zero-knowledge, la auditoria no es ver los datos, es demostrar que el proceso fue correcto. Tus logs seran asimilados... en una cadena de hashes inmutable."