¿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?
Respuesta
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.
¡Ú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
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
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);
}
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.
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
¿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 ... –
- 1. ¿Cómo implementar un enlace de recuperación de contraseña en ASP.NET?
- 2. Membresía de ASP.NET Restablecimiento de contraseña
- 3. ¿Cómo recibir una notificación cuando un usuario cambia la contraseña o solicita un restablecimiento de contraseña?
- 4. Restablecimiento de contraseña enviando contraseñas temporales por correo electrónico
- 5. generar token de restablecimiento de contraseña en node.js
- 6. restablecimiento de contraseña Django. No envío de correo
- 7. Restablecimiento de un setTimeout
- 8. Cómo crear un enlace de descarga
- 9. Django 1.0, usando el restablecimiento de contraseña predeterminado
- 10. Cómo crear un enlace a un directorio
- 11. Restablecimiento de contraseña por correo electrónico sin una tabla de base
- 12. Cómo crear un campo de entrada de contraseña usando Tkinter
- 13. Revise mi diseño: instalación de restablecimiento de contraseña para el sitio web
- 14. Cómo crear un enlace MonoTouch desde .framework
- 15. ¿Cómo crear un enlace simbólico con SCons?
- 16. ¿Cómo puedo crear una contraseña?
- 17. ¿Cómo crear un enlace cliqueable con GWT?
- 18. Crear un enlace al artículo de Sitecore
- 19. Cómo crear un campo de contraseña en xcode
- 20. Cómo crear el campo de entrada de contraseña en django
- 21. ¿Cómo crear una puerta de enlace SMS?
- 22. Cómo crear un enlace dentro de una celda usando EPPlus
- 23. ¿Cómo crear UIImageView con la imagen de un enlace?
- 24. Cómo crear un enlace directo a cualquier cuadro de fancybox
- 25. ¿Cómo crear un enlace que desencadena la descarga de archivos?
- 26. ¿Cómo crear un enlace descargable al archivo de texto?
- 27. Ayuda de PHP con restablecimiento de contraseña y caducidad del token
- 28. Restablecimiento de autoincremento en h2
- 29. Crear usuario de Active Directory con contraseña en C#
- 30. Crear una contraseña de root para PHPMyAdmin
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