Pregunta antigua, pero como la pregunta es sobre seguridad y no conveniencia , siento que a todas estas respuestas les falta un aspecto importante: ataques de enumeración . Estoy de acuerdo en que las contraseñas y / u otro segundo factor es lo que se usa para autenticar a los usuarios como usuario 2428118 mencionado anteriormente y no el nombre de usuario / correo electrónico, por lo que no voy a discutir eso en absoluto. Además, en el caso de una violación de la base de datos, ni el nombre de usuario ni el correo electrónico son más o menos seguros, ya que ambos están almacenados en texto sin formato.
Sin embargo, un aspecto de seguridad que no aborda ninguna de estas preguntas es nombre de usuario / email enumeración. En la seguridad de las aplicaciones, nuestro objetivo es minimizar o eliminar el conocimiento que tiene un pirata informático que les ayudaría a ingresar al sistema. Si pueden determinar el nombre de usuario o el correo electrónico utilizado para una cuenta, esa cuenta es menos segura que una cuenta de la que el hacker no tiene conocimiento.
Si usamos nombres de usuario para la autenticación, necesitamos una forma de decirle a un usuario que su nombre de usuario deseado ya está en uso cuando se registran. Esto puede ser explotado por un hacker para determinar si ya existe un nombre de usuario determinado. Eso es algo malo porque si conocen el nombre de usuario, pueden intentar iniciar sesión con las contraseñas más utilizadas de las violaciones de base de datos anteriores. Estas contraseñas comunes están fácilmente disponibles en línea.
Sin embargo, si en cambio usamos direcciones de correo electrónico para la autenticación, al agregar una nueva cuenta y el correo electrónico ya existe, simplemente envíe un correo electrónico de recuperación de contraseña al usuario en lugar de un nuevo correo electrónico de registro. Sin embargo, en la interfaz de usuario, simplemente diga al usuario que revise su dirección de correo electrónico para obtener más instrucciones, pero no da ninguna indicación de si esa dirección es válida o no.
Correo electrónico
- Hacker puede adivinar basándose en su nombre usando [email protected] u otras direcciones de uso común (por ejemplo, [email protected], [email protected], etc.) o completando un formulario web y utilizando la dirección en el respuesta de correo electrónico para intentar la autenticación. Sin embargo, los usuarios generalmente son libres de elegir cualquier dirección de correo electrónico que quieran, incluso direcciones personales, y los usuarios que inician sesión no necesariamente tienen que estar afiliados o empleados por el sitio web en el que inician sesión, por lo que en este caso no tendrían una @empresa. La dirección de correo electrónico .com se registra en el sitio web company.com.
- Los ataques de enumeración se pueden prevenir.
Nombre de usuario
- A veces se muestra en línea (por ejemplo,
"This post was created by {{username}} on {{date}}"
), mientras que los correos electrónicos, con suerte, nunca deben mostrarse en texto sin formato.
- Los ataques de enumeración no se pueden prevenir
- Más vulnerables a los ataques de diccionario, ya que las personas suelen elegir nombres de usuario simples (por ejemplo, su nombre).
Bonificación: Dicho esto, otra forma (más difícil) en que un pirata informático puede determinar si existe un nombre de usuario o correo electrónico en el sistema es intentar iniciar sesión y ver los tiempos de respuesta de la página. Las mejores pautas de seguridad muestran que queremos que nuestras contraseñas se hagan con un hash lento, sin embargo, si no existe un nombre de usuario o correo electrónico en la base de datos, no tendremos que verificar el hash de la contraseña porque no hay un usuario coincidente. Si nuestro hash tarda 100 ms en realizarse y la consulta de la base de datos tarda 5 ms, los tiempos de respuesta para una solicitud de un usuario válido serán, en promedio, 95 ms más lentos que un usuario no válido. La forma de solucionar esto es mediante el hash siempre de la contraseña proporcionada, incluso si el usuario no existe en la base de datos, o si el usuario existe, simplemente verifico el hash en la base de datos.