1 / 28
Con el apoyo y hardware de Nitrokey

Adiós a las contraseñas: FIDO2 y WebAuthn,
del concepto al código (y a tu propia llave)

Paralelo 37 Logo

Paralelo 37 · XauenDevs · Jaén

¿Quién demonios soy yo?

  • Antonio Tirado Peña.
  • Ingeniero Técnico en Informática de Gestión (UJA, de la tierra).
  • Master en Desarrollo de Producto por la IEBS.
  • Director de TI y Estrategia en IICE / NormaPro.
  • Cacharreador compulsivo: Linux (Arch, por supuesto), servidores caseros con Docker, soldador, microcontroladores y cacharros varios.

Desmitificando la sopa de letras (Nota mental)

FIDO2 no es una raza de perro ni un Pokémon.

WebAuthn no es la nueva red social para programadores solitarios.

CTAP2 no es el primo hermano de R2-D2.

Los tres nombres

FIDO2

Fast Identity Online 2.0 El paraguas: el estándar abierto de autenticación sin contraseñas.

WebAuthn

La API del W3C que tu página web llama. Es JavaScript: navigator.credentials

CTAP2

Client To Authenticator Protocol Cómo el navegador habla con el aparato que guarda las claves.

El auténtico problema: Este es Alberto

Alberto y su Password

Correo: albertthegreat@hotmail.com

(creado en 2004)

Contraseña maestra: P4$$w0rd

"Lleva una mayúscula, un cuatro, dos dólares y un cero. Es criptografía cuántica."

— Motivo de su orgullo

Alberto en el mundo real

Data Breach

YOU'VE BEEN PWNED!

haveibeenpwned.com

El foro de petancas de Albacete guardaba las contraseñas en MD5 plano en un MySQL de 2011.

Steam 🔓
Intranet 🔓
Banco 🔓

El parche infinito (BriConsejo de Seguridad)

Treinta años metiéndole parches a algo roto por diseño

Complejidad absurda

Mayúsculas, minúsculas, números, caracteres raros y el grupo sanguíneo.

Caducidad

"Tu contraseña caduca en 90 días"
→ Primavera2026!, Verano2026!

SMS 2FA

SIM swapping te saluda con la mano.

Apps autenticadoras

Fatiga de push: le das a "Aceptar" a las 3 AM solo para que el móvil se calle.

El cambio de paradigma: Clave pública vs Secreto compartido

Tradicional

🧑 ↔️ 🔑 ↔️ 🖥️

Usuario y servidor comparten el mismo secreto.
Si el servidor cae, caen todos.

FIDO2

🧑[🗝️] ↔️ 🔒[🖥️]

El usuario tiene la llave privada en su hardware.
El servidor solo tiene la cerradura (clave pública).

Los tres mosqueteros de la arquitectura

Authenticator (Sensor / Nitrokey / RP2350) CTAP2 Client (Navegador / SO) WebAuthn Relying Party (Tu Backend Node)

Por qué FIDO2 extermina el Phishing (El superpoder)

Phishing Site

https://banc0-santander-phishing.com
⬇️ Navegador inyecta ORIGEN en la firma ⬇️

Banco Real

https://banco-santander.com

Validando origen de firma:

banc0-santander-phishing.com != banco-santander.com

Firma rechazada matemáticamente.

El zoo de autenticadores: Plataforma vs Roaming

Plataforma

  • Windows Hello, Touch ID, Face ID, huella de Android.
  • Atados al cacharro o sincronizados en passkeys (nube).
  • Comodísimos.

Roaming (Externos)

  • Llaves de seguridad físicas por USB, NFC o BLE.
  • Seguridad absoluta: no dependen de ninguna nube corporativa.
  • Infraestructura crítica.

El presente: Passkeys en tu bolsillo

FIDO2 disfrazado de comodidad absoluta

🪟

Windows Hello

Inicia sesión con tu rostro o huella. El TPM de tu PC es el hardware criptográfico.

🍎

Ecosistema Apple

FaceID / TouchID. Las claves se sincronizan de forma encriptada vía iCloud Keychain.

🤖

Android Passkeys

Huella digital en el móvil. Respaldado por Google Password Manager y el chip Titan.

Ya estás usando criptografía asimétrica FIDO2 en tu día a día sin saberlo.

SPONSOR OFICIAL

Nitrokey Logo

Hardware Oficial

Nitrokey Logo
Nitrokey 3A
NITROKEY 3A
  • 100% Open Source (firmware y hardware).
  • Fabricado en Alemania · Seguridad Auditable.
  • Chip con Secure Element resistente a ataques físicos.
  • FIDO2/WebAuthn, U2F, OpenPGP, TOTP/HOTP.

¡Tenemos llaves Nitrokey 3A aquí en la sala para probar en directo!

El flujo de Registro (Sin dolor)

Backend Navegador Llave 1. "Toma este reto aleatorio (challenge)" 2. "Créame par de claves y firma reto" Toque de dedo (Presencia) 3. Devuelve clave pública firmada 4. Comprueba firma y guarda en BBDD

El flujo de Login

Backend Navegador Llave 1. "¿Quieres entrar? Firma este challenge" 2. Pide firma a la llave Firma con Clave Privada 3. Devuelve firma al navegador 4. Comprueba firma con Pública. ¡Dentro!

BriConsejo de Arquitectura

"1 Servicio, 3 Componentes y me sobra 1"

ex

Express

+
A

Angular

+
npm

@simplewebauthn

