FlowingDev

TOTP, explicado: Cómo tu teléfono se sabe el santo y seña

Aprende cómo las Contraseñas de Un Solo Uso Basadas en Tiempo (TOTP) crean una segunda capa segura de autenticación usando un secreto compartido y la hora actual.

Probar la herramienta: Generador de TOTP / 2FA

En una frase

TOTP es un algoritmo que genera un código numérico temporal y en constante cambio a partir de un secreto compartido y la hora actual, que se usa como segundo factor para iniciar sesión.

El problema que resuelve

Seamos realistas: las contraseñas son un mal necesario. Las olvidamos, las reutilizamos, y los atacantes son deprimentemente buenos para robarlas mediante phishing, filtraciones de bases de datos y la vieja y confiable adivinación. Confiar solo en una contraseña es como cerrar la puerta de tu casa con llave pero dejarla debajo del felpudo.

Aquí es donde entra en juego la Autenticación Multifactor (MFA) y su variante más común, la Autenticación de Dos Factores (2FA). La idea es demostrar tu identidad con algo más que algo que sabes (una contraseña). También necesitas algo que tienes (como tu teléfono) o algo que eres (como tu huella dactilar).

Al principio, el 2FA a menudo significaba recibir un código por SMS. Esto era mejor que nada, pero es vulnerable a ataques de "SIM swapping", donde un estafador convence a tu proveedor de telefonía móvil para que transfiera tu número a su teléfono. De repente, ellos están recibiendo tus códigos 2FA. No es lo ideal.

Y así llegaron los autenticadores basados en apps. En lugar de depender de la seguridad temblorosa de la red telefónica, una app en tu dispositivo puede generar códigos localmente. Pero, ¿cómo sabe tu app de Google Authenticator cómo generar un código para tu cuenta de GitHub? ¿Y cómo sabe tu Microsoft Authenticator cómo hablar con tu Dropbox?

Todos hablan el mismo lenguaje de estándar abierto: TOTP, la Contraseña de Un Solo Uso Basada en Tiempo. TOTP es el héroe anónimo que desacopla tu segundo factor de cualquier empresa en particular. Es un estándar abierto e interoperable que permite que cualquier app compatible funcione con cualquier servicio compatible. Es la evolución de un estándar anterior llamado HOTP (que se basaba en un simple contador), pero al usar el tiempo como la pieza móvil, TOTP se volvió mucho más fácil de usar.

Cómo funciona por dentro

El TOTP parece magia. Escaneas un código QR una vez, y por el resto del tiempo, tu teléfono y un servidor al otro lado del mundo pueden ponerse de acuerdo en el mismo número de seis dígitos cada 30 segundos, sin volver a hablarse jamás. No es magia, es solo criptografía muy ingeniosa.

Desglosemos la receta.

El Secreto Compartido: La Llave del Reino

Todo comienza con un secreto. Cuando activas el 2FA en un servicio, el servidor genera una clave secreta y aleatoria (por ejemplo, 160 bits de pura aleatoriedad). Este secreto es lo único que tanto tú como el servidor necesitan saber. Toda la seguridad del sistema se basa en mantenerlo en secreto.

Por supuesto, una cadena de 160 bits aleatorios no es muy amigable para el usuario. Así que para nosotros, los humanos, se codifica en un formato llamado Base32. A diferencia de su primo Base64, Base32 usa un alfabeto más pequeño que no distingue entre mayúsculas y minúsculas y evita caracteres ambiguos como 1 y l, o 0 y O. Esto hace posible (aunque sigue siendo un fastidio) escribirlo manualmente si no puedes escanear el código QR.

Un secreto Base32 típico se ve así: JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP

La forma más común de meter este secreto en tu app de autenticación es a través de un código QR que codifica una URI especial:

otpauth://totp/FlowingDev:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=FlowingDev

Tu app escanea esto, guarda el emisor (issuer, FlowingDev), el nombre de la cuenta (user@example.com), y lo más importante, el secret (secreto). El trato está cerrado.

La Pieza Móvil: El Tiempo

La "T" en TOTP significa "Time-Based" (Basado en Tiempo). Este es el ingrediente crucial que hace que el código cambie. Pero el sistema no usa la hora exacta hasta el milisegundo, eso sería imposible de sincronizar. En su lugar, utiliza un paso de tiempo discreto.

La fórmula es simple:

