Trabajo de Fin de Grado · Ingeniería Informática
Autenticación FIDO2 y Zero Trust con Criptografía Post-Cuántica
Diseño de una arquitectura de microservicios con un servidor Relying Party FIDO2 en Go que valida firmas post-cuánticas ML-DSA (FIPS 204).
Resumen
Los algoritmos de firma y establecimiento de claves vigentes —RSA, ECDSA y ECDH— resultan vulnerables frente a un ordenador cuántico de gran escala, como consecuencia del algoritmo de Shor [20]. Ante esta amenaza, el NIST publicó en agosto de 2024 los primeros estándares de criptografía post-cuántica: ML-KEM (FIPS 203) [1], ML-DSA (FIPS 204) [2] y SLH-DSA (FIPS 205) [3]. Este documento recoge la Fase 1 del TFG: el estudio de dichos estándares, el análisis del protocolo FIDO2/WebAuthn y su codificación criptográfica COSE, el diseño de una arquitectura de microservicios según los principios Zero Trust del NIST SP 800-207 [4], el plan de trabajo y la estructura de la memoria. El objetivo del proyecto es implementar y evaluar empíricamente un servidor Relying Party capaz de verificar firmas ML-DSA durante las ceremonias de registro y autenticación de WebAuthn, comparando su rendimiento con la criptografía tradicional.
1Estándares del NIST: el nuevo corpus post-cuántico
El 13 de agosto de 2024 el NIST publicó los tres primeros estándares finales de criptografía post-cuántica, culminando el proceso de estandarización abierto iniciado en 2016 [6]. Constituyen la base normativa de este proyecto.
FIPS 203Mecanismo de encapsulación de claves (KEM)
ML-KEM — Module-Lattice-Based Key-Encapsulation Mechanism, derivado de CRYSTALS-Kyber [22]. Su seguridad se apoya en la dificultad del problema Module Learning With Errors. Sustituye a ECDH/DH en el establecimiento de claves simétricas y es el esquema recomendado por defecto [1].
FIPS 204Firmas digitales
ML-DSA — Module-Lattice-Based Digital Signature Algorithm, derivado de CRYSTALS-Dilithium [21], con construcción Fiat-Shamir with Aborts. Sustituye a RSA/ECDSA. Es el algoritmo central de este TFG: valida la firma de las aserciones WebAuthn [2].
FIPS 205Firmas digitales
SLH-DSA — Stateless Hash-Based Digital Signature Standard, derivado de SPHINCS+. Seguridad basada exclusivamente en funciones hash; firmas de gran tamaño (~7–8 KB). Se contempla como alternativa conservadora y para el firmado de firmware en la fase extendida [3]. El estándar FN-DSA (Falcon) permanece en desarrollo.
| Fecha | Hito |
|---|---|
| 2016 | Lanzamiento del proyecto de estandarización PQC del NIST (69 candidaturas). |
| 2022 | Selección de los algoritmos: Kyber, Dilithium, Falcon y SPHINCS+. |
| 13-08-2024 | Publicación final de FIPS 203, 204 y 205 (efectivos desde la misma fecha). |
| 2024–2030 | Periodo de transición; NIST IR 8547 declara RSA/ECC/DSA deprecated hacia 2030 [7]. |
| 2035 | Retirada completa de los algoritmos vulnerables a lo cuántico. CNSA 2.0 exige firmas PQC hacia 2030–2033. |
1.1FIPS 203 · ML-KEM (CRYSTALS-Kyber)
Un KEM permite que dos partes establezcan un secreto compartido de 256 bits sobre un canal público; dicho secreto alimenta primitivas simétricas (AES-GCM, ChaCha20) o un HKDF [1]. Interfaz: KeyGen → (ek, dk), Encaps(ek) → (K, c), Decaps(dk, c) → K.
1.1.1 Funcionamiento interno
- Base matemática: problema Module Learning With Errors (M-LWE) sobre Zq[X]/(X²⁵⁶+1), con
q = 3329yn = 256. - NTT: multiplicación polinómica en el dominio de la transformada de números teóricos, O(n·log n).
- Transformada de Fujisaki–Okamoto: convierte un PKE determinista en un KEM resistente a CCA. La versión final emplea explicit rejection con el hash J(z‖c).
- Fallos de descapsulación: probabilidad < 2⁻¹³⁹; sin fallo explícito para entradas bien formadas.
- Almacenamiento por semilla: las claves pueden conservarse como semillas de 32/64 bytes (d, z).
- Las propiedades de uso de KEM se recogen en SP 800-227 [1].
1.1.2 Parámetros y tamaños
| Conjunto | Cat. NIST | ek | dk | ciphertext | secreto |
|---|---|---|---|---|---|
| ML-KEM-512 | 1 (≈AES-128) | 800 | 1 632 | 768 | 32 |
| ML-KEM-768 | 3 (≈AES-192) | 1 184 | 2 400 | 1 088 | 32 |
| ML-KEM-1024 | 5 (≈AES-256) | 1 568 | 3 168 | 1 568 | 32 |
Parámetros: k = 2/3/4, η₁ = 2–3, η₂ = 2, du = 10–11, dv = 4–5. Referencia comparativa: una clave pública ECDH P-256 ocupa 65 bytes, de modo que ML-KEM-768 resulta ~18× mayor; su coste computacional, en cambio, es comparable o inferior al de X25519.
La amenaza «harvest now, decrypt later» aconseja hibridar desde el primer momento: se combina un intercambio clásico (X25519) con ML-KEM-768, de forma que la sesión permanece segura si al menos uno de los dos esquemas resiste [23]. Grupos TLS: X25519Kyber768Draft00 (0x6399, Go 1.23+) y el estándar X25519MLKEM768 (0x11EC, por defecto desde Go 1.24). Coste: el ClientHello crece ~1 216 bytes (clave pública de 1 184 B) y el ServerHello ~1 120 B (ciphertext de 1 088 B). OpenSSL ≥ 3.5 lo incorpora por omisión.
// Go: servidor con negociación híbrida post-cuántica
srv := &http.Server{
Addr: ":8443",
TLSConfig: &tls.Config{
MinVersion: tls.VersionTLS13,
CurvePreferences: nil, // vacío ⇒ habilita X25519MLKEM768 por defecto
},
}1.2FIPS 204 · ML-DSA (CRYSTALS-Dilithium)
Esquema de firma de retículos con seguridad SUF-CMA (strong existential unforgeability under chosen-message attack), basado en los problemas M-LWE y SelfTargetMSIS. Constituye el reemplazo de ECDSA/RSA y el núcleo criptográfico de este proyecto [2].
1.2.1 Los tres algoritmos
ML-DSA.KeyGen()— genera (pk, sk) a partir de la semilla ξ (32 B); la matriz  se expande con SHAKE-128.ML-DSA.Sign(sk, M, ctx, rnd)— firma σ. Rejillas y compresión (hint) para reducir tamaño; aleatoriedad externa opcionalrnd(32 B) o modo determinista; contextoctx≤ 255 bytes para separación de dominios.ML-DSA.Verify(pk, M, σ, ctx)— verificación booleana de la ecuación Az − c·t̂ ≈ w₁·2ᵈ comprimida.
HashML-DSA: variante pre-hash con dominio separado, prevista para módulos que ya calculan el hash del mensaje (HSM/TPM) con mensajes de gran tamaño.
Las claves admiten representación por semilla ξ; el precálculo de  acelera firma y verificación.
1.2.2 Parámetros y tamaños
| Conjunto | Cat. | sk | pk | firma σ | COSE |
|---|---|---|---|---|---|
| ML-DSA-44 | 2 | 2 560 | 1 312 | 2 420 | −48 |
| ML-DSA-65 | 3 | 4 032 | 1 952 | 3 309 | −49 |
| ML-DSA-87 | 5 | 4 896 | 2 592 | 4 627 | −50 |
Comparativa: una firma ECDSA P-256 (ES256) ocupa ≈64 B y su clave pública 65 B; la firma ML-DSA-65 es, por tanto, ~52× mayor. Este sobrecoste es el principal obstáculo de integración en FIDO2 (tamaños CBOR, almacenamiento de credenciales, latencia).
El servidor RP recibirá authenticatorData ‖ SHA-256(clientDataJSON) como mensaje M y la firma σ del autenticador; la verificación se realizará con la biblioteca CIRCL [15]:
import "github.com/cloudflare/circl/sign/mldsa/mldsa65"
pk, _ := mldsa65.Scheme().UnmarshalBinaryPublicKey(pubKeyBytes)
ok := mldsa65.Scheme().Verify(pk, msg, sig, nil) // ctx opcional
if !ok { /* rechazar la aserción */ }Estado del ecosistema (septiembre de 2026): CIRCL implementa el estándar final FIPS 204 desde v1.5.0 [15]; crypto/mlkem figura en la biblioteca estándar de Go (1.24) y crypto/mldsa público está propuesto para Go 1.27; OpenSSL 3.5+, Node.js 24.5+ y Java 24 (JEP 497) ya operan con ML-DSA [23].
2FIDO2 / WebAuthn: análisis del protocolo
FIDO2 se compone de WebAuthn (W3C) y CTAP2 (FIDO Alliance) [8]. Proporciona autenticación sin contraseñas, resistente a phishing, con credenciales de clave pública generadas dentro del autenticador y que nunca abandonan el dispositivo.
2.1 Arquitectura del protocolo
+-----------+ WebAuthn JS (HTTPS) +---------+ CTAP2 (CBOR) +---------------+
| Relying | --------------------->| Cliente | -------------->| Autenticador |
| Party RP | <---------------------| (naveg.)| <--------------| (plataf./roam)|
+-----------+ attestation/assertion +---------+ USB·NFC·BLE +---------------+- WebAuthn define la API:
navigator.credentials.create()(registro) y.get()(acceso). El nivel 3 es ya Recomendación W3C (2026) y el nivel 4 está en elaboración [8]. - CTAP2 es el protocolo binario navegador↔llave, serializado en CBOR (RFC 8949): comandos
authenticatorMakeCredentialyauthenticatorGetAssertion. - El RP ID (dominio efectivo) vincula la credencial al origen: el autenticador firma siempre el hash del RP ID, lo que confiere inmunidad frente a phishing.
2.2 Las dos ceremonias
- Registro (attestation). El RP emite un challenge; el autenticador genera el par de claves del credencial y devuelve
{fmt, authData, attStmt}. El RP verifica firma, origin, challenge y, opcionalmente, la cadena de atestación (FIDO MDS, AAGUID) [9]. - Autenticación (assertion). El autenticador firma
authData ‖ SHA-256(clientDataJSON)con la clave privada del credencial. El RP comprueba el contador (anti-clonación), los indicadores UP/UV, el origen y el challenge de un solo uso.
clientDataJSON: {type, challenge, origin, crossOrigin}. authData: rpIdHash (32 B) ‖ flags (UP 0x01, UV 0x04, AT 0x40, ED 0x80) ‖ contador (4 B) ‖ [AAGUID 16 B ‖ L 2 B ‖ credId ‖ COSE_Key].
COSE (CBOR Object Signing and Encryption, RFC 9052/9053 [11]) es el formato binario compacto con el que WebAuthn transporta claves públicas y designa algoritmos; los identificadores empleados por WebAuthn se registran en RFC 8812 [10]. Un COSE_Key es un mapa CBOR: 1: kty, 3: alg, -1: crv, -2/-3: coordenadas.
| Nombre | Valor COSE | Descripción | Situación en WebAuthn |
|---|---|---|---|
| ES256 | −7 | ECDSA con SHA-256, curva P-256 | Requerido — estándar de facto actual |
| EdDSA | −8 | Ed25519 / Ed448 (OKP) | Recomendado |
| RS256 | −257 | RSASSA-PKCS1-v1_5 con SHA-256 | Requerido (legado) |
| PS256 | −37 | RSASSA-PSS con SHA-256 | Recomendado |
| ML-DSA-44 | −48 | FIPS 204, categoría 2 | Pendiente en IANA — borrador IETF [12] |
| ML-DSA-65 | −49 | FIPS 204, categoría 3 | Pendiente en IANA (valor solicitado −49) [12] |
| ML-DSA-87 | −50 | FIPS 204, categoría 5 | Pendiente en IANA (valor solicitado −50) [12] |
El Internet-Draft ML-DSA for Web Authentication [13] define la incorporación de ML-DSA (FIPS 204) a WebAuthn: únicamente la clave pública se codifica en COSE dentro de authData, y la firma ML-DSA sustituye a ECDSA tanto en el attStmt como en la aserción. El documento Server Requirements de FIDO2 v2.3 (review draft, 2026) ya referencia estos algoritmos [9].
2.4 Impacto PQC en FIDO2
- Tamaño: claves públicas de 1 312–2 592 B y firmas de 2 420–4 627 B frente a los ~64–256 B clásicos; los mensajes CBOR crecen, así como la memoria flash requerida en el token.
- Ausencia de hardware nativo: no existen aún SE/TPM/TEE con soporte ML-DSA (2026); los borradores exigen cifrar las credenciales con AES-256-GCM y almacenar claves en almacenamiento seguro [13].
- Transporte CTAP: los mensajes CTAP2 de >1 KB requieren fragmentación; la hibridación clásico+PQC se propone como vía de transición.
- Hoja de ruta de la FIDO Alliance [14]: transición «seamless», seguimiento activo de NIST/ISO y alineación de los grupos de trabajo (WebAuthn L4 y CTAP 2.3+ incorporarán PQC).
2.5 Precedentes experimentales (estado del arte)
- sandbox-quantum/pqc-fido2-impl, con Nitrokey y SoloKeys (framework Trussed): FIDO2 extremo a extremo con Dilithium3 y Kyber768 mediante PQClean y liboqs [16].
- The Qey [17]: llave ARM con ML-DSA-44/65 vía OQS sobre CTAP-HID, con medición de rendimiento frente a ES256; emplea los identificadores −48/−49.
- Hoja de ruta PQC de Chromium [18]: cuatro etapas hacia una PKI post-cuántica (certificados Merkle Tree, claves TLS ML-DSA); contexto de transición del ecosistema.
- Nitrokey 3 [19]: firmware Rust (Trussed) actualizable; plataforma candidata para la fase extendida del TFG.
3Diseño de arquitectura: microservicios Zero Trust
Marco normativo de referencia: NIST SP 800-207 (Zero Trust Architecture, 2020) [4] y SP 800-207A (modelo ZTA para aplicaciones cloud-native y microservicios, 2023) [5], con la serie SP 800-204 para la seguridad en service meshes.
3.1 Los siete principios aplicados al proyecto
- Verificación continua: ninguna petición confía por su ubicación; todo el tráfico interno exige mTLS con identidad criptográfica del servicio.
- Privilegio mínimo: cada microservicio solo puede invocar los endpoints que necesita (política declarativa, estilo OPA).
- Microsegmentación: la red Docker se divide por planos (edge, dominio, datos) con rutas explícitas únicamente.
- Consciencia de recursos: el motor de políticas decide con identidad y estado (contador de firmas, revocación).
- Autenticación y autorización explícitas por sesión: sesiones cortas en Redis con TTL.
- Recolección continua de información: métricas, registros estructurados y trazas (OpenTelemetry).
- Dinamismo: política evaluable en caliente; punto de aplicación (PEP) en la pasarela.
3.2 Componentes ZTA (SP 800-207)
- PE — Policy Engine: decide el acceso; en el proyecto, módulo de autorización de la pasarela con reglas declarativas.
- PA — Policy Administrator: establece y revoca sesiones; emite tokens de servicio.
- PEP — Policy Enforcement Point: aplica las decisiones (proxy de entrada + middleware mTLS).
- Fuentes de datos: registro de credenciales FIDO2 (PostgreSQL) y estado de sesión (Redis).
MVP: mTLS clásico interno con certificados de servicio de vida corta y CA propia. Fase extendida: hibridación X25519MLKEM768 en los mismos túneles.
| Servicio | Puerto (interno) | Responsabilidad | Dependencias |
|---|---|---|---|
| api-gateway | 443 → 8080 | Ingress TLS 1.3, PEP Zero Trust, limitación de tasa | todos |
| rp-fido2 | 8081 | Ceremonias WebAuthn: challenge, attestation, assertion | crypto-svc, users-svc, Redis |
| crypto-svc | 8082 | Verificación ML-DSA (CIRCL) y ES256 de control | — |
| users-svc | 8083 | Cuentas y almacén de credenciales (pk COSE, AAGUID, contador) | PostgreSQL |
| session-svc | 8084 | Challenges de un solo uso y sesiones con TTL | Redis |
| benchmark-svc | 8085 | Suite de pruebas de rendimiento PQC (p95, ops/s, bytes) | Grafana / OTLP |
| postgres | 5432 | Estado persistente | — |
| redis | 6379 | Estado efímero | — |
Principio de exposición: únicamente la pasarela publica puerto al host (443). Los demás servicios solo son alcanzables dentro de las redes Docker internas (net-edge, net-domain, net-data), cada una con su política de segmentación.
3.3 Flujo de una aserción ML-DSA (MVP)
1. GET /login/begin → session-svc crea challenge (Redis, TTL 60 s)
2. Emulador: navigator.credentials.get({challenge, rpId})
→ CTAP2 getAssertion: firma ML-DSA-65 de
authData ‖ SHA256(clientDataJSON)
3. POST /login/finish → api-gateway (PEP, mTLS)
4. rp-fido2: valida origin, rpIdHash, flags (UP/UV), contador
5. crypto-svc: ML-DSA.Verify(pk_COSE(−49), M, σ) vía CIRCL
6. Si es correcto → sesión emitida (PA) · métricas → OTLP3.4 Diseño experimental de la evaluación
| Variable | ML-DSA-44 | ML-DSA-65 | ML-DSA-87 | ES256 |
|---|---|---|---|---|
| Firmas/s (sign) | experimental | experimental | experimental | control |
| Verificaciones/s | experimental | experimental | experimental | control |
| Latencia p50/p95 (ms) | medida | medida | medida | medida |
| Tamaño de aserción (B) | ≈2 700 | ≈3 600 | ≈4 900 | ≈180 |
| CPU/mem (Go pprof) | medida | medida | medida | medida |
Metodología: go test -bench junto a carga HTTP con k6/vegeta; tres ejecuciones por configuración, proceso repetible en CI. Los resultados conformarán el capítulo de evaluación de la memoria.
4Plan de trabajo
Planificación por fases con gestión de riesgos: el MVP es independiente de las extensiones, de modo que el fallo de una extensión no compromete ni el núcleo ni la memoria.
Investigación y diseño teórico · semanas 1–3
en curso- Estudio de estándares: FIPS 203 y 204; funcionamiento de ML-KEM y ML-DSA [1][2]
- Análisis de FIDO2/WebAuthn y codificación COSE (RFC 9052, RFC 8812, borradores ML-DSA) [11][10]
- Diseño de arquitectura: topología, puertos y principios Zero Trust (SP 800-207/207A) [4][5]
- Estructura documental de la memoria y bibliografía volcada
- Entregable: este documento de investigación y el esqueleto de memoria
MVP: servidor FIDO2 PQC en Go · semanas 4–8
- Implementación de rp-fido2 y crypto-svc con CIRCL (ML-DSA-44/65/87) y ES256 de control [15]
- Emulador de autenticador PQC (software) generando attestation/assertion en COSE
- Almacén de credenciales (pk COSE, AAGUID, contadores) y mTLS interno clásico
- Despliegue con Docker Compose sobre Ubuntu Server 24.04
Evaluación experimental · semanas 9–11
- Benchmarking: latencia p50/p95, ops/s de firma y verificación, tamaño de aserción, CPU y memoria
- Análisis comparativo PQC frente a criptografía tradicional; tablas y figuras para la memoria
Extensiones (fase avanzada) · semanas 12–14
- Firmware PQC experimental en hardware físico (Nitrokey 3 / Trussed, Rust) [19]
- mTLS híbrido X25519MLKEM768 entre microservicios (Go 1.24+)
Redacción final y defensa · semanas 15–16
- Memoria completa, revisión con el tutor y preparación de la defensa con demostración en vivo
5Estructura documental de la memoria
Esqueleto preparado para incorporar el marco teórico y la bibliografía desde el primer día. La versión detallada, con listas de comprobación por sección, se mantiene en el repositorio (memoria/esqueleto-memoria.md).
6Bibliografía
Fuentes primarias consultadas durante la Fase 1. Las referencias están numeradas y enlazadas desde el texto; la versión BibTeX se mantiene en el repositorio (memoria/bibliografia.bib).
- [1]NIST (2024). Module-Lattice-Based Key-Encapsulation Mechanism Standard. FIPS 203. doi:10.6028/NIST.FIPS.203
- [2]NIST (2024). Module-Lattice-Based Digital Signature Standard. FIPS 204. doi:10.6028/NIST.FIPS.204
- [3]NIST (2024). Stateless Hash-Based Digital Signature Standard. FIPS 205. doi:10.6028/NIST.FIPS.205
- [4]Rose, S. et al. (2020). Zero Trust Architecture. NIST SP 800-207. doi:10.6028/NIST.SP.800-207
- [5]NIST (2023). A Zero Trust Architecture Model for Access Control in Cloud-Native Applications. SP 800-207A. doi:10.6028/NIST.SP.800-207A
- [6]NIST. Post-Quantum Cryptography (proyecto y migración; IR 8547: transición 2030–2035). CSRC. csrc.nist.gov
- [7]Moody, D. et al. (2024). Transition to Post-Quantum Cryptography Standards. NIST IR 8547 (ipd). csrc.nist.gov
- [8]W3C (2026). Web Authentication: An API for accessing Public Key Credentials — Level 3. w3.org/TR/webauthn-3
- [9]FIDO Alliance (2026). Server Requirements (WebAuthn Level 3 and CTAP2.3), Review Draft. fidoalliance.org
- [10]Jones, M. et al. (2020). COSE and JOSE Registrations for Web Authentication (WebAuthn) Algorithms. RFC 8812. rfc-editor.org
- [11]Schaad, J. (2022). CBOR Object Signing and Encryption (COSE): Structures and Process (RFC 9052) y Algorithms (RFC 9053). rfc-editor.org
- [12]Prorock, M.; Steele, O. (2026). ML-DSA for JOSE and COSE. IETF draft-ietf-cose-dilithium. datatracker.ietf.org
- [13]Mitra, A. et al. (2026). ML-DSA for Web Authentication. IETF draft-vitap-ml-dsa-webauthn. datatracker.ietf.org
- [14]FIDO Alliance, BTC (2024). Addressing FIDO Alliance's Technologies in Post Quantum World. fidoalliance.org
- [15]Cloudflare. CIRCL — Cloudflare Interoperable, Reusable Cryptographic Library (Go; ML-KEM y ML-DSA). github.com/cloudflare/circl
- [16]SandboxAQ; Nitrokey; SoloKeys (2023). pqc-fido2-impl: End-to-End Post-Quantum Secure FIDO2. github.com/sandbox-quantum
- [17](2025). The Qey: Implementation and performance study of post quantum cryptography in FIDO2. arXiv:2510.21353. arxiv.org
- [18]Chromium Security (2026). Post-Quantum HTTPS Authentication Roadmap. chromium.org
- [19]Nitrokey (2023). FIDO's, WebAuthn's Post-Quantum Future. nitrokey.com
- [20]Shor, P. W. (1997). Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer. SIAM J. Comput., 26(5), 1484–1509.
- [21]Ducas, L. et al. (2018). CRYSTALS-Dilithium: A Lattice-Based Digital Signature Scheme. IACR TCHES, 2018(1), 238–268.
- [22]Bos, J. et al. (2018). CRYSTALS-Kyber: A CCA-Secure Module-Lattice-Based KEM. IEEE EuroS&P, 353–367.
- [23]Cloudflare (2026). PQC support: ecosistema de bibliotecas TLS post-cuánticas (X25519MLKEM768, ML-DSA). developers.cloudflare.com