2009-12-31 10 views
25

Estoy buscando implementar una característica Olvidé mi contraseña en mi sitio web. Me gusta la opción en la que un correo electrónico que contiene una URL temporal de uso único que caduca después de un tiempo se envía al usuario.Generar URL temporal para restablecer la contraseña

He mirado en las páginas siguientes para obtener estas ideas, pero no estoy seguro de cómo implementar esta utilizando ASP.NET y C#. Como indicó uno de los usuarios, si puedo implementar esto sin almacenar esta información dentro de la base de datos, será ideal. Por favor avise.

Password reset by emailing temporary passwords

Gracias.

Respuesta

-2

Dependiendo de sus necesidades, usted podría cifrar la información, en un formato similar al siguiente formato

(UserId)-(ExpireDate) 

Cifrar los datos, hacen que el enlace, y luego descifrar los datos y tomar medidas a partir de ahí ...

crudo, pero lo más probable es utilizable, y que no requieren el uso de DB

+29

Es una mala práctica incluir datos en el token de restablecimiento de contraseña. Evento si está encriptado Un pirata informático que conoce el algoritmo podrá restablecer la contraseña de cualquier usuario, incluso sin acceso al buzón del usuario. –

+3

-1. La idea es buena en cierto sentido, pero NO debe usarse debido a un problema de seguridad que Slava explicó en un comentario anterior. – Mohayemin

+5

@SlavaNadvorny Un pirata informático también necesitará conocer la clave del algoritmo de encriptación.Puede suponer que si el pirata informático tiene acceso a la clave de cifrado, probablemente también tenga acceso a los valores hash almacenados, por lo que sí, esta técnica todavía parece una buena idea. – Guillaume

1

Aquí, la clase System.Guid en su amigo, ya que generará una única (bueno, lo suficientemente único) número de 128 bits:

  • Generar un nuevo GUID (System.Guid.NewGuid())
  • tienda que Guid alguna parte (objeto Aplicación tal vez?)
  • Enviar una URL personalizada en un correo electrónico con el que Guid
  • Si el usuario selecciona el sitio, les introduciremos la contraseña que envió en el correo electrónico
  • Si el partido contraseñas, adelante y los obligan a introducir una nueva contraseña
+0

+1: Gracias por esta información sobre el tema/lado :-) –

+3

Se supone que los GUID son únicos, pero se supone que no son criptográficamente fuertes. Es posible adivinar qué GUID se creará y así crear un token para una cuenta específica. – Guillaume

+0

@Guillaume, gracias por la información, ¿realmente es posible? ¿Puedes explicarme un poco sobre cómo se puede adivinar? Estaba pensando en usar GUID. – Don

59

Probablemente la forma más fácil va a ser para modificar su tabla de usuarios para agregar 2 c extra O bien, si no desea modificar la tabla existente, puede agregar una nueva tabla dependiente llamada "UserPasswordReset" o algo así. Las columnas son así:

PasswordResetToken UNIQUEIDENTIFIER, 
PasswordResetExpiration DATETIME 

Si vas con la ruta tabla adicional, se puede hacer también agregar la columna ID de usuario, que sea una clave principal y una referencia clave externa de nuevo a su tabla de usuarios. También se recomienda una restricción ÚNICA. Luego simplemente usa un Guid en su aplicación asp.net como token.

