2010-01-13 7 views
3

Est-ce que quelqu'un sait comment reproduire cet algorithme C# dans Ruby?Calcul de MD5 d'une chaîne codée en UTF-8

HashAlgorithm algorithm = MD5.Create(); 
Encoding encoding = new UTF8Encoding(); 
var sb = new StringBuilder(); 
foreach (var element in algorithm.ComputeHash(encoding.GetBytes(password))) 
{ 
    sb.Append(element.ToString("X2")); 
} 
return sb.ToString(); 

Il calcule le hachage MD5 du mot de passe après la conversion en UTF-8. Le hachage est représenté sous la forme d'une séquence de 32 chiffres hexadécimaux, par exemple "E4D909C290D0FB1CA068FFADDF22CBD0".

Exemples:

    "übergeek""1049165D5C22F27B9545F6B3A0DB07E0"
    "Γεια σου""9B2C16CACFE1803F137374A7E96F083F"

Répondre

4

Peut-être que tout ce dont vous avez besoin est Digest :: MD5 qui produira des hexdigests de n'importe quelle chaîne que vous lui donnez. Alors que Ruby 1.8 est un peu subtile dans sa distinction entre les jeux de caractères ISO-Latin1 et UTF-8, Ruby 1.9 fournit beaucoup plus de contrôle ici, y compris la conversion. Si la chaîne est fournie en UTF8, cependant, Ruby 1.8 la laisse généralement seule, la traitant comme un simple flux d'octets.

require 'digest/md5' 

def encode_password(password) 
    Digest::MD5.hexdigest(password).upcase 
end 

# Example: 
puts encode_password('foo bar') 
# => "327B6F07435811239BC47E1544353273" 
+0

Le problème est que quand je l'ai essayé cela avant de poster ici je testais dans un fichier .rb que la sortie en commande quelque chose rapidement comme ceci: ▄9I║Y½╛VαW≥☼ê>. Puis j'ai utilisé <%= .. %> et la sortie est ok. –

+0

Il existe une différence entre Digest :: MD5.hexdigest et Digest :: MD5.digest, où le premier est une chaîne hexadécimale et le dernier est l'équivalent binaire brut. – tadman

1

vous aurez besoin quelque chose comme ça

require 'digest/md5' 
Digest::MD5.hexdigest(password.encode("UTF-8")) 
Questions connexes