2010-11-17 10 views
5

Próbuję replikować zachowanie Convert.ToBase64String() w Ruby.C# do Ruby sha1 base64 kodowanie

Oto mój kod C#:

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

Gdy próbuję samo w Ruby, mam inny ciąg base64 dla tego samego SHA1:

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

ja zweryfikowany w debuggera że tablica bajtowa C# passwordBytes jest zgodna z wartością sha1 w przykładzie Ruby. Czy istnieje specjalny sposób, aby użyć Base64 w Ruby, aby uzyskać ten sam ciąg, który tworzy kod C#?

Odpowiedz

6

Jesteś base64 kodujące łańcuch "5baa61...", nie "\x5b\xaa\x61..."

Zmień hexdigest do digest:

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

Twój kod C# i Ruby robią nieco różne rzeczy. W twoim C# code, passwordHash jest bajtem [20]. W twoim kodzie Ruby, sha1 zawiera ciąg 40 znaków. Więc jesteś Base64 kodujący dwie różne rzeczy. Stąd różne wyniki.