Estoy usando HMACSHA256 para generar el hash de la contraseña y almacenarlo. El objetivo aquí es simplemente autenticar a los usuarios, es decir, guardar sus contraseñas de hash y validar a los usuarios cuando sea necesario utilizando las contraseñas de hash
// salt is a guid we store seperately, its the id of the user
byte[] GetHash(byte[] password, byte[] salt)
{
byte[] saltAndPassword = salt.Concat(password).ToArray();
var hmac = HMACSHA256();
hmac.Key = password;
var hash = hmac.ComputeHash(saltAndPassword);
return hash;
}
observe que la clave es la contraseña y que el hash se genera en salt + contraseña
¿podemos tener la contraseña como la clave para hash la contraseña de salt +, eso será parte de la seguridad? Al usar HMACSHA256, ¿necesariamente tenemos que tener una administración de claves para poder usar claves separadas en lugar de contraseñas?
también, ¿las claves tienen que ser únicas en HMACSHA256?
Sé que la gente suele sugerir funciones lentas como - PBKDF2, Scrypt, etc.
¿pero es seguro usar HMACSHA256 también? ¿La gente realmente usa un hmac para hashear y almacenar contraseñas? ¿Cuál sería el enfoque recomendado para el hashing y el almacenamiento de contraseñas (si todo lo que tiene son contraseñas y sales únicas)?
disculpas por el desfile de preguntas :) gracias de antemano
Edit
No pude encontrar una manera de comentar ni la pregunta ni la respuesta (stackexchange requiere que tenga un representante de 50). Así que estoy publicando mi comentario aquí:
@CodesInChaos hola, gracias por tu respuesta.
HMAC (contraseña, salt + contraseña)
Esto es tonto pero inofensivo. 1) Utiliza un valor de longitud variable como clave. HMAC tiene algunas > propiedades extrañas al hacer eso. 2) ¿Por qué introducir el contraseña dos veces?
Hmm, ¿deberíamos hacer algo al respecto? ¿Para que sea un valor de longitud constante (cualquier recomendación)?
Pienso que el hash (sal + contraseña) siempre es mejor que el hash (contraseña) // ¿el único propósito de salar?
pero por lo que veo en su respuesta, HMACSHA256 hace algo similar con la clave que se suministra.
Si usa HMAC para las contraseñas de hash, yo usaría la contraseña como mensaje y la sal como clave > Esto coincide con HKDF-Extracto.
pero, en nuestro caso, la sal es el ID de usuario, están expuestos, ¿está bien usar la sal como clave que es fácil de conocer?