Tengo una gran base de datos de usuarios (~ 200,000) que estoy transfiriendo desde una aplicación ASP.NET a una aplicación Ruby on Rails. Realmente no quiero pedirle a cada usuario que restablezca su contraseña, así que estoy tratando de volver a implementar la función de hashing de contraseñas de C# en Ruby.Reimplement Membresía ASP.NET y hashing de contraseña de usuario en Ruby
La función de edad es la siguiente:
public string EncodePassword(string pass, string saltBase64)
{
byte[] bytes = Encoding.Unicode.GetBytes(pass);
byte[] src = Convert.FromBase64String(saltBase64);
byte[] dst = new byte[src.Length + bytes.Length];
Buffer.BlockCopy(src, 0, dst, 0, src.Length);
Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
byte[] inArray = algorithm.ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
Un ejemplo hash contraseña y la sal es (y la contraseña utilizada fue "contraseña"):
contraseña hash: "weEWx4rhyPtd3kec7usysxf7kpk =" sal: " 1ptFxHq7ALe7yXIQDdzQ9Q ==" contraseña: "contraseña"
Ahora, con el siguiente código de Ruby:
require "base64"
require "digest/sha1"
password = "password"
salt = "1ptFxHq7ALe7yXIQDdzQ9Q=="
concat = salt+password
sha1 = Digest::SHA1.digest(concat)
encoded = Base64.encode64(sha1)
puts encoded
No obtengo el hash de contraseña correcto (obtengo "+ BsdIOBN/Vh2U7qWG4e + O13h3iQ =" en lugar de "weEWx4rhyPtd3kec7usysxf7kpk ="). ¿Alguien puede ver cuál podría ser el problema?
Muchas gracias
Arfon
Estás saltarse un paso importante: la conversión de contraseña en bytes. –
OK, ¿así que parece que tendré que bajar al nivel de bytes para hacer esto entonces? – arfon
@ Adam - no estoy seguro. En .NET, los está poniendo en una matriz de bytes para transferirlos al algoritmo hash. Ruby puede hacer lo mismo con una cuerda simple. Si se almacenan como terminadas en nulo, es esencialmente lo mismo que el búfer en el ejemplo de .NET. Me gustaría darle vueltas y ver si funciona. – tvanfosson