LAB 1 — Backend con Express.js

server.ts
import { generateRegistrationOptions, verifyRegistrationResponse } from '@simplewebauthn/server';

// 4 Endpoints mágicos
app.post('/auth/register/begin', ...);
app.post('/auth/register/complete', ...);

app.post('/auth/login/begin', ...);
app.post('/auth/login/complete', ...);

// (Bonus) Curiosear qué se ha guardado
app.get('/auth/users', ...);

// ⚠️ ATENCIÓN: Discrepancias de origen = Error #1
const rpID = 'localhost'; 
const expectedOrigin = 'http://localhost:4200';

LAB 1 en vivo: El Contador Anti-Replay

login.controller.ts
let verification;
try {
  verification = await verifyAuthenticationResponse({
    response: body,
    expectedChallenge,
    expectedOrigin,
    expectedRPID,
    authenticator: {
      credentialID: authenticator.credentialID,
      credentialPublicKey: authenticator.credentialPublicKey,
      counter: authenticator.counter, // 🛡️ El contador interno
    },
  });
} catch (error) { ... }

// Si a nuestro servidor le llega una petición con
// un número <= que en el login anterior...
// ¡Peligro! Hardware clonado o petición repetida.

¿Por qué un contador? El ataque del clon

El Escenario

Un atacante roba tu llave un rato y en un laboratorio logra extraer la memoria, creando un clon físico exacto.

Ahora existen dos llaves en el mundo con la misma clave privada. Las firmas de ambas son matemáticamente idénticas e indistinguibles.

El Cuentakilómetros

  • Cada login suma +1 al contador interno de la llave (nunca retrocede).
  • Tu backend guarda el número más alto visto de ese usuario (Ej: 102).
  • Si el atacante usa el clon que copió ayer (que se quedó en 101), el servidor recibe un viaje al pasado (101 <= 102) y bloquea el acceso por anomalía.

Pausa técnica / El salvavidas de Chrome

Chrome DevTools > More tools > WebAuthn
[x] Enable virtual authenticator environment
Protocol: ctap2
Transport: usb
Supports resident keys: Yes

LAB 2 — Frontend con Angular

auth.service.ts
import { startRegistration, startAuthentication } from '@simplewebauthn/browser';

@Injectable({ providedIn: 'root' })
export class AuthService {
  
  async startRegistration(username: string) {
    // 1. Pedimos opciones al backend
    const options = await this.api.getRegistrationOptions(username);
    
    // 2. Levanta el cuadro de diálogo nativo del SO
    const response = await startRegistration(options);
    
    // 3. Enviamos resultado al backend
    await this.api.verifyRegistration(username, response);
  }
}

Demo en directo: Nitrokey 3A en acción

→
→

Conexión USB > User Presence > Login concedido

Autenticado en milisegundos sin escribir una sola tecla.

Momento Cacharreo Maker

¿Y si la fabricamos nosotros por 5€?

Raspberry Pi Pico 2

RP2350 vs RP2040: Por qué importa el silicio

Pico 1 (RP2040)

  • Sin protección en flash.
  • Cualquiera lee la memoria en crudo con una pinza.

Pico 2 (RP2350)

  • Secure Boot y arquitectura ARM TrustZone.
  • Memoria OTP (One-Time Programmable) para quemar la clave maestra permanentemente.

Pico FIDO contra nuestra aplicación

¡Y entra a la primera!

Exactamente igual que con la Nitrokey.

La belleza de los estándares abiertos: a tu código le da igual el fabricante del silicio.

¿Nitrokey 3A o Pico FIDO?

Por qué el silicio casero no sustituye a la ingeniería de seguridad

Pico FIDO

  • Educativo: Perfecto para aprender cómo funciona el protocolo por dentro.
  • Silicio General: El RP2350 es genial, pero no es un chip criptográfico especializado.
  • Construcción: Placa desnuda. Se te cae en el café y se acabó el login.
  • Attestation: Al ser hardware no certificado, algunos servicios bancarios o corporativos pueden rechazarlo.

Nitrokey 3A

  • Secure Element: Hardware diseñado 100% para evitar extracción de claves (ni lijando el chip).
  • Certificaciones: Confianza total. FIDO Alliance y estándares empresariales.
  • Durabilidad: Sellada con resina epoxi. A prueba de agua, polvo y vida real.
  • Producción: La herramienta fiable que usas para asegurar tu nómina, tus servidores y tus secretos de empresa.

¿Y qué pasa si pierdo la llave? (Gestión del mundo real)

Regla de oro: Registrar siempre ≥ 2 credenciales

Lo que FIDO2 NO puede solucionar (Honestidad brutal)

Robo de Sesión

Session Hijacking. Si te roban la cookie ya emitida, FIDO2 no te salva.

Coacción Física

El ataque de la llave inglesa de 5 dólares de XKCD.

Descuido

Poner el dedo sin mirar la pantalla para qué estás dando permiso.

Resumen, Recursos y Agradecimientos

  • » simplewebauthn.dev
  • » webauthn.io
  • » nitrokey.com
  • » picokeys.com
Paralelo 37 Logo
XauenDevs Nitrokey

"El futuro no es sin contraseñas...
es con una autenticación que por fin
está a la altura de las personas."

Antonio Tirado Peña

yosoy@antoniotirado.com · @xtoxico · normapro.es

¡Quedan micrófonos abiertos para dudas!

(y veníos a probar las llaves Nitrokey y Pico en directo)