OTP significa contraseña de un solo uso (a veces código de verificación de un solo uso). Es un código corto, normalmente de cuatro a ocho dígitos, válido para un único inicio de sesión o una única transacción y que luego expira. Como cada código funciona solo una vez y solo durante una ventana breve, un código que se filtre después de haberse usado no tiene valor para un atacante. Esa cualidad desechable es la razón de ser de los OTP.
Seguramente ya hayas escrito uno: los seis dígitos que tu banco te envía por mensaje antes de una transferencia, el código que una app de autenticación muestra al iniciar sesión, el número que un sitio web te envía por correo para confirmar que eres tú. Todos son OTP, y se diferencian sobre todo en cómo se genera el código y cómo te llega.
¿Cómo funciona un OTP?
El servicio y el usuario necesitan una forma de ponerse de acuerdo sobre cuál es el código válido en este momento, sin enviar la contraseña de manera predecible. Hay dos métodos estándar, y la diferencia es qué hace que el código cambie.
- HOTP (contraseña de un solo uso basada en HMAC). El código se deriva de un secreto compartido y un contador. El token del usuario avanza el contador cada vez que genera un código. El verificador del servicio avanza su estado correspondiente tras aceptar el código esperado. Un código HOTP no expira solo porque pase el tiempo.
- TOTP (contraseña de un solo uso basada en tiempo). El código se deriva de un secreto compartido y la hora actual, redondeada a una ventana (normalmente 30 segundos). El código cambia por sí solo a medida que pasa el tiempo, lo haya usado alguien o no. Esto es lo que generan las apps de autenticación.
TOTP es el más común de los dos porque la expiración automática limita cuánto tiempo es útil un código robado. HOTP sigue apareciendo en tokens de hardware y en flujos donde es difícil garantizar un reloj sincronizado.
¿Cómo se entrega un OTP?
El método de generación y el canal de entrega son decisiones independientes. Un código puede calcularse en el propio dispositivo del usuario, o generarse en el servidor y enviárselo.
- SMS. El servidor genera un código y lo envía por mensaje de texto al número de teléfono del usuario. Alcance universal, sin necesidad de app. También es el canal más vulnerable a interceptación, mediante SIM-swap o ataques a la red.
- Email. El código llega a la bandeja de entrada del usuario. Cómodo y sin app, pero solo tan seguro como la propia cuenta de correo.
- Llamada de voz. Una llamada automatizada lee el código en voz alta, lo que ayuda a usuarios que no pueden recibir SMS o que necesitan una opción accesible.
- App de autenticación. El código se calcula localmente con TOTP. No se envía nada por la red, así que no hay nada en tránsito que interceptar.
Cada canal equilibra alcance frente a dificultad de ataque. SMS y el email llegan a casi todos; los códigos generados en app son más difíciles de robar, pero requieren que el usuario haya configurado una app de antemano.
¿Dónde se usan los OTP?
El uso más conocido es como segundo factor en la autenticación de dos factores, donde el OTP demuestra la posesión de un teléfono o dispositivo además de la contraseña. Pero los OTP aparecen mucho más allá del inicio de sesión.
- Verificación de inicio de sesión: confirmar un acceso, especialmente desde un dispositivo o ubicación nuevos.
- Confirmación de transacciones: aprobar un pago, una transferencia o un cambio en los datos de cobro.
- Recuperación de cuenta: confirmar el control de un número de teléfono o email antes de restablecer una contraseña.
- Verificaciones adicionales: pedir un código nuevo antes de una acción sensible, incluso a mitad de sesión.
Si estás evaluando si un OTP convierte un inicio de sesión en genuinamente "two-factor", depende del resto del flujo. La distinción se explica en autenticación de dos factores vs. verificación en dos pasos.
Consideraciones de seguridad y buenas prácticas
Los OTP son simples, y precisamente por eso los detalles importan. Unos pocos hábitos los mantienen eficaces.
- Expiración corta. Limita el tiempo de vida de los códigos. Unos pocos minutos para SMS y email, la ventana estándar de 30 segundos para TOTP. Cuanto más corta la ventana, menor la probabilidad de que un código se reutilice.
- Limitación de solicitudes. Limita tanto cuántos códigos puede solicitar un usuario como cuántos intentos de adivinación puede hacer. Un código de seis dígitos tiene un millón de posibilidades, algo que un atacante sin restricciones puede probar por fuerza bruta; unos pocos intentos por código cierran esa puerta.
- Uso único, aplicado del lado del servidor. Invalida un código en el momento en que se acepta, y también tras demasiados intentos fallidos. No dependas del cliente para evitar la reutilización.
- Nunca registres el código. Mantén los OTP fuera de los logs de la aplicación, las analíticas y los informes de errores. Un código guardado en un archivo de log es un código que un empleado interno o una brecha en los logs puede leer.
- Vincula el código al contexto. Asocia un código al usuario y la acción específicos para los que se emitió, de modo que un código destinado a un propósito no pueda reutilizarse para otro.
Una nota sobre phishing: se puede engañar a un usuario para que lea un código SMS o de app a un atacante en un sitio falso, así que los OTP no son a prueba de phishing como las llaves de hardware. Aun así bloquean el ataque mucho más común, que es alguien iniciando sesión solo con una contraseña robada.
Envío y verificación de OTP
Puedes ejecutar un flujo OTP tú mismo: genera un código, almacénalo con una expiración, envíalo y comprueba la entrada del usuario dentro de la ventana. Si quieres que la entrega y la verificación se gestionen por ti (incluidas la limitación de solicitudes y la expiración), el producto Verifications de Bird envía y valida códigos por SMS, voz y email. Si solo necesitas el transporte y quieres controlar la lógica de verificación, el producto SMS cubre la entrega de códigos a teléfonos.
Preguntas frecuentes
¿Cuál es la diferencia entre HOTP y TOTP?
HOTP avanza el contador del token del usuario cuando genera un código. El verificador del servicio avanza su estado tras aceptar el código esperado. TOTP deriva su código de la hora actual, por lo que cambia en un horario fijo (normalmente cada 30 segundos). TOTP es más común porque la expiración automática limita la utilidad de un código robado.
¿Son seguros los OTP por SMS?
Son lo bastante seguros para la mayoría de las cuentas y bloquean la mayor parte de los ataques basados solo en contraseña, pero SMS puede interceptarse mediante fraude de SIM-swap o ataques a la red. Para cuentas de alto valor, es preferible una app de autenticación o una llave de hardware.
¿Cuánto tiempo debe permanecer válido un OTP?
Lo suficiente para que el usuario lo lea y lo escriba, y nada más. Unos pocos minutos para SMS o email, y la ventana estándar de 30 segundos para TOTP. Las ventanas más cortas reducen la probabilidad de que un código filtrado siga siendo utilizable.
¿Se puede usar el mismo OTP dos veces?
No debería. Un sistema correctamente implementado invalida un código en el momento en que se acepta, y también tras demasiados intentos fallidos. Aplica el uso único en el servidor, nunca en el cliente.
Las contraseñas de un solo uso son una idea sencilla que tiene mucho peso en la seguridad de las cuentas. Para ver cómo encajan en una defensa de inicio de sesión completa, lee qué es la autenticación de dos factores, o consulta cómo Bird genera, entrega y verifica códigos en el producto Verifications.