2010-11-17 18 views
5

Sto tentando di replicare il comportamento Convert.ToBase64String() in Ruby.C# a Ruby sha1 codifica base64

Ecco il mio codice C#:

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

Quando provo la stessa cosa in Ruby, ottengo una stringa base64 diverso per lo stesso hash SHA1:

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

ho verificato nel debugger che l'array di byte C# passwordBytes corrisponde al valore sha1 nell'esempio Ruby. C'è un modo speciale in cui ho bisogno di usare Base64 in Ruby per ottenere la stessa stringa prodotta dal codice C#?

risposta

6

Sei Base64 codifica la stringa "5baa61...", non "\x5b\xaa\x61..."

Change hexdigest-digest:

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

vostro C# e codice Ruby stanno facendo le cose un po 'diverse. Nel tuo codice C#, passwordHash è un byte [20]. Nel tuo codice Ruby, sha1 contiene una stringa di 40 caratteri. Quindi sei Base64 che codifica due cose diverse. Da qui i diversi risultati.

Problemi correlati