it-swarm.com.de

Konvertieren eines md5-Hash-Byte-Arrays in einen String

Wie kann ich das Hash-Ergebnis, das ein Byte-Array ist, in eine Zeichenfolge konvertieren?

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

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

Ich muss byteHashedPassword in einen String konvertieren. 

68
Blankman
   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);
74

Ich fand das immer am bequemsten:

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

Aus irgendeinem Grund möchte BitConverter Bindestriche zwischen den Bytes einfügen, so dass der Ersetzer sie einfach entfernt. 

Update: Wenn Sie "Kleinbuchstaben" bevorzugen, führen Sie einfach einen .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 Zeichenfolgenumwandlungen und Größenänderungen stattfinden.

62
GrayWizardx

Sie können Convert.ToBase64String und Convert.FromBase64String verwenden, um Byte-Arrays auf einfache Weise in Strings zu konvertieren.

23
David

Wenn Sie sich im Lager "Hex-Präferenz" 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

17
Simon_Weaver

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

string s = Convert.ToBase64String(bytes);

und verwenden 

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

um die Bytes zurück zu bekommen.

8
AxelEckenberger

Nun, Sie könnten den String-Konstruktor verwenden, der Bytes und eine Codierung verwendet, aber Sie werden wahrscheinlich einen schwer zu verwaltenden String daraus ziehen, da er viele lustige Zeichen enthalten kann (Null-Bytes, Zeilenumbrüche, Steuerzeichen usw.).

Der beste Weg, dies zu tun, wäre die Codierung mit der Basis 64, um eine Nice-Saite zu erhalten, mit der man leicht arbeiten kann:

string s = Convert.ToBase64String(bytes);

Und um von dieser Zeichenfolge zurück zu einem Bytearray zu gelangen:

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

Für alle, die an einem von mir erstellten Nuget-Paket namens CryptoStringify interessiert sind, können Sie eine Zeichenfolge mithilfe einer Nice-Clean-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 für HashAlgorithm und KeyedHashAlgorithm und funktioniert daher auch für SHA1, HMACSHA1, SHA256 usw.

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

0
garryp