Estoy buscando implementar un Olvidó de la función de Contraseña en mi sitio web. Me gusta la opción en un correo electrónico que contiene un temporal de un tiempo de uso de la dirección URL que caduca después de algún tiempo se envía al usuario.

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

De restablecimiento de contraseña por correo electrónico contraseñas temporales

Gracias.

9 Comentarios

  1. -5

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

    (UserId)-(ExpireDate)
    

    Cifrar los datos, hacer que el enlace, luego descifrar los datos y tomar acción a partir de ahí…

    Crudo, pero lo más probable es utilizable, y que no requieren DB uso

    • Es una mala práctica para incluir los datos en token de recuperación de contraseña. Evento si está encriptado. Un hacker que conoce el algoritmo será capaz de restablecer la contraseña de cualquier usuario, incluso sin acceso al buzón de correo del usuario.
    • -1. La idea es buena en un sentido, pero NO debe ser utilizado debido a problema de seguridad que Slava explicado en el comentario anterior.
    • Un Hacker se necesita saber la clave para el algoritmo de cifrado así. Se puede asumir que si el hacker tiene acceso a la clave de cifrado, probablemente él también tiene acceso a la almacenada hash, así que sí, esta técnica todavía parece una buena idea.
    • El verdadero problema con esta técnica es que no puede impedir el uso múltiple de la misma token de recuperación.
    • Yo estaría de acuerdo, PERO ya es usuario de atado, que no es tan grande de un acuerdo. Si el usuario tenía la capacidad de almacenar en la base de datos o estaba dispuesta sería más fácil
    • También se podría hacer un hash de como UserId-Sal-yyyyMMddHH, lo utilizan en un enlace junto con un identificador. Serverside este hash se puede volver a crear (con el uso del identificador) con un formato de fecha de la hora actual en la hora anterior, si uno coincide con la certeza de que el hash es en la mayoría de ~2 horas de edad.
    • Nadvorny Eso es cierto.

  2. 65

    Probablemente la manera más fácil va a ser para modificar la tabla de usuarios para agregar 2 columnas adicionales, O si usted no desea modificar la tabla existente, se podría agregar una nueva tabla dependiente llamado «UserPasswordReset» o algo así. Las columnas son como este:

    PasswordResetToken UNIQUEIDENTIFIER,
    PasswordResetExpiration DATETIME
    

    Si usted va con el adicional de la tabla de ruta, usted puede también agregar el id de la columna, lo convierten en la clave principal y clave externa de referencia de nuevo a su tabla de usuarios. Una restricción UNIQUE también sería recomendable. Entonces sólo tiene que utilizar un Guid en su asp.net aplicación como el token.

    El flujo podría ser algo como esto:

    1. Usuario solicita para restablecer contraseña para su cuenta de
    2. Insertar un nuevo registro en la tabla (o la actualización de su registro de usuario) mediante el establecimiento de la PasswordResetExpiration a una fecha en el futuro (DateTime.Ahora.AddDays(1)), y establecer el token de Guid.NewGuid()
    3. Correo electrónico al usuario un enlace a su ResetPassword.página aspx con el guid de la cadena de consulta (http://www.yoursite.com/ResetPassword.aspx?token=Guid-here)
    4. Utilizar el ResetPassword.página aspx para validar el token y la caducidad de los campos. (I. E. asegúrese de DateTime.Ahora, < PasswordResetExpiration)
    5. Proporcionar un sencillo formulario que permite al usuario restablecer la contraseña.

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

    • Nota de seguridad : UNIQUEIDENTIFIER, no están diseñadas para proporcionar el azar y son inseguros en este escenario. Básicamente, usted desea un enlace de restablecimiento de la que es imposible de adivinar. Con el fin de hacer imposible adivinar su enlace de restablecimiento, es necesario incluir un número aleatorio generado por una criptográficamente segura generador de números aleatorios que un GUID es no. Así, además de sus 2 columnas que necesita de un tercero para almacenar ese número al azar que actuará como su contraseña y finalmente enviar el GUID y la contraseña en el enlace de restablecimiento de como parámetros.
  3. 2

    @Alex

    También puede utilizar el Sistema.De seguridad.La criptografía de clases .NET para los algoritmos hash. Por ejemplo:

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

    Aquí, el Sistema.Guid de clase en su amigo, ya que generará un único (bueno, el único suficiente) número de 128 bits:

    • Generar un nuevo Guid ( del Sistema.Guid.NewGuid() )
    • Tienda que Guid en algún lugar (objeto de la Aplicación, tal vez?)
    • Enviar una dirección URL personalizada en un correo electrónico con el Guid
    • Cuando el usuario visita el sitio, introduzca la contraseña se envía en el correo electrónico
    • Si las contraseñas coinciden, siga adelante y obligarlos a entrar en una nueva contraseña
    • +1 : Gracias por este tema de lado info 🙂
    • GUID se supone que para ser única, pero no se supone que el ser criptográficamente fuerte. Podría ser posible adivinar qué GUID será creado y por lo tanto crear un símbolo para una cuenta específica.
    • gracias por la info, realmente es posible ? ¿Puedes explicar un poco acerca de cómo se puede adivinar ? Yo estaba pensando en usar GUID.
    • Que probablemente requieren una pregunta aparte centrado en GUID. En resumen, GUID son normalmente generados basados en algunos adivinar entradas (dirección MAC, marcas de tiempo, …) y una parte aleatoria. La parte que es difícil adivinar es la parte aleatoria, que no es necesariamente grande, por lo que probablemente no es tan difícil de adivinar como para proporcionar seguridad. En muy breve : GUID están destinados a ser único, que no están destinados a ser difícil de adivinar.
    • Único != Azar. Guid puede ser predecible, y no debe ser utilizado cuando se necesita un token aleatorio.
  5. 1

    He utilizado un Hash de la Clase para crear los inicios de sesión automático compone de la fecha/hora actual y la de los usuarios la dirección de correo electrónico:

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

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

    Luego tomarla de la URL mediante:

    if (Request.QueryString["hash"] != null)
    {
                    //extract Hash from the URL
                    string strHash = Request.QueryString["hash"];
    }
    
    • ¿cómo llegar de nuevo a la dirección de correo electrónico & datetime de hash de nuevo, de modo que usted puede iniciar sesión automáticamente? Debido a que los valores hash son un camino a la derecha?. Por favor educar.
    • usted puede almacenar el valor de Hash en la base de datos así como el envío de un correo electrónico que contiene una dirección URL con el id de usuario y hash anexa. A continuación, en la página que la URL apunta a comparar los 2 contra la base de datos. Esa sería una solución básica, se necesita algo más robusto para algo que necesitan una mejor seguridad.
    • Lo siento, pero no veo la utilidad para el envío de información en el hash llave codificada, si el punto es para guardarlo junto a la misma información en la base de datos. Lo único que usted necesita es una clave única, no una versión cifrada de cualquier «real» de la información. El randow único identificador generado propuesto por Goyuix (ver su respuesta) es la mejor opción si usted tiene que tener algo que envían Y almacenan en la base de datos para ser capaz de encontrar de nuevo cuando el usuario haga clic en el enlace dentro del correo electrónico enviado.
    • Cómo validar el hash ?
  6. 1

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

    Por ejemplo, si vas a cambiar la pw porque crees que tu cuenta ha sido comprometida, usted definitivamente no quiere que siga siendo accesible, mientras que usted va sobre el proceso de cambio.

    También, la inclusión de los «real» de la información en el token de recuperación podría ser decodificado si alguien realmente quiere y tiene la potencia. Sería más seguro para generar una cadena aleatoria, guardarlo en la base de datos en la fila de ese usuario, y luego de nuevo a ella cuando hace clic en el enlace.

    Esto le da dos cosas:

    1) no Hay nada que descifrar, y por lo tanto nada de valor puede ser obtenido a partir de ella.
    2) La presencia del símbolo en el registro de usuario indica que restablecer está en el progreso y la cuenta debe ser tratada como bloqueada.

  7. 0

    El objetivo de enviar algunos datos|cadena de correo electrónico del usuario es la validación del dueño de la cuenta. Por favor la atención sobre algunos puntos:

    • Evitar el envío de información importante en el restablecimiento o activar el enlace.
    • Es la mejor manera de almacén de cadena única de datos junto con el usuario
      cuenta y enviar como enlace. pero ser consciente de si enviar un solo
      sección de enlace de correo electrónico del usuario y acabo de comprobar en la página, su
      la aplicación puede ser peligrosa por fuerza bruta o diccionario
      atacante. Es suficiente para revisar una lista de cadenas para encontrar algunos enlaces
      y cambiar la contraseña. Sé que tiene un poco de oportunidad, pero no cero.

    Resultado:
    Creo que es mejor si usted

    1. combinar de correo electrónico del usuario con la cadena de enlace, a continuación, cifrarlos
      (no hash porque hash valor no puede ser inversa) y enviar al usuario
      correo electrónico.
    2. De usuario y haga clic en su página de obtener el valor cifrado.
    3. descifrar valor.
    4. extracto de correo electrónico del usuario.
    5. encontrar el correo electrónico de base de datos.
    6. comparar la cadena de recibido enlace con otros adjunto a usuario
      de correo electrónico en la base de datos.

    Buena suerte.

  8. 0

    Que haría uso de un código hash para validar los detalles en el restablecimiento de la contraseña de url. Todo esto se puede hacer sin necesidad de escribir nada a la base de datos o el envío de cualquier información privilegiada a un attaker.

    A explicar brevemente contraseña normal de sal y de hash; dicen que la sal es 1111 y el pasword es password, tendría que concatenar los dos y el hash de la cadena de 1111password, decir esto le da un hash de 9999, así que tendrías original de la tienda de la sal 1111 y hash 9999 en su registro de usuario.

    Cuando usted hace una contraseña que utilice la sal almacenada, concatenar el intento de contraseña, hash y comparar con el hash almacenado. Por ejemplo asecret se convierte en 1111asecret pero hash para 8888. Esto no coincide con el hash original por lo que la contraseña no coinciden.

    Por supuesto, la sal y el hash normalmente serían adecuadamente genera y se calcula con lo establecido por las bibliotecas de criptografía (no inventar su propio!).

    Para restablecer la contraseña de la URL que me gustaría poner en el identificador único para el usuario, es decir, la dirección de correo electrónico, la fecha de la solicitud, y un nuevo hash. Este hash se genera a partir de esos detalles, concatenados además de la sal y el hash ya almacenada para el usuario.

    Por ejemplo:

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

    Generar un nuevo hash de los concatenada, es decir,'[email protected]', decir esto le da un hash de 7777.

    La URL de la me, a continuación, generar tendría el correo electrónico, la fecha de la demanda y el nuevo hash:

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

    El servidor se combinan el correo electrónico y suministra la fecha con la sal y el hash y confirmar el hash generado es el mismo que el que se suministra. Si esto es correcto, a continuación, se mostrará el formulario de restablecimiento con los mismos tres parámetros ocultos detrás de él, de lo contrario un error. Estos se vuelvan a presentar y revisar de nuevo cuando el nuevo se ha introducido una contraseña para evitar que la forma de ser falso.

    La dirección de correo electrónico debe ser suministrado para realizar la solicitud y sólo se envía en un correo a la misma dirección. la fecha es apenas privilegiada info y el hash no es reversible, así que no da nada de todos modos. Nada ha sido escrito a la base de datos y cualquier manipulación con los parámetros hace que el hash a fallar y la dirección URL para informar de un error.

    • Hay un problemas con este enfoque. Un seguro de hash hace que el token muy largo. Ya sea que integran la sal en el hash sí mismo (hace unos 20 charactes más), o que la tienda esta sal único en la base de datos. Si usted almacén de la sal en la base de datos, usted puede también almacenar un token aleatorio que no es derrived a partir de los datos existentes.
    • Como ya hash de la sal en la cadena concatenada no hay necesidad de agregar otro. El OP hizo la petición de que no era almacenado en la base de datos. Aunque tienes razón, la url es largo y de una adecuada hash va a hacer más, pero me gustaría esperar el enlace para hacer clic o copiar y pegar, así que creo que no es demasiado de un problema.
    • Lo que quiero decir es, que la sal debe estar contenida en una forma legible en el enlace, de lo contrario es un elemento fundamental, no una sal. Una sal es único por cada token, y este debe ser almacenado en la base de datos o se puede extraer desde la url.
    • cualquier código fuente completo para generar el hash y validar los hash ?
  9. 0

    Hay un problemas con este enfoque. Un seguro de hash hace que el token muy largo. Ya sea que integran la sal en el hash sí mismo (hace unos 20 charactes más), o que la tienda esta sal único en la base de datos. Si usted almacén de la sal en la base de datos, usted puede también almacenar un token aleatorio que no es derrived de cualquier

Dejar respuesta

Please enter your comment!
Please enter your name here