PasoDeTiempo = floor(TiempoUnixActual / 30)

  • TiempoUnixActual: El número de segundos que han pasado desde el 1 de enero de 1970 (la Época Unix o Unix Epoch).
  • / 30: El paso de tiempo es casi universalmente de 30 segundos.

Este cálculo da como resultado un número entero que solo cambia cada 30 segundos. A las 10:00:00 AM, el PasoDeTiempo es un valor T. A las 10:00:29 AM, sigue siendo T. Pero a las 10:00:30 AM, se incrementa a T+1. Este PasoDeTiempo es el "mensaje" que vamos a autenticar.

La Magia Criptográfica: HMAC-SHA1

Ahora combinamos el secreto estático con el paso de tiempo dinámico. Esto se hace usando una primitiva criptográfica llamada HMAC (Código de Autenticación de Mensajes basado en Hash).

Resultado_HMAC = HMAC-SHA1(ClaveSecreta, PasoDeTiempo)

Piensa en HMAC como una forma de crear una firma segura. Toma nuestra clave secreta y los datos que queremos firmar (el PasoDeTiempo) y los mezcla usando una función de hash, en este caso, el venerable SHA-1.

El resultado es un hash de 20 bytes (160 bits). Es una larga cadena hexadecimal que es completamente única para ese secreto específico y ese paso de tiempo específico. Cambia un bit del secreto o espera 30 segundos para que cambie el paso de tiempo, y obtendrás un hash totalmente diferente.

Aunque SHA-1 tiene debilidades conocidas para otros propósitos como la firma de certificados, todavía se considera perfectamente seguro cuando se usa dentro de la construcción HMAC. Muchas implementaciones modernas están migrando a HMAC-SHA256 o HMAC-SHA512 para mayor seguridad.

El Truncamiento: Llegando a los Seis Dígitos

Una cadena hexadecimal de 20 bytes no es un código de seis dígitos fácil de usar. El paso final es "truncar dinámicamente" este hash para convertirlo en un número que realmente podamos usar.

  1. Encuentra el Offset: Mira los últimos 4 bits (nibble) del resultado HMAC de 20 bytes. Esto nos da un número entre 0 y 15. Este es nuestro offset.
  2. Toma 4 Bytes: Comenzando en esa posición de offset en el hash de 20 bytes, toma los siguientes 4 bytes (32 bits).
  3. Limpia el Bit Más Significativo: Toma este trozo de 32 bits y haz un AND a nivel de bits con 0x7FFFFFFF. Esto elimina efectivamente el primer bit, lo que resuelve algunos problemas potenciales con enteros con y sin signo y asegura que el resultado sea siempre positivo.
  4. ¡Hora del Módulo! Ahora tienes un gran entero de 31 bits. Para reducirlo a 6 dígitos, le aplicas el módulo 1,000,000 (10^6).
  5. Rellena con Ceros: ¡El resultado es tu código! Si el número es, digamos, 4521, lo rellenas con ceros a la izquierda para que sea 004521.

¡Y ya está! Tanto tu teléfono como el servidor realizan exactamente este mismo cálculo. Cuando introduces el código, el servidor compara su resultado con el tuyo. Para compensar un ligero desfase del reloj entre tu teléfono y el servidor, este último normalmente comprobará el código para el paso de tiempo actual, el anterior y el siguiente. Si alguno de ellos coincide, estás dentro.

Historias de la vida real

El Robo de Cuenta de GitHub que no Fue

Un desarrollador, súper concentrado, recibe un correo que parece exactamente de GitHub, advirtiendo sobre un problema de seguridad. En un momento de distracción, hace clic en el enlace, llega a un clon perfecto al píxel de la página de inicio de sesión de GitHub, e introduce su nombre de usuario y contraseña. El atacante ahora tiene sus credenciales. El phisher intenta inmediatamente iniciar sesión en el GitHub real. Introduce la contraseña robada... y se encuentra con un aviso: "Por favor, introduce tu código de autenticación de dos factores". El atacante está totalmente atascado. No tiene el teléfono del desarrollador y no tiene forma de generar el código TOTP. Mientras tanto, el desarrollador recibe un correo real de GitHub sobre un nuevo inicio de sesión, se da cuenta de su error y cambia su contraseña de inmediato.

Lección: El TOTP actúa como un cortafuegos crítico. Convierte una violación de contraseña potencialmente catastrófica en un intento de inicio de sesión fallido e inofensivo.

La Emergencia de Acceso sin Conexión

