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.