1. Autenticadores de posesión
El factor de posesión comprueba que el usuario tiene un objeto, físico o digital, que solo él debería poseer. Su ventaja frente al conocimiento es que el atacante no puede adivinarlo desde cualquier lugar del mundo: debe robar, clonar o engañar para obtener el objeto o el secreto que contiene.
No todos los autenticadores de posesión ofrecen la misma seguridad. La diferencia fundamental es si resisten el phishing, es decir, si siguen siendo útiles cuando el usuario es engañado para entregar lo que el objeto produce.
| Autenticador | Qué es | Resistente al phishing | Ejemplo |
|---|---|---|---|
Lista de códigos de un solo uso |
Códigos precalculados que se tachan al usarse |
No |
Códigos de recuperación |
OTP por software |
Aplicación que calcula códigos con un secreto compartido |
No |
Aplicaciones TOTP |
OTP por hardware |
Dispositivo dedicado que genera códigos |
No |
Llaves con generador de códigos |
SMS, voz o correo |
Código enviado por un canal de comunicación |
No |
Mensaje de texto |
Notificación push |
Solicitud de aprobación en el teléfono |
No, y expuesta a la fatiga |
Aprobar o denegar |
Llave de seguridad FIDO2 |
Dispositivo con clave privada y verificación del origen |
Sí |
Llaves USB y NFC |
Tarjeta inteligente |
Chip con clave privada y certificado, protegido por PIN |
Sí, cuando valida el servidor |
DNI electrónico |
|
Un segundo factor no es automáticamente un buen segundo factor Un código de seis dígitos, venga de una aplicación, de un mensaje o de una llave, se puede teclear en una web falsa y reenviar al servicio real en el mismo instante. Solo los autenticadores criptográficos que comprueban el origen, como FIDO2 y las tarjetas inteligentes con autenticación mutua, resisten esa técnica. La clasificación de los niveles de garantía se estudia en el capítulo de autenticación multifactor. |
2. Contraseñas de un solo uso: HOTP y TOTP
Una contraseña de un solo uso u OTP (One-Time Password) es un código que sirve para una única autenticación. Aunque se intercepte, no puede reutilizarse más tarde. Los dos algoritmos estandarizados parten de un secreto compartido entre el servidor y el dispositivo del usuario.
2.1. HOTP: basado en un contador
Definido en el RFC 4226, calcula el código a partir del secreto K y de un contador C que ambos lados incrementan en cada uso:
HOTP(K, C) = Truncar(HMAC-SHA1(K, C)) mod 10^dígitos
-
El truncado dinámico toma cuatro bytes del resultado del HMAC, elegidos según el último medio byte, y los reduce a un número de seis u ocho dígitos.
-
Si el usuario genera códigos sin enviarlos, el contador del dispositivo se adelanta al del servidor. Por eso el servidor acepta una ventana de contadores futuros y se resincroniza al validar uno.
2.2. TOTP: basado en el tiempo
Definido en el RFC 6238, sustituye el contador por el tiempo discreto: el número de intervalos de 30 segundos transcurridos desde el 1 de enero de 1970.
T = floor(hora_unix / 30)
TOTP(K) = HOTP(K, T)
Como el código depende solo del secreto y del reloj, no hace falta comunicación entre el dispositivo y el servidor. Es el algoritmo de la mayoría de las aplicaciones de autenticación.
2.3. Alta del dispositivo
El secreto se comparte una sola vez, durante el alta, normalmente mediante un código QR que contiene un identificador de recurso con los parámetros del algoritmo:
otpauth://totp/Bastionado:maria?secret=JBSWY3DPEHPK3PXP&issuer=Bastionado&algorithm=SHA1&digits=6&period=30
| Campo | Descripción | Ejemplo | Explicación técnica |
|---|---|---|---|
|
Secreto compartido, codificado en Base32 |
|
Es la clave |
|
Servicio que emite el código |
|
Solo sirve para identificar la entrada en la aplicación. |
|
Función hash del HMAC |
|
SHA-1 sigue siendo seguro en HMAC y es el único que admiten todas las aplicaciones. |
|
Longitud del código |
|
Con seis dígitos hay un millón de combinaciones por intervalo. |
|
Duración del intervalo en segundos |
|
Define el tamaño de |
2.4. Seguridad y límites
-
El servidor guarda el secreto. El servidor debe poder calcular los códigos, por lo que almacena el secreto en forma recuperable. Una brecha de esa base de datos compromete el segundo factor de todos los usuarios, y debe cifrarse con una clave gestionada aparte.
-
Ventana de aceptación. Para tolerar la deriva de relojes, el servidor acepta el intervalo actual y el anterior y el siguiente. Ampliar la ventana aumenta la comodidad y las posibilidades de acierto del atacante.
-
Limitación de intentos. Con seis dígitos y tres intervalos válidos, un atacante acierta con una probabilidad de tres entre un millón en cada intento. Sin un límite de fallos por cuenta, el segundo factor se puede forzar.
-
Un código, un solo uso. El servidor debe rechazar un código ya empleado dentro de su ventana, o un atacante podría reutilizar uno interceptado durante 30 segundos.
-
Relojes sincronizados. Los servidores deben usar NTP. Un desfase de más de un intervalo impide validar a los usuarios legítimos.
-
No es resistente al phishing. Un atacante intermediario retransmite el código en cuanto el usuario lo teclea.
|
Con los conceptos explicados en esta sección, ya puede realizar el Ejercicio 1. TOTP desde cero y el Ejercicio 2. Deriva del reloj y ventana de aceptación. |
3. Tokens de hardware y llaves de seguridad
Los tokens de hardware son dispositivos dedicados, sin conexión a Internet ni capacidad de instalar software ajeno, que reducen la superficie de ataque frente a un teléfono.
-
Generadores de OTP del estilo de RSA SecurID: un reloj interno y un secreto grabado de fábrica producen un código que cambia cada pocos segundos. Sufren los mismos límites que TOTP y, además, el fabricante o el servidor conocen la semilla.
-
Llaves de seguridad FIDO, como las YubiKey y otras llaves USB o NFC: guardan claves privadas que nunca salen del dispositivo y comprueban el origen del sitio web. Son los autenticadores con mejor equilibrio entre seguridad y comodidad, y se estudian en el capítulo de autenticación criptográfica.
El ciclo de vida de estos dispositivos exige un procedimiento: inventario de los entregados, registro de cada uno a su usuario, revocación inmediata ante pérdida o robo, y una segunda llave de reserva registrada para evitar bloqueos y recuperaciones inseguras.
4. SMS, voz, correo y notificaciones push
Estos métodos son cómodos y no requieren hardware, pero asumen la seguridad de un canal que el servicio no controla.
| Método | Riesgo principal | Mitigación | Uso recomendado |
|---|---|---|---|
SMS y voz |
SIM swapping, redirección en la red de señalización, malware que lee mensajes |
Comprobar indicios de cambio de SIM o portabilidad; ofrecer alternativas |
Último recurso, con aviso al usuario |
Correo electrónico |
Quien controla el buzón controla el código; el buzón suele protegerse peor |
No utilizarlo como segundo factor |
Prohibido por NIST como autenticador fuera de banda |
Notificación push |
Fatiga de MFA: el atacante genera solicitudes hasta que el usuario acepta |
Mostrar el contexto y exigir un número de verificación |
Aceptable con coincidencia de número |
Lista de códigos de recuperación |
Se almacena en claro o se pierde |
Guardar en un gestor o en papel bajo custodia |
Solo para recuperación |
El SIM swapping consiste en convencer a un operador de que transfiera el número de la víctima a una tarjeta SIM que controla el atacante, que a partir de entonces recibe los SMS de verificación y las llamadas de recuperación. NIST califica la autenticación por la red telefónica pública como autenticador restringido: lo admite, pero exige que el servicio ofrezca alternativas y que valore indicadores de riesgo como un cambio reciente de SIM.
El correo merece una advertencia aparte, porque no es un canal más. El buzón es la raíz de la cadena de recuperación, ya que a él llegan los enlaces con los que se restablece la contraseña del resto de servicios. Quien lo controla no necesita robar ninguna otra credencial, le basta con solicitar el restablecimiento de cada cuenta una por una. De ahí se siguen dos consecuencias. La cuenta de correo debe ser la mejor protegida de todas, con un autenticador resistente al phishing. Y usar ese mismo correo como segundo factor de otros servicios cierra un círculo en el que un único compromiso basta para perderlo todo.
Las notificaciones push y la fatiga de autenticación se analizan en el capítulo de autenticación multifactor.
5. Tarjetas inteligentes y certificados digitales
5.1. Qué es una tarjeta inteligente
Una tarjeta inteligente (smart card) es un dispositivo con un chip que incorpora un procesador, memoria protegida y un módulo criptográfico. Su propiedad fundamental es que genera y guarda claves privadas que no pueden extraerse: cuando hay que firmar algo, los datos entran en la tarjeta, la operación se realiza dentro del chip y solo sale el resultado.
-
Interfaces: contacto, mediante un lector, o sin contacto, mediante NFC.
-
Normas: ISO/IEC 7816 para las tarjetas de contacto, PKCS#11 como interfaz de programación para acceder a sus operaciones criptográficas, y PIV, definido por NIST, como perfil para la identidad de empleados públicos.
-
PIN y PUK: el PIN desbloquea el uso de la clave. Tras un número reducido de intentos fallidos, la tarjeta se bloquea y solo se recupera con un código de desbloqueo, el PUK, que custodia el administrador.
Es, a la vez, un factor de posesión y, por el PIN, de conocimiento: una tarjeta con PIN es una autenticación de dos factores en un único acto.
5.2. Autenticación con certificado
La tarjeta contiene un certificado X.509 que asocia la clave pública con la identidad de su titular, firmado por una autoridad de certificación. La autenticación sigue un esquema de reto y respuesta:
-
El servidor envía un reto aleatorio, de un solo uso.
-
El usuario introduce el PIN y la tarjeta firma el reto con la clave privada.
-
El servidor verifica la firma con la clave pública del certificado.
-
El servidor valida el certificado: que lo ha emitido una autoridad de confianza, que está dentro de su periodo de validez, que no ha sido revocado mediante listas CRL o el protocolo OCSP, y que su uso extendido incluye la autenticación de cliente.
Ninguna credencial secreta viaja por la red: el servidor solo ve una firma, válida únicamente para ese reto.
5.3. El DNI electrónico y los certificados cualificados
El DNI electrónico español incorpora un chip con un certificado de autenticación y otro de firma electrónica, protegidos por un PIN, y puede utilizarse con lector de contactos o, en las versiones recientes, mediante NFC. El certificado de firma tiene el valor jurídico de una firma manuscrita en el marco del reglamento europeo eIDAS. Existen alternativas con el mismo fundamento, como los certificados de la FNMT y los sistemas de identificación de las administraciones públicas. Las características técnicas vigentes deben consultarse en el portal oficial del DNI electrónico.
5.4. Ventajas y amenazas
-
Ventajas: la clave privada no se exporta ni se copia; no hay secreto compartido que robar de un servidor; y la autenticación mutua con certificados resiste el phishing de credenciales.
-
Robo físico más PIN: quien consiga la tarjeta y observe el PIN tiene acceso completo. De ahí los límites de intentos y la revocación inmediata ante una pérdida.
-
Uso por malware: un programa en el equipo puede pedir firmas a la tarjeta mientras está insertada y desbloqueada, sin llegar a conocer la clave.
-
Validación deficiente: un servidor que no comprueba la revocación, la cadena o el uso de la clave acepta certificados que no debería.
-
Tarjetas débiles: las tarjetas de proximidad de control físico de accesos de generaciones antiguas, como las basadas en MIFARE Classic y en identificadores sin cifrar, se clonan con equipos económicos. No deben confundirse con las tarjetas criptográficas.
La infraestructura que emite y revoca los certificados se estudia con detalle en la guía de infraestructura de clave pública.
|
Con los conceptos explicados en esta sección, ya puede realizar el Ejercicio 3. Una tarjeta inteligente simulada con SoftHSM. |
6. Políticas recomendadas
-
Elegir el autenticador según el riesgo. Para administradores y accesos remotos a sistemas críticos, exigir autenticadores resistentes al phishing; las aplicaciones OTP bastan como mínimo general; el SMS solo como alternativa de último recurso.
-
Exigir un procedimiento de alta presencial o verificado para registrar el primer autenticador, ya que es el momento más vulnerable.
-
Registrar al menos dos autenticadores por usuario, para que la pérdida de uno no obligue a una recuperación débil.
-
Proteger el secreto de TOTP en el servidor, cifrado y con acceso restringido, y limitar los intentos de validación por cuenta.
-
Limitar y vigilar las recuperaciones: cada restablecimiento del segundo factor debe notificarse al usuario y quedar registrado.
-
Revocar de inmediato los autenticadores perdidos, robados o de personas que causan baja.
-
Mantener relojes sincronizados en todos los servidores que validan códigos temporales.
7. Ejercicios prácticos
Los ejercicios están diseñados para realizarse en orden sobre una máquina virtual Ubuntu o Debian de pruebas. Todos los archivos se crean en ~/lab_posesion. El último ejercicio elimina todo lo creado y no se necesita ningún dispositivo físico.
| Nº | Ejercicio | Competencia que desarrolla |
|---|---|---|
1 |
Implementar HOTP y TOTP y validarlos con los vectores del RFC |
|
2 |
Comprender el compromiso entre comodidad y seguridad |
|
3 |
Autenticar con reto y respuesta usando una clave no exportable |
|
4 |
Revertir los cambios realizados |
7.1. Ejercicio 1. TOTP desde cero
Realice los siguientes pasos:
-
Instale
oathtool, herramienta de referencia para generar códigos, y cree el scripttotp.py, que implementa HOTP y TOTP con la biblioteca estándar de Python:sudo apt install -y oathtool mkdir -p ~/lab_posesion && cd ~/lab_posesion cat > totp.py << 'EOF' import base64, hashlib, hmac, struct, time def hotp(clave: bytes, contador: int, digitos: int = 6, alg=hashlib.sha1) -> str: mac = hmac.new(clave, struct.pack(">Q", contador), alg).digest() desplazamiento = mac[-1] & 0x0F codigo = struct.unpack(">I", mac[desplazamiento:desplazamiento + 4])[0] & 0x7FFFFFFF return str(codigo % 10 ** digitos).zfill(digitos) def totp(clave: bytes, t=None, paso: int = 30, digitos: int = 6, alg=hashlib.sha1) -> str: t = time.time() if t is None else t return hotp(clave, int(t // paso), digitos, alg) def verificar(clave: bytes, codigo: str, t=None, ventana: int = 1, paso: int = 30) -> bool: t = time.time() if t is None else t actual = int(t // paso) return any(hmac.compare_digest(hotp(clave, c), codigo) for c in range(actual - ventana, actual + ventana + 1)) if __name__ == "__main__": k = b"12345678901234567890" for t, esperado in [(59, "94287082"), (1111111109, "07081804"), (1234567890, "89005924")]: obtenido = totp(k, t, 30, 8) print(t, obtenido, esperado, "OK" if obtenido == esperado else "FALLO") print("HOTP contador 0 a 2:", [hotp(k, c) for c in range(3)]) EOF -
Ejecute el script y compruebe que los códigos coinciden con los vectores de prueba publicados en los RFC 4226 y 6238, que son
94287082,07081804y89005924para ocho dígitos, y755224,287082y359152para los tres primeros contadores HOTP. -
Genere un secreto Base32 y calcule el código para un instante fijo con
oathtooly con su script. Compruebe que coinciden. -
Construya el identificador
otpauth://de la sección 2.3 con su secreto y genere el código QR conqrencodepara registrarlo en una aplicación TOTP real. Compare el código de la aplicación con el deoathtool.
7.2. Ejercicio 2. Deriva del reloj y ventana de aceptación
Realice los siguientes pasos:
-
Con el módulo
totp.pydel ejercicio anterior, calcule el código del intervalo actual y valídelo con una ventana de 0 y de 1. -
Simule un dispositivo cuyo reloj va retrasado 30, 60 y 90 segundos. Compruebe con qué ventanas valida el servidor cada código y concluya cuál es el desfase máximo tolerado con la ventana habitual.
-
Calcule la probabilidad de acertar el código de seis dígitos en un solo intento con ventanas de 1, 3 y 5 intervalos, y cuántos intentos haría falta realizar para superar el 50 % de éxito. Justifique la necesidad de limitar los intentos por cuenta.
-
Verifique que un código ya utilizado no debería aceptarse de nuevo. Diseñe en pseudocódigo, o implemente, el control que el servidor debe añadir a
verificarpara impedir la reutilización dentro de su ventana.
7.3. Ejercicio 3. Una tarjeta inteligente simulada con SoftHSM
SoftHSM implementa por software la interfaz PKCS#11 de una tarjeta o módulo de seguridad. Permite practicar con una clave no exportable protegida por PIN sin necesidad de ningún lector.
Realice los siguientes pasos:
-
Instale las herramientas y cree un almacén de pruebas dentro del directorio de trabajo. Inicialice una «tarjeta» con el nombre
TarjetaLab, un PIN de usuario1234y un PIN de administración123456. -
Genere dentro de la tarjeta un par de claves de curva elíptica con la etiqueta
claveAuth. Liste los objetos sin PIN y con PIN, y compruebe los atributos de la clave privada. Identifique qué atributos impiden extraerla. -
Simule la autenticación con reto y respuesta. Genere un reto aleatorio, fírmelo con la tarjeta, exporte la clave pública y verifique la firma con
openssl, como haría el servidor. -
Compruebe que la verificación falla si el reto cambia, y que un PIN incorrecto impide usar la clave. Razone qué le ocurriría a un atacante que obtuviera la clave pública y la firma, pero no la tarjeta.
7.4. Ejercicio 4. Limpieza del entorno
-
Elimine el directorio de trabajo, que contiene el almacén de la tarjeta simulada, y la variable de entorno definida.
8. Referencias
9. Licencia
Licencia CC BY-NC-ND 4.0
Esta página forma parte del curso Bastionado de Redes y Sistemas © 2026 de José Juan Sánchez Hernández y su contenido se distribuye bajo una licencia Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.
Esta licencia exige que quienes reutilicen el material otorguen el debido crédito al autor. Permite copiar y redistribuir el material en cualquier medio o formato, únicamente en su forma original, y solo para fines no comerciales.