Creado para la era cuántica
UniAuth está diseñado desde cero con la seguridad como valor por defecto, no añadida después. Cada hash, cada token, cada sesión está protegido con criptografía que resiste los ataques de hoy y de mañana.
Cimientos criptográficos
Cifrado en reposo AES-256-GCM
Cada valor sensible — secretos TOTP, tokens de acceso OAuth, claves privadas PQC, contraseñas de enlace LDAP — se cifra con AES-256-GCM antes de tocar la base de datos. Formato: iv:tag:ciphertext.
La clave de cifrado es un secreto de 256 bits independiente (ENCRYPTION_KEY), no derivado del secreto JWT. Rotar uno no compromete el otro.
Firmas de sesión ML-DSA-44
Cada sesión lleva una firma digital poscuántica (FIPS 204 ML-DSA-44, antes CRYSTALS-Dilithium). En cada solicitud, touchSession() verifica la firma; cualquier discrepancia revoca la sesión de inmediato y registra el evento.
Incluso si una firma clásica ECDSA o RSA fuera vulnerada por un ordenador cuántico, las sesiones ML-DSA siguen siendo seguras.
Hash de contraseñas Argon2id
Las contraseñas nuevas usan Argon2id (recomendado por OWASP: 64 MB de memoria, 3 iteraciones, 4 de paralelismo). Los hashes bcrypt heredados se migran de forma transparente al iniciar sesión. La fortaleza de la contraseña se evalúa con zxcvbn (puntuación ≥ 2 requerida) y se comprueba con la API de k-anonimato de HaveIBeenPwned.
Identificadores de sujeto por pares
Las apps conectadas nunca ven tu UUID real. Cada app recibe un identificador único, determinista y específico de la app: HMAC-SHA256(userId:clientId, secret). Las apps no pueden correlacionar usuarios entre servicios — tu privacidad es estructural, no basada en políticas.
Protección en tiempo de ejecución
Detección adaptativa de amenazas
Puntuación estadística del riesgo de inicio de sesión en 6 factores: IP nueva, user-agent nuevo, hora inusual, ráfaga de intentos fallidos, anomalía geográfica y confianza del dispositivo. Los inicios de sesión de alto riesgo activan automáticamente 2FA reforzada o un CAPTCHA.
Bloqueo progresivo de la cuenta
5 fallos = 1 min, 10 = 5 min, 15 = 15 min, 20+ = 1 hora. Devuelve un 401 genérico (sin enumeración de cuentas). Se restablece tras una autenticación correcta. El bloqueo se aplica por igual a los flujos de contraseña, passkey y enlace mágico.
Ciclo de vida de la sesión
Tiempo de inactividad de 24 horas + vida útil absoluta de 30 días. Huella SHA-256 (IP + UA) verificada en cada solicitud; cualquier discrepancia termina la sesión de inmediato. Máximo 10 sesiones simultáneas por usuario, se expulsa la más antigua.
Salidas a prueba de SSRF
Cada solicitud HTTP saliente (webhooks, descubrimiento OIDC, cierre de sesión backchannel) pasa por safeFetch — resuelta por DNS, fijada a la dirección IP validada. El rebinding de DNS entre la comprobación y la conexión del socket es imposible.
CORS + CSP + limitación de tasa
CORS estricto del mismo origen en todas las rutas de API. CSP con frame-ancestors 'none'. Limitación de tasa de doble capa (en memoria + ventana deslizante Redis). Umbrales por ruta ajustados al perfil de riesgo de cada punto de conexión.
Todo en tiempo constante
Cada comparación de hash, verificación de token, comprobación de código de respaldo y búsqueda de token SCIM usa crypto.timingSafeEqual. Sin canales laterales de temporización, en ningún sitio.
Cumplimiento y auditoría
Cada acción se registra, cada cadena se verifica, cada exportación se redacta.