Primero hice esta pregunta en Stack Overflow, pero se sugirió que la Seguridad de la información sería un lugar mejor para ella (bastante obvio en retrospectiva).
Tengo un proceso de autenticación de formularios de aplicación web típico con dos pasos:
- Paso 1: solicite nombre de usuario y contraseña
- Paso 2: solicite algunos caracteres (por ejemplo, 2º, 5º y 8º) de una frase secreta
¿Debo autenticar el nombre de usuario y la contraseña antes de ir al Paso 2? ¿O debería recopilar los tres bits de información (nombre de usuario, contraseña y caracteres) y verificarlos al final?
La mayoría de los sitios web que he visto verifican el nombre de usuario y la contraseña y, si no se autentican, nunca preguntes por los caracteres. Por otro lado, se podría argumentar que verificar todo al final y, si no coinciden, mostrar un mensaje de error que no explique qué bit fallido sería más seguro. Eso proporciona menos información, como mostrar "El nombre de usuario o la contraseña son incorrectos" (sin especificar cuál) en una simple autenticación de 1 paso.
El problema con el segundo enfoque (además de ser menos fácil de usar) es que el Paso 2 requiere obtener un usuario válido en el Paso 1, de lo contrario es difícil saber la longitud de la frase secreta para pedir caracteres válidos (no hay punto que solicita el décimo carácter si la frase solo tiene 9 caracteres de longitud). La aplicación también tendría que guardar la contraseña de forma segura entre los dos pasos.
Entonces, ¿cuál es mejor? ¿Hay un tercer enfoque que deba considerar?