Si la sal de una contraseña hash bcrypt se almacena por separado

1

Estoy reemplazando un sistema de almacenamiento de contraseñas. La implementación actual utiliza TripleDES con la clave almacenada en texto sin formato tanto en los binarios como en la configuración (en caso de que uno de ellos no esté disponible por algún motivo (DSTM)), la aplicación descifra el valor de la base de datos y lo compara con el Valor de texto sin formato enviado desde el cliente.

Estoy proponiendo reemplazar esto con BCrypt (en este caso, BCrypt.Net). Uso el siguiente código como ejemplo

int workFactor = ((DateTime.Now.Year - 2000) / 2) + 6;
string salt = BCrypt.Net.BCrypt.GenerateSalt(workFactor);
Console.WriteLine("Salt: " + salt);
string password = "some test password";
string passwordHash = BCrypt.Net.BCrypt.HashPassword(password, salt);
Console.WriteLine("PW: " + passwordHash);
Console.WriteLine("Verify: " + BCrypt.Net.BCrypt.Verify(password, passwordHash));

Una salida de esto puede ser

Salt: $2a$14$zhJH43uFxZU3FJ9FaFQusO
PW: $2a$14$zhJH43uFxZU3FJ9FaFQusOn7bJTsXZQgXpEGYFBIygd.8lGXIcc22
Verify: True

Noté que no había separador entre el valor de sal y el valor de la contraseña, cuando Verify devolvió true cuando no especifiqué un salt.

Si la sal se incluye en la salida de la contraseña con hash, ¿hay algún valor en el almacenamiento de $2a$14$zhJH43uFxZU3FJ9FaFQusO y $2a$14$zhJH43uFxZU3FJ9FaFQusOn7bJTsXZQgXpEGYFBIygd.8lGXIcc22 por separado?

Me imagino que probablemente querría generar un nuevo salt para el usuario la próxima vez que seleccione una contraseña de todos modos.

    
pregunta Zymus 14.04.2016 - 22:03
fuente

1 respuesta

2

No, como ha visto, la sal es parte del valor de hash resultante (los 22 caracteres después del factor de costo). La función BCrypt.Verify () extraerá la sal del hash almacenado, por lo que no tiene sentido almacenarlo por separado.

Puede llamar a la función con un solo parámetro, la biblioteca generará un valor de sal y el costo por sí mismo:

string passwordHash = BCrypt.HashPassword(password);
// or if you want to specify the cost factor
passwordHash = BCrypt.HashPassword(password, 12);
    
respondido por el martinstoeckli 14.04.2016 - 22:28
fuente

Lea otras preguntas en las etiquetas