Un ingeniero de redes está en un vuelo hacia una conferencia. Treinta minutos después del despegue, necesita revisar un sistema de producción crítico. No hay Wi-Fi a bordo y la cobertura celular es nula. Un 2FA por SMS o basado en notificaciones push sería inútil. Pero su panel de control está protegido con TOTP. Abre su laptop, va a la página de inicio de sesión, abre la app de autenticación en su teléfono y escribe el código de seis dígitos. La app no necesita ninguna conexión a internet; su matemática es autónoma, dependiendo solo del secreto compartido y del reloj interno del teléfono. Inicia sesión y resuelve el problema antes de que los auxiliares de vuelo empiecen a servir las bebidas.

Lección: La capacidad del TOTP para funcionar completamente sin conexión lo hace increíblemente robusto y confiable para accesos críticos, sin importar dónde estés.

El Dolor de Cabeza de la Migración Multiplataforma... Resuelto

Un usuario de Android de toda la vida decide cambiarse a un iPhone. Abre Google Authenticator y se horroriza al descubrir que no hay un simple botón de "sincronizar con mi nuevo teléfono". Tiene más de 30 cuentas configuradas, y la idea de pasar por el proceso de restablecimiento de 2FA para cada una es una pesadilla. Pero entonces recuerda su política de seguridad personal: por cada nuevo servicio, ha estado guardando el código QR inicial como una captura de pantalla en su gestor de contraseñas cifrado. Instala una nueva app de autenticación en su iPhone, abre su gestor de contraseñas y, uno por uno, vuelve a escanear los códigos QR guardados. En diez minutos, las 30 cuentas están migradas y funcionando perfectamente.

Lección: El secreto TOTP (como una cadena Base32 o código QR) es la verdadera clave. Ser independiente de una única app de autenticación al respaldar de forma segura tus secretos te da verdadera propiedad y portabilidad.

Errores y trampas comunes

  • Tratar el secreto a la ligera. El código QR o la cadena Base32 que te dan al configurar es la clave secreta. Si un atacante la consigue, puede generar códigos válidos para siempre. No le saques una captura de pantalla y la dejes en tu escritorio, no te la envíes por correo electrónico y no la guardes en un archivo de texto plano. Trátala como una contraseña maestra.
  • Olvidar guardar los códigos de recuperación. Cuando activas el 2FA, casi todos los servicios te proporcionarán un conjunto de códigos de recuperación de un solo uso. ¡IMPRÍMELOS! Guárdalos en un lugar seguro (una caja fuerte de verdad o, como mínimo, en tu gestor de contraseñas). Si pierdes tu teléfono, estos códigos son tu única forma de volver a entrar a tu cuenta sin un doloroso proceso de soporte.
  • Asumir que tu app de autenticación está respaldada. Muchas apps de autenticación simples (como el Google Authenticator original) solo guardan los secretos en ese dispositivo. Si el teléfono se pierde o se borra, los secretos se van para siempre. Usa una app que ofrezca sincronización en la nube segura y cifrada (como Authy o 1Password) o sé disciplinado y respalda tus secretos manualmente.
  • Ignorar el desfase del reloj. El TOTP se basa en el tiempo. Si el reloj de tu teléfono está desfasado por más de un minuto o dos con respecto a la hora real, los códigos que genere serán rechazados. Configura siempre tu teléfono y tu computadora para "Ajustar hora automáticamente". Es casi siempre el culpable cuando los códigos válidos de repente dejan de funcionar.

Por qué debería estar en tu radar

Si eres un desarrollador que construye cualquier sistema con cuentas de usuario, deberías implementar MFA, y TOTP es la mejor opción de estándar abierto para 2FA basado en apps. Es más seguro que los SMS y más abierto que los sistemas propietarios de notificaciones push. Entender cómo generar un secreto, crear una URI otpauth:// y validar un token entrante es una habilidad fundamental para construir aplicaciones seguras.

Incluso si nunca implementas un sistema TOTP por tu cuenta, eres un usuario de ellos en plataformas como AWS, Cloudflare, GitHub y npm. Saber cómo funciona la magia por dentro te empodera para usarlo de forma más segura. Te ayuda a entender la importancia de proteger el secreto inicial, guardar tus códigos de recuperación y elegir la app de autenticación adecuada para tus necesidades. Desmitifica ese pequeño número de seis dígitos que se interpone entre tus datos y los tipos malos.

Para profundizar

Teoría lista. Hora de ensuciarse las manos — 100% en tu navegador.

Probar la herramienta: Generador de TOTP / 2FA