2012-09-25 12 views
6

¿De qué manera sugeriría crear un seguro enlace de restablecimiento de contraseña en MVC y C#? Quiero decir, voy a crear un token aleatorio, ¿verdad? ¿Cómo lo codifico antes para enviarlo al usuario? ¿Es MD5 lo suficientemente bueno? ¿Conoces alguna otra forma segura?¿Cómo crear un enlace de restablecimiento de contraseña?

+0

mayoría de las bibliotecas criptográficas tienen herramientas para la generación de un número aleatorio criptográficamente. No necesita hash, codificar o encriptar nada. Solo necesitas un número aleatorio aleatorio que la clase 'Random' puede proporcionar. – Servy

Respuesta

2

No creo que necesite una cadena cifrada para este propósito. Creo que crear una cadena con Guid sería suficiente.

string thatString=Guid.NewGuid("n").ToString(); 

Guárdelo en su tabla de db contra esa cuenta de usuario en particular. Crea un enlace para el usuario que tiene esta cadena y envíalo. Cuando hacen clic en él, los llevará a un método de acción y obtendrán el registro de usuario correspondiente asociado con esta cadena de tiempo temporal que almacenamos y mostrarán el formulario para que el usuario actualice la contraseña.

Y si tiene alguna duda acerca de si las guías son únicas, realice la compra this.

+10

¡Único! = Aleatorio. [Los GUID no están diseñados para ser aleatorios.] (Http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx) No están diseñados para ser impredecibles. . Simplemente están diseñados para no repetir. – Servy

+0

Uso este enfoque también, el Guid.Si le molesta la singularidad, puede verificar si ya existe en la base de datos. También establecí un límite de tiempo en él (por lo que el enlace solo se puede hacer clic durante dos horas), lo que limita aún más la posibilidad de colisiones. – Michel

15

Use System.Security.Cryptography.RandomNumberGenerator que es un RNG criptográficamente seguro. Simplemente incluya eso en el correo electrónico y también guárdelo en su base de datos para recuperarlo más adelante. No veo el sentido de hacerlo.

Está documentado aquí: http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator.aspx

using System.Security.Cryptography; 

using(RandomNumberGenerator rng = new RandomNumberGenerator()) { 

    Byte[] bytes = new Byte[8]; 
    rng.GetBytes(bytes); 

    String sendThisInEmailAndStoreInDB = Convert.ToBase64String(bytes); 
} 
1

Mejor que el uso de un número aleatorio es a continuación sal hash. Aquí hay un fragmento de un gurú de la seguridad:

@using System.Security.Cryptography; 
static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt) 
{ 
HashAlgorithm algorithm = new SHA256Managed(); 

byte[] plainTextWithSaltBytes = 
    new byte[plainText.Length + salt.Length]; 

for (int i = 0; i < plainText.Length; i++) 
{ 
    plainTextWithSaltBytes[i] = plainText[i]; 
} 
for (int i = 0; i < salt.Length; i++) 
{ 
    plainTextWithSaltBytes[plainText.Length + i] = salt[i]; 
} 

return algorithm.ComputeHash(plainTextWithSaltBytes);    
} 

Se puede ver más en su respuesta aquí: https://stackoverflow.com/a/2138588/1026459

Básicamente, sólo crear una contraseña. Sal y hash aquí, y luego compararlo cuando el usuario regrese. La respuesta vinculada también contiene un método de comparación y una explicación más detallada de sal/hash.

1

En realidad, yo no haría ninguno de estos.

Me enfrenté al mismo problema y decidí enviar un token de reinicio y para hacerlo usé un token JWT.

En ese token (que está encriptado) puede establecer un vencimiento. Simplemente cree un token de reinicio que incluya la dirección de correo electrónico del Cliente como reclamo y luego configure su vencimiento, almacénelo en su base de datos (en su forma encriptada) y codifíquelo y colóquelo en el enlace como parámetro de URL.

Luego, cuando reciba la solicitud, puede verificar que el token sea válido. A continuación, puede descomprimirlo, consulte la dirección de correo electrónico y luego proceda a dirigirlos al área de restablecimiento de contraseña segura de su cuenta. (puede incluir otros reclamos como nombre de usuario, etc.).

Para obtener el JWT implemnetation puede escribir Install-Package JWT

+0

¿qué vas a hacer con la depuración de este token? es posible extraer toda la información en este tipo de token: correo electrónico, fecha de caducidad ... –

Cuestiones relacionadas