Es una recomendación común devolver "El nombre de usuario o la contraseña son incorrectos" en lugar de "El nombre de usuario no existe" cuando el nombre de usuario no existe y "La contraseña es incorrecta" cuando el nombre de usuario existe pero la contraseña es incorrecta.
La razón generalmente citada es que no desea proporcionar a un atacante con el conocimiento de que existe un nombre de usuario, para evitar ataques de fuerza bruta en línea.
Sin embargo, si el nombre de usuario se usa para iniciar sesión, tiene que ser único y, por lo tanto, deberá informar al usuario de que el nombre de usuario elegido se toma mientras crean una cuenta. Por lo tanto, un atacante puede determinar fácilmente si existe un nombre de usuario incluso si solo dices que "el nombre de usuario o la contraseña son incorrectos" al iniciar sesión.
Pero incluso si no existe una página de registro, o se toman otras medidas para ocultar la existencia de nombres de usuario en el registro, esta recomendación aún no tiene sentido. Los nombres de usuario no están diseñados para ser secretos. La mayoría de las personas reutilizan los nombres de usuario, y son fáciles de encontrar. Y mantenerlos en secreto solo mejora la seguridad en la medida en que aumenta el tamaño total de su secreto, lo que puede lograrse con las contraseñas necesarias más largas.
Y además, hay mejores formas de prevenir los ataques de fuerza bruta en línea que los secretos más largos. Limitar la tasa de usuarios en el inicio de sesión, que un algoritmo hash de contraseña correctamente lento como bcrypt ya lo hace implícitamente, o proporcionar un tiempo de espera después de muchos intentos incorrectos, resuelve este problema mucho mejor que un secreto más largo.
¿Hay algo más que me esté perdiendo? Incluso en este sitio veo personas que defienden esta práctica, pero todavía tengo que ver una razón que no se resuelve mejor con otros métodos.
Editar: Como seguimiento, si esta recomendación realmente no es útil, ¿por qué sigue siendo común? ¿Y de dónde vino?