Перетворення масиву хеш-байтів md5 у рядок


76

Як я можу перетворити хешований результат, який є байтовим масивом, у рядок?

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

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

Мені потрібно перетворити byteHashedPasswordна рядок.

Відповіді:


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

Потім ви можете викликати це як метод розширення:

string hexString = byteArray.ToHex(false);

яке значення верхнього кожуха?
Blankman

3
питання переваги. Ось чому я додав параметр до свого методу, щоб той, хто телефонує, міг вибрати
Філіп Лейбаерт

9
Не потрібно винаходити колесо, коли у вас вже єConvert.ToBase64String()
Ерік Петроле

5
Рядок Base64 коротший. Він використовує всі літери алфавіту, цифри та кілька знаків пунктуації, тому він не шістнадцятковий. Base64 використовує 4 символи для 3 байтів, тоді як шістнадцятковий рядок використовує 6 символів для 3 байт.
Філіп Лейбаерт

4
@Eric: бувають ситуації, коли Base64 не є вдалим вибором через зайві розділові знаки, які використовуються (наприклад, передаючи їх у URL-адресу)
Філіп Лейбаерт,

65

Я завжди вважав, що це найзручніше:

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

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

Оновлення: Якщо ви віддаєте перевагу шістнадцятковому шрифтові, просто виконайте .ToLower () та бум.

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


робить те саме, що і рішення @PhilippeLeybaert, але в один рядок.
sonjz

28

Ви можете використовувати Convert.ToBase64Stringта Convert.FromBase64Stringлегко перетворити байтові масиви у рядки.


18

Якщо ви перебуваєте в таборі "Hex preference", ви можете це зробити. В основному це мінімальна версія відповіді Філіппа Лейбарта.

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF


9

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

string s = Convert.ToBase64String(bytes);

і використовувати

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

щоб повернути байти.


4

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

Найкращим способом зробити це було б кодування його з базою 64, щоб отримати гарний рядок, з яким легко працювати:

string s = Convert.ToBase64String(bytes);

І перейти від цього рядка до байтового масиву:

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

0

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

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

Це метод розширення на HashAlgorithmіKeyedHashAlgorithm так працює на SHA1, HMACSHA1, SHA256 і т.д. теж.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.