Me gustaría almacenar el hash de una contraseña en el teléfono, pero no estoy seguro de cómo hacerlo. Parece que solo puedo encontrar métodos de cifrado. ¿Cómo se debe codificar correctamente la contraseña?
117
ACTUALIZACIÓN : ESTA RESPUESTA ES MUY ANTIGUA . En su lugar, utilice las recomendaciones de https://stackoverflow.com/a/10402129/251311 .
Puedes usar
var md5 = new MD5CryptoServiceProvider();
var md5data = md5.ComputeHash(data);
o
var sha1 = new SHA1CryptoServiceProvider();
var sha1data = sha1.ComputeHash(data);
Para obtener una data
matriz de bytes, puede usar
var data = Encoding.ASCII.GetBytes(password);
y recuperar cuerda de md5data
osha1data
var hashedPassword = ASCIIEncoding.GetString(md5data);
using
declaración o invocarloClear()
cuando haya terminado de usar la implementación.md5
es lo suficientemente bueno para casi todo tipo de tareas. Sus vulnerabilidades también se refieren a situaciones muy específicas y casi requieren que el atacante sepa mucho sobre criptografía.La mayoría de las otras respuestas aquí están algo desactualizadas con las mejores prácticas actuales. Como tal, aquí está la aplicación de usar PBKDF2 /
Rfc2898DeriveBytes
para almacenar y verificar contraseñas. El siguiente código está en una clase independiente en esta publicación: Otro ejemplo de cómo almacenar un hash de contraseña con sal . Los conceptos básicos son realmente fáciles, así que aquí se desglosa:PASO 1 Cree el valor de sal con un PRNG criptográfico:
PASO 2 Cree el Rfc2898DeriveBytes y obtenga el valor hash:
PASO 3 Combine los bytes de sal y contraseña para su uso posterior:
PASO 4 Convierta la sal y el hachís combinados en una cuerda para almacenar
PASO 5 Verifique la contraseña ingresada por el usuario con una contraseña almacenada
Nota: Dependiendo de los requisitos de rendimiento de su aplicación específica, el valor
100000
se puede reducir. Debe haber un valor mínimo10000
.fuente
Basado en la gran respuesta de csharptest.net , he escrito una clase para esto:
Uso:
Un hash de muestra podría ser este:
Como puede ver, también he incluido las iteraciones en el hash para facilitar su uso y la posibilidad de actualizarlo, si es necesario actualizarlo.
Si está interesado en .net core, también tengo una versión .net core en Code Review .
fuente
V1
, yV2
el método que necesita verificación.Utilizo un hash y un salt para el cifrado de mi contraseña (es el mismo hash que usa Asp.Net Membership):
fuente
fuente
Las respuestas de @ csharptest.net y Christian Gollhardt son geniales, muchas gracias. Pero después de ejecutar este código en producción con millones de registros, descubrí que hay una pérdida de memoria. Las clases RNGCryptoServiceProvider y Rfc2898DeriveBytes se derivan de IDisposable pero no las desechamos. Escribiré mi solución como respuesta si alguien necesita una versión eliminada.
Uso:
fuente
Creo que usar KeyDerivation.Pbkdf2 es mejor que Rfc2898DeriveBytes.
Ejemplo y explicación: hash de contraseñas en ASP.NET Core
Este es un código de muestra del artículo. Y es un nivel mínimo de seguridad. Para aumentarlo, usaría en lugar del parámetro KeyDerivationPrf.HMACSHA1
KeyDerivationPrf.HMACSHA256 o KeyDerivationPrf.HMACSHA512.
No comprometa el hash de contraseñas. Hay muchos métodos matemáticamente sólidos para optimizar la piratería de hash de contraseñas. Las consecuencias pueden ser desastrosas. Una vez que un malhechor pueda tener en sus manos la tabla hash de contraseñas de sus usuarios, sería relativamente fácil para él descifrar las contraseñas dado que el algoritmo es débil o la implementación es incorrecta. Tiene mucho tiempo (tiempo x potencia de la computadora) para descifrar contraseñas. El hash de la contraseña debe ser criptográficamente fuerte para convertir "mucho tiempo" en "una cantidad de tiempo irrazonable ".
Un punto más para agregar
La verificación de hash lleva tiempo (y es buena). Cuando el usuario ingresa un nombre de usuario incorrecto, no se necesita tiempo para verificar que el nombre de usuario sea incorrecto. Cuando el nombre de usuario es correcto, comenzamos la verificación de la contraseña; es un proceso relativamente largo.
Para un hacker, sería muy fácil de entender si el usuario existe o no.
Asegúrese de no devolver una respuesta inmediata cuando el nombre de usuario sea incorrecto.
No hace falta decirlo: nunca dé una respuesta sobre lo que está mal. Solo general "Las credenciales son incorrectas".
fuente