Me pregunto si el Hasher de contraseñas que se implementa por defecto en el UserManager que viene con MVC 5 y ASP.NET Identity Framework, ¿es lo suficientemente seguro? Y si es así, ¿podría explicarme cómo funciona?
La interfaz IPasswordHasher se ve así:
public interface IPasswordHasher
{
string HashPassword(string password);
PasswordVerificationResult VerifyHashedPassword(string hashedPassword,
string providedPassword);
}
Como puede ver, no se necesita nada, pero se menciona en este hilo: " Asp.net Identity hashing hash " que de hecho lo hace sal detrás de escena. Entonces, me pregunto cómo hace esto. ¿Y de dónde viene esta sal?
Mi preocupación es que la sal es estática, lo que la hace bastante insegura.
securiry.stackexchange.com
. Y gracias por el consejo!Respuestas:
Así es como funciona la implementación predeterminada ( ASP.NET Framework o ASP.NET Core ). Utiliza una función de derivación clave con sal aleatoria para producir el hash. La sal se incluye como parte de la salida del KDF. Por lo tanto, cada vez que "hash" la misma contraseña obtendrá hashes diferentes. Para verificar el hash, la salida se divide de nuevo en la sal y el resto, y el KDF se ejecuta nuevamente en la contraseña con la sal especificada. Si el resultado coincide con el resto de la salida inicial, se verifica el hash.
Hashing:
Verificando:
fuente
HashPassword
función, ¿devuelve ambos en la misma cadena? Y cuando lo verifica, lo divide nuevamente y vuelve a cifrar la contraseña de texto sin cifrar entrante, con la sal de la división, y la compara con el hash original.var hashedPassword = HashPassword(password); var result = VerifyHashedPassword(hashedPassword, password);
: es lo que debe hacer. después de esoresult
contiene cierto.Debido a que actualmente ASP.NET es de código abierto, puede encontrarlo en GitHub: AspNet.Identity 3.0 y AspNet.Identity 2.0 .
De los comentarios:
fuente
Entiendo la respuesta aceptada, y la he votado pero pensé en dejar aquí la respuesta de mis laicos ...
Crear un hash
Comprobación de una contraseña contra un hash
Para verificar una contraseña que ingresa un usuario.
El hachís
Debajo de las cubiertas, el hash se genera utilizando la función de hash SHA1 ( https://en.wikipedia.org/wiki/SHA-1 ). Esta función se llama iterativamente 1000 veces (en la implementación de identidad predeterminada)
¿Por qué es esto seguro?
fuente
Para aquellos como yo que son nuevos en esto, aquí hay un código con const y una forma real de comparar los bytes [] '. Obtuve todo este código de stackoverflow pero definí consts para poder cambiar los valores y también
En su ApplicationUserManager personalizado, configura la propiedad PasswordHasher con el nombre de la clase que contiene el código anterior.
fuente
_passwordHashBytes = bytes.GetBytes(SaltByteSize);
supongo que querías decir esto_passwordHashBytes = bytes.GetBytes(HashByteSize);
... No importa en tu escenario ya que ambos son del mismo tamaño pero en general ...