Преобразование массива хэш-байтов md5 в строку


Как я могу преобразовать хэшированный результат, который является массивом байтов, в строку?

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

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

мне нужно, чтобы преобразовать byteHashedPassword в строку.

7 63

7 ответов:

   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();
    }

затем вы можете вызвать его как метод расширения:

string hexString = byteArray.ToHex(false);

Я всегда находил это наиболее удобным:

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

по какой-то странной причине BitConverter любит ставить тире между байтами, поэтому замена просто удаляет их.

обновление: Если вы предпочитаете "маленький" "сглаз", просто делать .Нижестоящим() и бум.

обратите внимание, что если вы делаете это как жесткий цикл и много операций, это может быть дорого, так как есть по крайней мере два неявных приведения строк и изменения размера.

можно использовать Convert.ToBase64String и Convert.FromBase64String для простого преобразования байтовых массивов в строки.

Если вы находитесь в лагере "Hex preference", вы можете это сделать. Это в основном минимальная версия ответа Филиппа Лейберта.

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

Ну, так как это хэш, он имеет, возможно, значения, которые не могут быть показаны в обычной строке, поэтому лучше всего преобразовать его в строку с кодировкой Base64.

string s = Convert.ToBase64String(bytes);

и использовать

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

чтобы вернуть байты.

Ну, вы можете использовать строковый конструктор, который принимает байты и кодировку, но вы, вероятно, получите трудную для управления строку из этого, так как она может содержать много забавных символов (нулевые байты, новые строки, управляющие символы и т. д.)

лучший способ сделать это-закодировать его с помощью базы 64, чтобы получить хорошую строку, с которой легко работать:

string s = Convert.ToBase64String(bytes);

и чтобы перейти от этой строки обратно к массиву байтов:

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

для тех, кто заинтересован в NuGet-пакет, который я создал под названием CryptoStringify позволяет конвертировать строку в хэшированную строку с помощью хорошего чистого синтаксиса, без необходимости играть с массивами байтов:

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

Это метод расширения на HashAlgorithm и KeyedHashAlgorithm так работает на SHA1 и HMACSHA1, SHA256 и т. д. тоже.

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