¿Qué problemas tiene este procedimiento de "recuperación de cuenta"?

11

En un sitio web que ejecuto, he implementado este procedimiento para la recuperación de la cuenta (procedimiento de contraseña olvidada). Me gustaría saber si hay algún problema con él que no haya visto, que lo haga inseguro.

Cuando el usuario crea una cuenta, debe ingresar una contraseña (por supuesto) y una dirección de correo electrónico. También se les pide que seleccionen una "pregunta secreta" de una lista de unas 20 preguntas y que ingresen una "respuesta secreta" a esa pregunta. La contraseña y la respuesta secreta de question están en hash, cada una con una sal diferente, aleatoria. Supongamos que la función de hash utilizada es adecuada. (El usuario puede cambiar su correo electrónico, contraseña y / o pregunta / respuesta secreta en cualquier momento, debe ingresar la contraseña para hacerlo. No impongo ningún requisito de seguridad de contraseña, excepto un requisito de longitud mínima).

Si el usuario necesita recuperar la cuenta, accede a la página de recuperación de cuenta e ingresa su nombre de usuario. Se envía un correo electrónico a la dirección de correo electrónico asociada a su cuenta. Este correo electrónico contiene un enlace que contiene un código generado de forma aleatoria (site.com/accountrecovery?user=1234&code=bryvthery6y65htee o similar). Cuando el usuario hace clic en el enlace, regresa al sitio y, asumiendo que el código lo comprueba, lo lleva a una página donde se le hace la pregunta secreta, debe responderla y, al mismo tiempo, ingresar una nueva contraseña. / p>

Siempre que se cambie la contraseña almacenada o la respuesta secreta, con cualquier método, se genera un nuevo salt aleatorio para él.

¿Hay algún problema con esta configuración que me viene a la mente? Me gustaría una crítica constructiva. La idea detrás de esto es que para poder restablecer la contraseña, el usuario debe tener acceso a la dirección de correo electrónico registrada y debe conocer la respuesta secreta.

    
pregunta Hammerite 13.06.2011 - 14:14
fuente

2 respuestas

8

En general, esto parece razonable para un sitio promedio. Sugeriría algunos cambios menores:

  • Personalmente, consideraría eliminar la pregunta secreta. No creo que las preguntas de seguridad agreguen mucha seguridad; pero son otro secreto que el usuario puede olvidar o equivocarse, por lo que las preguntas de seguridad tienen un costo real para la experiencia del usuario. Se han realizado investigaciones académicas que sugieren que las respuestas a las preguntas secretas tienen poca entropía y que pueden ser objeto de fraude tan fácilmente como las contraseñas. Por lo tanto, creo que eliminar la pregunta secreta mejorará la usabilidad y no tendrá mucho efecto en la seguridad. En efecto, la seguridad del sistema depende de la dirección de correo electrónico del usuario. El principal riesgo de que se dirija la pregunta secreta es cuando el usuario cierra su cuenta de correo electrónico, y luego alguien más registra el mismo correo electrónico y puede adivinar el nombre de usuario del usuario; o donde la cuenta de correo electrónico del usuario es secuestrada; o donde el usuario comparte su cuenta de correo electrónico con otras personas.

  • Yo agregaría un indicador de seguridad de contraseña a la página donde el usuario elige su contraseña. Vea qué sitios como Google usa, donde hay una barra que indica dinámicamente la fortaleza de la contraseña y que cambia de color (rojo = pobre, amarillo = borde, verde = bueno). Esto podría inducir / ayudar a los usuarios a elegir mejores contraseñas. Probablemente no necesite imponer requisitos mínimos de resistencia, esto puede proporcionar suficiente empujón.

  • Haría que el código de recuperación fuera limitado en el tiempo, de modo que deba usarse dentro de (digamos) una hora o dos, y luego ya no se acepte después del final del período de validez. Además, el enlace debe expirar inmediatamente en el primer uso (gracias, @AviD, por señalarlo).

  • Use SSL / TLS (es decir, HTTPS) para toda la actividad relacionada con la selección / configuración / envío de la contraseña del usuario. Esto protegerá contra la escucha de contraseñas para los usuarios que acceden a su sitio a través de una red inalámbrica abierta; Sin embargo, no protege contra Firesheep. Considere adoptar SSL / TLS en todo el sitio, que protegerá contra Firesheep.

(Supongo que no tiene ninguna necesidad de seguridad especialmente sensible: por ejemplo, esto no es para banca en línea o similar).

    
respondido por el D.W. 13.06.2011 - 20:03
fuente
8

Como de costumbre, depende de la naturaleza de lo que estás protegiendo. Parece bastante decente para información básica. Puede necesitar más si está escribiendo código para algo de alto nivel, como la banca por Internet.

Cada vez que se usan preguntas / respuestas secretas, la respuesta toma el lugar de una contraseña en algún lugar, y es fácil que sea su enlace más débil. Dado que las respuestas secretas pueden ser fácilmente cosas que un atacante podría descubrir al buscar en Google a la persona, puede ser un factor de riesgo real, y es difícil pisar la línea de preguntas que son tan inusuales que no son relativamente fáciles de entender y las preguntas. que son tan esotéricos o no aplicables que el propietario de la cuenta no puede responderlos.

Me gusta la idea de @ Iszi de dejar que la persona escriba sus propias preguntas y respuestas, un conjunto, que evita el problema muy bien.

En el caso de que mencione si un atacante puede interceptar el correo electrónico proveniente de su sistema, entonces no necesita la cuenta del usuario. Eso significa que la mayor línea de defensa es ese secreto compartido.

No lo dijo, pero supongo que toda la configuración de la cuenta y el restablecimiento de la contraseña se realizan con la protección SSL / TLS, ¿verdad? Si no, ese sería probablemente el problema más grande.

    
respondido por el bethlakshmi 13.06.2011 - 16:30
fuente

Lea otras preguntas en las etiquetas