Преобразование байтового массива md5 в строку - PullRequest
68 голосов
/ 12 марта 2010

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

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

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

Мне нужно преобразовать byteHashedPassword в строку.

Ответы [ 7 ]

74 голосов
/ 12 марта 2010
   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);
62 голосов
/ 12 марта 2010

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

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

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

Обновление: Если вы предпочитаете «строчный» гекс, просто выполните .ToLower () и boom.

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

23 голосов
/ 12 марта 2010

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

17 голосов
/ 22 декабря 2013

Если вы находитесь в лагере «Гекс предпочтения», вы можете сделать это. Это в основном минимальная версия ответа Филиппа Лейберта.

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

8 голосов
/ 12 марта 2010

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

string s = Convert.ToBase64String(bytes);

и используйте

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

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

3 голосов
/ 12 марта 2010

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

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

string s = Convert.ToBase64String(bytes);

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

byte[] bytes = Convert.FromBase64String(s);
0 голосов
/ 30 мая 2015

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

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

Это метод расширения для HashAlgorithm и KeyedHashAlgorithm, поэтому он работает и для SHA1, HMACSHA1, SHA256 и т. Д.

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

...