Вопрос

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

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

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

мне нужно конвертировать byteHashedPassword к строке.

Это было полезно?

Решение

   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 любит ставить тире между байтами, поэтому замена просто удаляет их.

Обновлять:Если вы предпочитаете шестнадцатеричный код в нижнем регистре, просто выполните .ToLower() и бум.

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

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

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

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 под названием КриптоStringify позволяет конвертировать строку в хешированную строку, используя приятный и понятный синтаксис, без необходимости экспериментировать с байтовыми массивами:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top