Primero que todo: ¡No importa lo que debas usar TLS para cifrar el tráfico de la red en todas partes, lo que te protege de los sniffs de la red!
Un ataque no técnico y común en el uso de contraseñas es shoulder-surfing . Así que no estoy de acuerdo con otros que afirman que reutilizar OTP no es un problema.
Debe registrar el contador (para HOTP) o el intervalo de tiempo (para TOTP) de la última autenticación exitosa para evitar ataques de repetición y, de hecho, hacer un valor OTP una sola vez.
Para HOTP esto es obligatorio. Pero no todas las implementaciones del validador TOTP lo hacen porque también presenta un pequeño inconveniente para el usuario de esperar el siguiente paso de tiempo (generalmente 30+ segundos).
Si lo está implementando, le recomiendo que lea detenidamente las secciones de consideraciones de seguridad y requisitos de seguridad en RFC 4226 y / o RFC 6238 . Especialmente los aspectos de manejo seguro fuera de sincronización / condiciones de deriva son importantes. Definitivamente vale la pena pensar en esto.
En mi propia implementación, he vuelto a factorizar el manejo de errores para consumir siempre de manera confiable un valor OTP válido, significa contador de actualización o paso de tiempo, incluso si otras partes del proceso salieron mal (por ejemplo, contraseña incorrecta, etc.).