2010-11-17 38 views
5

J'essaie de répliquer le comportement Convert.ToBase64String() dans Ruby.C# en Ruby codage sha1 base64

Voici mon code C#:

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

Lorsque je tente la même chose en Ruby, je reçois une chaîne base64 différent pour le même sha1:

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

J'ai vérifié dans le débogueur que le tableau d'octets C# passwordBytes correspond à la valeur sha1 dans l'exemple Ruby. Existe-t-il un moyen particulier d'utiliser Base64 dans Ruby pour obtenir la même chaîne que le code C#?

Répondre

6

Vous n'êtes base64 codant pour la chaîne "5baa61...", non "\x5b\xaa\x61..."

changement hexdigest-digest:

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

Votre C# et le code Ruby font des choses légèrement différentes. Dans votre code C#, passwordHash est un octet [20]. Dans votre code Ruby, sha1 contient une chaîne de 40 caractères. Donc, vous êtes encodage Base64 deux choses différentes. D'où les différents résultats.