OTP
Un código que sirve una sola vez. Cómo se genera, qué separa al código de una app del que llega por SMS, y por qué esa diferencia decide si un SIM swapping se lleva la cuenta.
En síntesis
Un OTP es un código de un solo uso que un sistema pide para confirmar que quien está del otro lado tiene acceso a un canal o a un dispositivo determinado. Vale para una sola operación y durante una ventana corta, y esa caducidad es toda su gracia: un código robado después de usarse no sirve para nada.
Es el segundo factor más extendido de la industria y el más fácil de implementar. También es el que más variantes tiene, y las variantes no valen lo mismo.
El código se deriva de un contador o de un reloj
Hay dos formas de producir un código de un solo uso, y conviene separarlas desde el principio porque no tienen las mismas propiedades.
Detrás de un OTP generado por algoritmo, que es el caso de HOTP y de TOTP, hay un secreto compartido, la semilla, que el servidor y el generador del código conservan por separado. A partir de esa semilla se calcula el código. Lo que cambia entre los dos algoritmos estándar es qué entra en el cálculo además del secreto.
- HOTP — el código deriva de un contador que avanza cada vez que se genera uno nuevo, según el RFC 4226. No caduca por tiempo: sigue siendo válido hasta que se usa o hasta que el servidor resincroniza el contador.
- TOTP — el código deriva del reloj, en ventanas fijas que habitualmente son de 30 segundos, según el RFC 6238. Caduca solo, sin que nadie lo use.
Los dos comparten la misma condición estructural: existe un secreto y vive en dos lugares. Quien obtiene la semilla puede generar códigos válidos sin tocar nunca el dispositivo de la persona.
En el OTP por SMS y en el OTP por email no hay semilla ni nada que la persona conserve. El servidor genera un código aleatorio en el momento y lo transmite por un canal, y todo el peso de la seguridad pasa a ese canal. Es la diferencia que explica la sección siguiente.
El canal cambia el nivel de seguridad, no el código
El código de seis dígitos se ve igual siempre. Lo que cambia es por dónde llega, y ahí está la diferencia real entre implementaciones.
- OTP de app — el código se calcula en el dispositivo, con la semilla guardada localmente. No viaja por ninguna red. Para interceptarlo hay que llegar al dispositivo o a la semilla.
- OTP por SMS — el código se genera en el servidor y viaja por la red móvil hasta la línea telefónica. El factor no está atado al dispositivo: está atado al número.
- OTP por email — el factor hereda la seguridad de la casilla de correo, que suele estar protegida con una contraseña y, con suerte, con otro factor.
Un OTP de app y un OTP por SMS se ven idénticos para el usuario. Para un atacante son dos problemas distintos.
El OTP por SMS es el factor que rompe un SIM swapping
El SIM swapping consiste en conseguir que la operadora reasigne una línea a una SIM que controla el atacante. Desde ese momento, todos los mensajes de esa línea llegan a otro teléfono, incluidos los códigos.
Lo incómodo del caso es que no hay nada comprometido del lado del cliente. La contraseña sigue siendo secreta, el teléfono sigue en el bolsillo del titular y el sistema de autenticación funciona exactamente como fue diseñado. El factor se entregó a la línea correcta. La línea cambió de dueño.
Un segundo límite alcanza a todos los OTP, no solo a los de SMS: el código se puede transcribir en el lugar equivocado. En un ataque de phishing o smishing con retransmisión en tiempo real, el atacante pide el código en su propio sitio y lo usa contra el sistema real dentro de la ventana de validez. El código funciona porque es legítimo.
Un factor que la persona puede leer y repetir es un factor que puede repetir frente a quien no debe.
Dónde conviene reemplazarlo y dónde no
El OTP no está roto. Está por debajo de lo que exige una operación de alto valor, y sigue siendo razonable para muchas otras.
- Contra el robo de credenciales, alcanza. Una contraseña filtrada no abre la cuenta si falta el segundo factor. Es lo que frena un ataque de credential stuffing.
- Contra el phishing con retransmisión, no alcanza. Ningún código transcribible resiste ese vector. Lo que sí resiste es una credencial atada al origen, que es lo que aportan FIDO2 y las passkeys.
- Contra el SIM swapping, el canal decide. Mover el OTP de SMS a app elimina el vector completo sin cambiar el modelo mental del usuario.
La pregunta de diseño no es si usar OTP. Es qué factor cubre qué operación, y eso es una decisión de MFA.
Preguntas frecuentes
Es un código de un solo uso que un sistema pide para confirmar que quien intenta acceder tiene control sobre un dispositivo o un canal determinado. Vale para una sola operación y caduca por tiempo o por uso. Hay dos formas de producirlo: los OTP generados por algoritmo, como HOTP y TOTP, se calculan a partir de un secreto compartido entre el servidor y el generador del código; los que llegan por SMS o por email son códigos aleatorios que el servidor genera y transmite por un canal, sin ningún secreto guardado del lado de la persona. Su función es agregar un segundo factor a una autenticación que, con la contraseña sola, depende de un dato que puede haberse filtrado.
Cambia lo que entra en el cálculo junto con el secreto compartido. HOTP usa un contador que avanza con cada código generado y el resultado no caduca por tiempo, así que un código emitido y no usado sigue siendo válido hasta que se consuma o el servidor resincronice. TOTP usa el reloj y genera un código nuevo por ventana de tiempo, habitualmente de 30 segundos, con lo que la validez se cierra sola. Por eso TOTP es el más usado en aplicaciones de autenticación: reduce la vida útil de un código interceptado sin pedirle nada al usuario.
Es mejor que no tener segundo factor y es el más débil de los que existen. El código viaja a una línea telefónica, no a un dispositivo, y quien controla la línea recibe los códigos. Ese es exactamente el resultado de un SIM swapping, donde el atacante consigue que la operadora reasigne el número a una SIM propia. Para operaciones de alto valor conviene mover el factor a una app de autenticación, que calcula el código en el dispositivo y no depende de la red móvil.