Estoy buscando el mejor método para implementar una función de "contraseña olvidada".
Salgo con 2 ideas:
Cuando el usuario hace clic en Olvidé mi contraseña, el usuario debe ingresar el nombre de usuario, correo electrónico y tal vez la fecha de nacimiento o apellido. Luego, se enviará un correo con contraseña temporal a la cuenta de correo electrónico del usuario. El usuario utiliza la contraseña temporal para iniciar sesión y restablece su contraseña.
Similar, pero el correo electrónico contendría un enlace para permitir al usuario restablecer su contraseña.
¿O alguien puede sugerirme una forma mejor y segura? También estoy pensando en enviar la contraseña o el enlace temporal, obligar al usuario a restablecer la contraseña dentro de las 24 horas o, de lo contrario, la contraseña o el enlace temporal no serán utilizables. ¿Como hacer eso?
Respuestas:
Actualización: revisada en mayo de 2013 para un mejor enfoque
password_change_requests
con las columnasID
,Time
yUserID
. Cuando el nuevo usuario presiona el botón, se crea un registro en la tabla. LaTime
columna contiene el momento en que el usuario presionó el botón "Olvidé mi contraseña". ElID
es una cadena. Se crea una cadena larga y aleatoria (por ejemplo, un GUID) y luego se corta como una contraseña (que es un tema separado en sí mismo). Este hash se usa como 'ID' en la tabla.http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF
. La página olvidadapassword.jsp debería poder recuperar el parámetro ID. Lo siento, no conozco Java, así que no puedo ser más específico.ID
de la URL, lo vuelve a cifrar y lo compara con la tabla. Si dicho registro está allí y no tiene más de, por ejemplo, 24 horas, se le solicita al usuario que ingrese una nueva contraseña .fuente
ID
,UserID
,Time
,TokenHash
.. Usted va a generar dos largos, cadenas aleatorias Ponga la primera cadena (el "id") en laID
columna; hash de la segunda (el "token" ) y coloque el hash en laTokenHash
columna. Genere el enlace comoforogotPassword.jsp?id=asdasd&token=asdasd
. El token en el enlace NO tiene hash. ¿Tiene sentido ahora?Todo depende de su sitio y del nivel de seguridad que está tratando de lograr, pero el proceso básico para una aplicación web es algo similar a lo siguiente:
El usuario navega a la página 'Olvidé mi contraseña' e ingresa su nombre de usuario o correo electrónico (el que sea único) para solicitar un restablecimiento de contraseña.
Opcionalmente, en esta etapa, puede confirmar la solicitud solicitando información adicional, como la respuesta a una pregunta de seguridad predefinida o su fecha de nacimiento, etc. Este nivel adicional impide que los usuarios reciban correos electrónicos que no solicitaron.
Busque la cuenta del usuario. Guarde una contraseña temporal (generalmente un GUID) y una marca de tiempo en el registro de la cuenta. Enviar un correo electrónico al usuario que contiene la contraseña temporal.
El usuario hace clic en el enlace que contiene la contraseña temporal y el identificador del usuario en el correo electrónico o navega a la página 'Olvidé mi contraseña' y copia y pega la contraseña temporal y su identificador. El usuario ingresa su nueva contraseña y la confirma.
Busque el registro del usuario y, si la hora actual se encuentra dentro de un límite de tiempo especificado (por ejemplo, 1 hora) de la marca de tiempo guardada en el paso 2, haga un hash y guarde la nueva contraseña. (¡Obviamente solo si las contraseñas temporales coinciden!). Elimine el GUID temporal y la marca de tiempo.
El principal aquí es que el usuario recibe una contraseña temporal por correo electrónico que le permite cambiar su contraseña. La contraseña almacenada originalmente (¡debe estar cifrada!) Nunca se cambia a una contraseña temporal en caso de que el usuario la recuerde.
La contraseña original nunca se mostrará al usuario, ya que debe ser hash y desconocida.
Tenga en cuenta que este proceso depende completamente de la seguridad de la cuenta de correo electrónico del usuario. Por lo tanto, depende del nivel de seguridad que desee alcanzar. Esto suele ser suficiente para la mayoría de los sitios / aplicaciones.
fuente
Troy Hunt destaca algunos puntos excelentes en su artículo: Todo lo que siempre quiso saber sobre la creación de una función de restablecimiento de contraseña segura . Los extractos más relevantes son:
...
...
...
...
Él hace muchos más puntos buenos sobre cómo evitar fugas de información, CAPTCHA, autenticación de dos factores y, por supuesto, las mejores prácticas básicas como el hash de contraseñas. Creo que es importante tener en cuenta que no estoy de acuerdo con Troy sobre la utilidad de las preguntas de seguridad, prefiriendo el escepticismo de Bruce Schneier sobre la práctica :
fuente
Iré con:
fuente
Cuando envíe información por correo electrónico, no será segura. Hay muchas maneras en que alguien puede obtenerlo. Sería un juego de niños para un pirata informático experto que busca robar su información.
Abstenerse de enviar cualquier información personal, como contraseñas e información de ingresos, por correo electrónico, ya que puede ser MUY EMBARAZO para usted y su organización si dicha información se filtró o fue robada. Piensa en la seguridad en serio. Solo se necesita ese incidente para que caigan todos los ladrillos.
En cuanto a la recuperación de la contraseña, lea detenidamente las mejores prácticas de Olvidé mi contraseña .
EDITAR: enlace actualizado
fuente
Como se dijo, depende del nivel de seguridad requerido, sin embargo, si necesita un nivel superior, algunas soluciones novedosas que he visto incluyen;
Mostrar la mitad de la contraseña temporal cuando se ha confirmado la identidad del usuario (pregunta de seguridad, dirección de correo electrónico, etc.) y luego enviar la otra mitad a la cuenta de correo electrónico. Si la cuenta de correo electrónico se ha visto comprometida, es poco probable que la misma persona también haya logrado realizar un ataque de hombre en el medio. (Visto en la puerta de enlace del gobierno del Reino Unido)
Confirmación de identidad por correo electrónico y otro medio, por ejemplo, un código enviado por mensaje de texto a un teléfono móvil registrado. (Visto en eBay / PayPal)
Para un punto intermedio entre estos dos extremos, la implementación de preguntas de seguridad puede ser el camino a seguir, como lo menciona DaveG.
fuente
Si incluye una dirección de correo electrónico con el registro. El botón "olvidar contraseña" envía un correo electrónico a esa dirección de correo electrónico. Asegura que la información se envíe a un correo electrónico confiable.
(A menos que la base de datos esté pirateada, pero nada sea seguro).
fuente
Aquí hay tres enlaces muy buenos que proporcionan información sobre restablecimientos de contraseña:
http://jtauber.com/blog/2006/03/20/account_management_patterns/
(No permita que los usuarios confirmen con GET): http://www.artima.com/forums/flat.jsp?forum=106&thread=152805&start=15&msRange=15
http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf
Espero que ayude. Seguro que me ayudaron a entender el problema.
fuente
Haría cumplir direcciones de correo electrónico únicas en todas las cuentas.
Luego, se trata simplemente de enviar un enlace a una página temporal que permita a la persona cambiar su contraseña. (permita 24 horas o menos)
La cuenta de correo electrónico del usuario es el enlace más débil en este escenario.
fuente
Nunca envíe una contraseña por correo electrónico al usuario. Incluso si se genera automáticamente. El mejor enfoque (recomendado y utilizado por SANS y otros):
Si no hace clic en el enlace dentro de las 24 horas más o menos, desactívelo (para que ya no cambie la contraseña).
Nunca cambie la contraseña sin el consentimiento del usuario. Significa no enviar por correo electrónico una nueva contraseña solo porque alguien hizo clic en el enlace de contraseña olvidada y descubrió el nombre de la cuenta.
fuente