Supongamos que quiero implementar un sistema OTP que genere números de 6 a 10 dígitos. (supongamos que se usa para restablecer la contraseña o enviar dinero)
Las OTP tienen un tiempo de caducidad, por lo que se eliminan de la memoria del servidor.
He estado buscando en Internet, pero no pude encontrar una sola referencia a las siguientes mejores prácticas:
El "atacante / usuario" debe proporcionar el correo electrónico junto con la OTP para usarlo.
La razón por la que pregunto es porque tengo un colega que desea implementar la OTP de la siguiente manera:
- Generar OTP, almacenar (OTP, correo electrónico, expireTime, propósito) en la memoria del servidor. Si se vuelve a generar el mismo OTP, la entrada anterior se eliminará de la memoria.
- Enviar OTP al correo electrónico.
- Pregunte SOLO la entrada de OTP del usuario (ejemplo / VerifyEmail? OTP = 100434).
- Obtenga el (correo electrónico, propósito) de la memoria del servidor para la OTP
- Use la OTP para el propósito
No podría convencerlo de que esto es inseguro, ya que un atacante puede simplemente generar OTP aleatorias y llamar a las rutas, y provocar automáticamente algunas acciones. ("La OTP solo expira en 3 minutos", "solo de vez en cuando será un problema", "Lo usamos en otro proyecto y estaba bien", etc.).
Lo que necesito es una publicación de blog o artículo (no demasiado técnico) que explique POR QUÉ esto es inseguro.
Además, ¿cuáles son las formas de implementar un buen sistema OTP de 6 a 10 dígitos?
¿Es suficientemente buena la generación aleatoria de OTP?
Mi sugerencia sería requerir solo unicidad de par (correo electrónico, OTP) en lugar de unicidad de OTP y requerir que el usuario suministre correo electrónico + OTP. ¿Esto es seguro?