El flujo podría ser algo como esto: Solicitudes

  1. usuario para restablecer contraseña para su cuenta
  2. Se inserta un nuevo registro en la tabla (o actualizar su registro de usuario) mediante el establecimiento de la PasswordResetExpiration a una fecha en el futuro (DateTime.Now.AddDays (1)), y establecer el testigo a Guid.NewGuid()
  3. correo electrónico al usuario un enlace a su página ResetPassword.aspx con el GUID en la cadena de consulta (http://www.yoursite.com/ResetPassword.aspx?token=Guid-here)
  4. Use la página ResetPassword.aspx para validar los campos de token y expiración (POR EJEMPLO Asegúrese DateTime.Now < PasswordResetExpiration)
  5. proporcionar una forma simple que permite al usuario restablecer la contraseña.

sé que quería evitar la modificación de la base de datos, pero lo que realmente es, probablemente, el método más simple.

+1

Nota de seguridad: UNIQUEIDENTIFIER no está destinado a proporcionar aleatoriedad y es inseguro en este escenario. Básicamente, quieres un enlace de restablecimiento que sea imposible de adivinar. Para que sea imposible adivinar su enlace de reinicio, debe incluir un número aleatorio generado por un generador de números aleatorios criptográficamente seguro, que no es un GUID. Entonces, además de sus 2 columnas, necesita una tercera para almacenar ese número aleatorio que actuará como su contraseña y, finalmente, envíe el GUID y la contraseña en el enlace de reinicio como parámetros. – Gudradain

2

he usado una clase de hash para crear conexiones automáticas únicas hechas hasta la fecha/hora actual y la dirección de correo electrónico del usuario:

string strNow = DateTime.Now.ToString(); 
string strHash = strNow + strEmail; 
strHash = Hash.GetHash(strHash, Hash.HashType.SHA1); 

obtener la clase Hash de: http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/

A continuación, que acaba de tomar desde la URL usando:

if (Request.QueryString["hash"] != null) 
{ 
       //extract Hash from the URL 
       string strHash = Request.QueryString["hash"]; 
} 
+0

¿cómo recuperarías nuevamente la dirección de correo electrónico y la fecha del hash para que puedas iniciar sesión automáticamente? Porque los hashes son de una manera ¿verdad ?. Por favor, educate –

+0

@goths puede guardar el valor de Hash en la base de datos y enviar un correo electrónico que contenga una URL con el ID de usuario y el hash adjunto. Luego, en la página a la que apunta la URL, compare el 2 con la base de datos. Esa sería una solución básica, necesitaría algo más sólido para algo que necesita una mayor seguridad. – Alex

+2

Lo siento, pero no veo la utilidad para enviar información en la clave codificada mediante hash si el objetivo es almacenarla junto a la misma información en la base de datos. Lo único que cree que necesita es una clave única, no una versión encriptada de ninguna información "real". La identificación generada única de randow propuesta por Goyuix (ver su respuesta) es simplemente la mejor opción si tiene que enviar y almacenar algo en el DB para poder encontrarlo cuando el usuario haga clic en el enlace dentro del correo electrónico enviado. –

2

@Alex

También puede usar las clases System.Security.Cryptography en .NET para los algoritmos de hash. Por ejemplo:

using System.Security.Cryptography; 
... 
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash); 
... 
0

El objetivo de enviar datos | cadena al correo electrónico del usuario es la validación del propietario de la cuenta. Tenga en cuenta algunos puntos:

  • Evite enviar información importante al reiniciar o activar el enlace.
  • Es mejor manera de almacenar único conjunto de datos de cadena con el usuario cuenta y enviarlo como ese enlace. pero tenga en cuenta si se envía sólo una sección como enlace al correo electrónico del usuario y simplemente comprobar que en la página, su aplicación puede estar en peligro por la fuerza bruta o diccionario atacante. Es suficiente consultar una lista de cadenas para encontrar algunos enlaces y cambiar la contraseña. Sé que tiene una pequeña posibilidad, pero no cero.

Resultado: Creo que es mejor si

  1. combinar correo electrónico del usuario con el enlace de la cadena a continuación, los cifra (no desmenuzar porque el valor hash no puede ser inversa) y enviar al usuario de correo electrónico.
  2. Haz clic en el usuario y tu página obtendrá el valor encriptado.
  3. descifrar el valor.
  4. extraer el correo electrónico del usuario.
  5. encontrar el correo electrónico en la base de datos.
  6. comparar cadena de enlace recibida con otro usuario conectado a la base de datos de correo electrónico .

Buena suerte.

1

Definitivamente incluiría la base de datos en este proceso. Una vez que se solicita un restablecimiento, es una buena idea indicar que la cuenta está bloqueada.

