Seguridad

Fiscal-Web se diseñó para tratar datos fiscales reales: certificados digitales (.pfx), contraseñas SOL, RUC, facturas. Estos son los compromisos técnicos vigentes.

Cifrado en reposo

Cada certificado .pfx y cada contraseña SOL se cifra con AES-GCM usando una DEK (Data Encryption Key) única por tenant. Las DEKs se almacenan en Supabase Vault, cifradas con la KEK gestionada por Supabase.

El operador nunca ve tus credenciales en plano: ni la base de datos, ni los buckets de Storage, ni los logs.

Aislamiento multi-tenant

Todos los accesos a base de datos pasan por Row-Level Security de Postgres con dos contextos obligatorios: app.tenant_id y app.mode (live/test). Sin contexto, las queries devuelven cero filas.

Auth y API keys

  • Las API keys (fwk_live_*, fwk_test_*) se guardan solo como hash bcrypt + cost 12. El token completo solo se ve UNA vez al crearlo.
  • Auth de la console usa Supabase Auth (sesión JWT) con opción de 2FA TOTP.
  • Rotación: cualquier key puede revocarse en segundos.

Cifrado en tránsito

TLS 1.3 obligatorio en todos los endpoints públicos. HSTS con max-age=31536000; includeSubDomains; preload. Certificados gestionados por Supabase + GitHub Pages.

Webhooks salientes

Firmados con HMAC-SHA256 usando un secret único por endpoint (whsec_*). Tu servicio verifica con la fórmula documentada en /docs/webhooks#verify. Reintentos con backoff exponencial; tras 8 fallos en ~45h el evento queda como dead.

Logs y auditoría

  • Cada request a la API queda registrada 30 días con request ID, status, tenant, key prefix (NO el token).
  • Eventos sensibles (creación/revocación de keys, cambios de membership, exportaciones) van a una bitácora con hash-chain.

Cumplimiento

RGPD-Perú (Ley 29733). Export "mis datos" disponible vía /me/export. Borrado completo tras 90d de cancelación.

Reporte de vulnerabilidades

Escríbenos a security@fiscal-web.pe con PGP. Respondemos en < 48h.