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 [email protected] con PGP. Respondemos en < 48h.