Por ejemplo, si va a cambiar su PW porque cree que su cuenta puede haber sido comprometida, que definitivamente no quieren que siga siendo accesible mientras usted realiza el proceso de cambio.

Además, la inclusión de la información "real" en el token de reposición podría ser decodificado si alguien realmente quiere y tiene la potencia.Sería más seguro generar una cadena aleatoria, guardarla en el archivo db en la fila para ese usuario y, a continuación, devolverla cuando se haga clic en el enlace.

Esto le da dos cosas:

1) No hay nada que descifrar, y por lo tanto nada de valor se puede obtener de ella. 2) La presencia del token en el registro del usuario indica que el restablecimiento está en progreso y que la cuenta debe tratarse como bloqueada.

0

Utilizaría un código hash para validar los detalles en la URL de restablecimiento de contraseña. Todo esto se puede hacer sin escribir nada en el DB o enviar información privilegiada a un atacante.

Para explicar brevemente sal y hashing de contraseña normal; digamos que la sal es 1111 y la contraseña es password, concatenaría los dos y trocearía la cadena 1111password, digamos que esto le da un hash de 9999, luego almacenaría el sal original 1111 y el hash 9999 en su registro de usuario.

Cuando está validando una contraseña, utiliza la sal almacenada, concatenar el intento de contraseña, hash it y compararla con el hash almacenado. Por ejemplo, asecret se convierte en 1111asecret pero hash en 8888. Esto no coincide con el hash original, por lo que la coincidencia de contraseña falla.

Por supuesto, la sal y el hash normalmente se generarán correctamente y se calcularán con las bibliotecas de cifrado establecidas (¡no invente la suya propia!).

Para la URL de restablecimiento de contraseña, pondría el identificador único para el usuario, es decir, la dirección de correo electrónico, la fecha en que se realiza la solicitud y un nuevo hash. Este hash se generaría a partir de los detalles concatenados más la sal y el hash ya almacenados para el usuario.

Por ejemplo:

Email: [email protected] 
Request Date: 2014-07-17 
Salt: 1111 
Hash: 9999 

generar una nueva almohadilla de los concatenado, es decir '[email protected]', dicen que esto da un hash de 7777.

La URL entonces generar tendría entonces el correo electrónico, fecha de solicitud y la nueva almohadilla:

https:\\www.example.com\[email protected]&requestdate=2014-07-17&hash=7777 

El servidor combinará el correo electrónico y la fecha suministrada con su sal y hash y confirmar el hash que genera es lo mismo que el suministrado. Si esto está bien, entonces mostrará el formulario de reinicio con los mismos tres parámetros ocultos detrás, de lo contrario un error. Éstos se vuelven a enviar y se vuelven a comprobar cuando se ingresa la nueva contraseña para evitar que se falsifique el formulario.

La dirección de correo electrónico se debe enviar para realizar la solicitud y solo se envía por correo electrónico a la misma dirección. la fecha no es información privilegiada y el hash no es reversible, por lo que no ofrece nada. No se ha escrito nada en la base de datos y cualquier alteración de los parámetros hace que el hash falle y la URL informe un error.

+1

Hay un problema con este enfoque. Un hash seguro hace que la ficha sea realmente larga. O integras la sal en el hash (hace que sea más o menos 20 caracteres) o almacenas esta sal única en la base de datos. Si almacena la sal en la base de datos, también podría almacenar un token aleatorio que no se deriva de ningún dato existente. – martinstoeckli

+0

@martinstoeckli Como ya has hashing una sal en la cadena concatenada no hay necesidad de agregar otra. El OP sí solicitó que no se almacenara en el DB. Aunque tiene razón, la url es larga y un hash apropiado lo hará más largo, pero esperaría que se haga clic en el enlace, o se copie y pegue, así que no creo que sea un problema. –

+0

Lo que quiero decir es que la sal debe estar contenida en forma legible en el enlace; de ​​lo contrario, es una clave, no una sal. Una sal es única por token, y debe almacenarse en la base de datos o puede extraerla de la url. – martinstoeckli

Cuestiones relacionadas