Estoy buscando la forma sin base de datos de cómo validar un código secreto que fue enviado al teléfono móvil del usuario mediante la aplicación web RESTful, en un proceso de autenticación de 2 factores.
En el paso 1, el usuario proporciona el nombre de inicio de sesión y la contraseña que se validan con los datos de la base de datos. Ahora el sistema genera un código que se envía al teléfono móvil del usuario. Para mayor comodidad, el código debe ser relativamente simple, digamos 5 dígitos numéricos. El usuario debe proporcionar este código para completar el proceso de autenticación.
Me gustaría evitar los viajes a la base de datos tanto como sea posible, así que uso JWT para mantener el estado. Pero sería absurdo almacenar el código de autenticación secreto en el JWT, porque se puede extraer fácilmente en el lado del cliente. Por lo tanto, debe ser almacenado en forma de hash o cifrado. Estoy considerando compartir el código secreto con sal fuerte (conocido solo por el servidor) y luego almacenar el hash SHA256 del resultado (el hash bcrypt no es bueno aquí porque contiene la sal). Eso haría que el código secreto quedara oculto a cualquier mirada indiscreta, pero aún así sería útil para validar el código cuando lo proporciona alguien que lo conoce. Y el servidor puede olvidar el código mientras tanto.
¿Puede este enfoque considerarse seguro para el propósito dado?