Konvertieren eines MD5-Hash-Byte-Arrays in eine Zeichenfolge

76

Wie kann ich das Hash-Ergebnis, bei dem es sich um ein Byte-Array handelt, in einen String konvertieren?

byte[] bytePassword = Encoding.UTF8.GetBytes(password);

using (MD5 md5 = MD5.Create())
{
    byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
} 

Ich muss byteHashedPasswordin einen String konvertieren .

Blankman
quelle

Antworten:

81
   public static string ToHex(this byte[] bytes, bool upperCase)
    {
        StringBuilder result = new StringBuilder(bytes.Length*2);

        for (int i = 0; i < bytes.Length; i++)
            result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));

        return result.ToString();
    }

Sie können es dann als Erweiterungsmethode aufrufen:

string hexString = byteArray.ToHex(false);
Philippe Leybaert
quelle
Welche Bedeutung hat das obere Gehäuse?
Blankman
3
eine Frage der Präferenz. Deshalb habe ich meiner Methode einen Parameter hinzugefügt, damit der Anrufer wählen kann
Philippe Leybaert
9
Sie müssen das Rad nicht neu erfinden, wenn Sie es bereits habenConvert.ToBase64String()
Eric Petroelje
5
Ein Base64-String ist kürzer. Es werden alle Buchstaben des Alphabets, Ziffern und einige Satzzeichen verwendet, daher ist es nicht hexadezimal. Base64 verwendet 4 Zeichen für 3 Bytes, während eine Hex-Zeichenfolge 6 Zeichen für 3 Bytes verwendet.
Philippe Leybaert
4
@ Eric: Es gibt Situationen, in denen Base64 aufgrund der zusätzlichen Interpunktionszeichen, die verwendet werden (z. B. Übergabe in einer URL), keine gute Wahl ist
Philippe Leybaert
65

Ich fand das immer am bequemsten:

string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");

Aus irgendeinem Grund setzt BitConverter gerne Bindestriche zwischen Bytes, sodass das Ersetzen diese nur entfernt.

Update: Wenn Sie "Kleinbuchstaben" bevorzugen, führen Sie einfach ein .ToLower () und einen Boom aus.

Beachten Sie, dass dies teuer sein kann, wenn Sie dies als enge Schleife und viele Operationen ausführen, da mindestens zwei implizite Zeichenfolgen und Größenänderungen vorgenommen werden.

GrayWizardx
quelle
macht das gleiche wie die @ PhilippeLeybaert-Lösung, jedoch in einer Zeile.
Sonjz
28

Sie können Byte-Arrays verwenden Convert.ToBase64Stringund Convert.FromBase64Stringeinfach in Zeichenfolgen konvertieren.

David
quelle
18

Wenn Sie sich im Lager "Hex Preference" befinden, können Sie dies tun. Dies ist im Grunde eine minimale Version der Antwort von Philippe Leybaert.

string.Concat(hash.Select(x => x.ToString("X2")))

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

Simon_Weaver
quelle
9

Da es sich um einen Hash handelt, enthält er möglicherweise Werte, die in einer normalen Zeichenfolge nicht angezeigt werden können. Daher ist es am besten, ihn in eine Base64-codierte Zeichenfolge zu konvertieren.

string s = Convert.ToBase64String(bytes);

und verwenden

byte[] bytes = Convert.FromBase64(s);

um die Bytes zurückzubekommen.

AxelEckenberger
quelle
4

Nun, Sie könnten den String-Konstruktor verwenden, der Bytes und eine Codierung benötigt, aber Sie werden wahrscheinlich Schwierigkeiten haben, einen String daraus zu verwalten, da er viele lustige Zeichen enthalten könnte (Null-Bytes, Zeilenumbrüche, Steuerzeichen usw.).

Der beste Weg, dies zu tun, wäre, es mit Base 64 zu codieren, um eine schöne Zeichenfolge zu erhalten, mit der man leicht arbeiten kann:

string s = Convert.ToBase64String(bytes);

Und um von dieser Zeichenfolge zurück zu einem Byte-Array zu gelangen:

byte[] bytes = Convert.FromBase64String(s);
Eric Petroelje
quelle
0

Für alle Interessierten können Sie mit einem von mir erstellten Nuget-Paket namens CryptoStringify eine Zeichenfolge mithilfe einer sauberen Syntax in eine Hash-Zeichenfolge konvertieren, ohne mit Byte-Arrays herumspielen zu müssen:

using (MD5 md5 = MD5.Create())
{
    string strHashedPassword = md5.Hash(password);
}

Es ist eine Erweiterungsmethode HashAlgorithmund KeyedHashAlgorithmfunktioniert daher auch mit SHA1, HMACSHA1, SHA256 usw.

https://www.nuget.org/packages/cryptostringify

garryp
quelle