2010-11-17 19 views
5

Estoy intentando replicar el comportamiento Convert.ToBase64String() en Ruby.C# a Ruby sha1 base64 codificar

Aquí está mi código C#:

var sha1 = new SHA1CryptoServiceProvider(); 
var passwordBytes = Encoding.UTF8.GetBytes("password"); 
var passwordHash = sha1.ComputeHash(passwordBytes); 
return Convert.ToBase64String(passwordHash); // returns "W6ph5Mm5Pz8GgiULbPgzG37mj9g=" 

Cuando intento lo mismo en Ruby, consigo una cadena base64 diferente para el mismo hash SHA1:

require 'digest/sha1' 
require 'base64' 
sha1 = Digest::SHA1.hexdigest('password') 
# sha1 = 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 
base64 = Base64.strict_encode64(sha1) 
# base64 = "NWJhYTYxZTRjOWI5M2YzZjA2ODIyNTBiNmNmODMzMWI3ZWU2OGZkOA==" 

verifiqué en el depurador que la matriz de bytes C# passwordBytes coincide con el valor sha1 en el ejemplo de Ruby. ¿Hay alguna manera especial en que necesito usar Base64 en Ruby para obtener la misma cadena que produce el código C#?

Respuesta

6

Eres base 64 que codifica la cadena "5baa61...", no "\x5b\xaa\x61..."

Cambio hexdigest-digest:

sha1 = Digest::SHA1.digest('password') 
base64 = Base64.strict_encode64(sha1) 
2

Su C# y el código Ruby están haciendo las cosas un poco diferentes. En su código C#, passwordHash es un byte [20]. En tu código de Ruby, sha1 contiene una cadena de 40 caracteres. Entonces eres Base64 codificando dos cosas diferentes. De ahí los diferentes resultados.