Хешування з алгоритмом SHA1 в C #

I want to hash given byte[] array with using SHA1 Algorithm with the use of SHA1Managed.
The byte[] hash will come from unit test.
Expected hash is 0d71ee4472658cd5874c5578410a9d8611fc9aef (case sensitive).

Як це можна досягти?

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {

    }
}
51
Ваш вишуканий хеш - це шістнадцяткове значення, тому не має значення, якщо він чутливий до регістру, наприклад. hex (e) == hex (E)
додано Автор jAC, джерело

6 Відповіді

Для тих, хто бажає "стандартного" форматування тексту хеша, ви можете використовувати щось на зразок наступного:

static string Hash(string input)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
        var sb = new StringBuilder(hash.Length * 2);

        foreach (byte b in hash)
        {
           //can be "x2" if you want lowercase
            sb.Append(b.ToString("X2"));
        }

        return sb.ToString();
    }
}

Це дасть хеш, як 0C2E99D0949684278C30B9369B82638E1CEAD415 .

Або для коду гольф версії:

static string Hash(string input)
{
    var hash = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(input));
    return string.Join("", hash.Select(b => b.ToString("x2")).ToArray());
}
108
додано
@ sky-dev, я зазвичай погоджуюсь з командою IDisposable , але швидка подорож до джерело довідки показує, що в .Dispose() не відбувається нічого цікавого
додано Автор Mitch, джерело
@невхвальне використання, ха-ха, дякую Я не був впевнений, що метою документації було ... (Код в моїх виробничих додатках є одним згори, але обставини другої змушують мене досить комфортно, що він буде однаково підтриманий у всіх, крім самих жорстких циклів . IDisposable є напівфайлівним при роботі з класами, що не стосуються сторони.)
додано Автор Mitch, джерело
Мені помиляється, що це рішення не позбавляє об'єкт SHA1Managed, оскільки воно позначено як "Oneposable". Цей пост може бути зручним під час оптимізації: stackoverflow.com/a/624379/991863
додано Автор sky-dev, джерело
Так, я також подивився на реалізацію Dispose. Це просто прискорить GarbageCollection. Це, мабуть, не велика справа в грандіозній схемі речей.
додано Автор sky-dev, джерело
@Mitch Якщо він реалізує інтерфейс IDisposable, то те, що відбувається в джерелі посилання, не має значення. Чи повинні вони коли-небудь змінювати його з будь-якої причини, так що виклик .Dispose() стає важливим, тому що ваш раніше працюючий код викликає проблему. Спираючись на погляди на рамки для визначення того, що ви можете піти, це шлях до кошмарного кошмару. Я настійно рекомендую дотримуватися документації та правильно поводитися з одноразовими об'єктами, це вбереже вам біль у довгостроковій перспективі.
додано Автор unenthusiasticuser, джерело
public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(temp);
        return Convert.ToBase64String(hash);
    }
}

РЕДАГУВАТИ:

Ви також можете вказати кодування при перетворенні масиву байтів на рядок наступним чином:

return System.Text.Encoding.UTF8.GetString(hash);

або

return System.Text.Encoding.Unicode.GetString(hash);
28
додано
Якщо вони хочуть шістнадцятковий рядок, то Base64 - це, мабуть, неправильний вибір.
додано Автор Joey, джерело
@ Джей: На відміну від відповіді, наданої GrantThomas, учасник зазначив, що їм потрібно повернути рядок
додано Автор John Gathogo, джерело
@MerveKaya: Можливо, ви повинні пояснити, що ви маєте на увазі під "не працював". Що таке вхідний масив байтів? Як ви визначили "SHA1Managed" - обмін вхідним масивом байтів повинен надати вам 0d71ee4472658cd5874c5578410a9d8611fc9aef як вихідний файл?
додано Автор John Gathogo, джерело
@MerveKaya: перегляньте моє оновлення про те, як використовувати Encoding при перетворенні хешу в рядок
додано Автор John Gathogo, джерело
Я написав ці коди раніше, але він не працював, я не знаю причини
додано Автор Merve Kaya, джерело
Так, я повинен повернути рядок, але Base64 не працює
додано Автор Merve Kaya, джерело
Байт [] хеш походить від одиничного тесту. У питанні вони написали, що очікуваний хеш - 0d71ee4472658cd5874c5578410a9d8611fc9aef. Воно походить від одиничного тесту
додано Автор Merve Kaya, джерело
Ні, на жаль, це знову не вдалося
додано Автор Merve Kaya, джерело

Це я і пішов. Для тих з вас, хто хоче оптимізувати, перегляньте https://stackoverflow.com/a/624379/991863 .

    public static string Hash(string stringToHash)
    {
        using (var sha1 = new SHA1Managed())
        {
            return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(stringToHash)));
        }
    }
9
додано
Мені довелося використовувати BitConverter.ToString (sha1.ComputeHash (байти)). Замінити ("-", ""), оскільки я не хотів, щоб дефекти, введені BitConverter. Після цього він працював як чарівність! Дякую!
додано Автор Sam, джерело

Ви можете "обчислити значення для зазначеного масиву байтів" за допомогою ComputeHash :

var hash = sha1.ComputeHash(temp);

Якщо ви хочете проаналізувати результат у рядковому представленні, то вам потрібно буде відформатувати байти за допомогою специфікатора формату {0: X2} .

5
додано

Найшвидший спосіб це:

    public static string GetHash(string input)
    {
        return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray());
    }

For Small character output use x2 in replace of of X2

4
додано
SHA1Managed реалізує IDisposable, тому ви, мабуть, захочете розпоряджатися ним, коли з ним зроблено, щоб звільнити ресурси.
додано Автор rickythefox, джерело

Я кину тобі шапку:

(як частину статичного класу, оскільки цей фрагмент має два розширення)

//hex encoding of the hash, in uppercase.
public static string Sha1Hash (this string str)
{
    byte[] data = UTF8Encoding.UTF8.GetBytes (str);
    data = data.Sha1Hash ();
    return BitConverter.ToString (data).Replace ("-", "");
}
// Do the actual hashing
public static byte[] Sha1Hash (this byte[] data)
{
    using (SHA1Managed sha1 = new SHA1Managed ()) {
    return sha1.ComputeHash (data);
}
3
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug