Рядок хешу в c #


90

У мене проблема при спробі отримати хеш-рядок c#.

Я вже спробував кілька веб-сайтів, але більшість із них використовують файли для отримання хешу. Інші, які призначені для рядків, занадто складні. Я знайшов приклади автентифікації Windows для Інтернету, наприклад:

FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")

Мені потрібно використовувати хеш, щоб зробити рядок, що містить ім’я файлу, більш безпечним. Як я можу це зробити?

Приклад:

string file  = "username";
string hash = ??????(username); 

Чи слід використовувати інший алгоритм хешування, а не "md5"?

Відповіді:


183
using System.Security.Cryptography;

public static byte[] GetHash(string inputString)
{
    using (HashAlgorithm algorithm = SHA256.Create())
        return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}

public static string GetHashString(string inputString)
{
    StringBuilder sb = new StringBuilder();
    foreach (byte b in GetHash(inputString))
        sb.Append(b.ToString("X2"));

    return sb.ToString();
}

додаткові нотатки

  • Оскільки MD5 та SHA1 є застарілими та небезпечними алгоритмами, це рішення використовує SHA256. Крім того, ви можете використовувати BCrypt або Scrypt, як зазначено в коментарях.
  • Крім того, розгляньте можливість « посолити » свої хеші та скористайтесь перевіреними криптографічними алгоритмами, як зазначено в коментарях.

46
НЕ ВИКОРИСТОВУЙТЕ MD5 АБО SHA1 , це застарілі та небезпечні алгоритми. Використовуйте SHA256 принаймні або навіть краще використовуйте BCrypt або Scrypt.
Мухаммед Рехан Саїд

1
Дивіться цей приклад використання Scrypt: stackoverflow.com/questions/20042977 / ...
Мухаммад Rehan Саїда

6
@Muh Його легко можна використовувати для контрольних сум, оскільки він набагато швидший, ніж SHA512. Але насправді зберігати паролі не рекомендується, що правильно.
LuckyLikey

5
Що це b.ToString("X2")означає?
Білал Фазлані


60

Найшвидший спосіб отримати хеш-рядок для зберігання паролів - це такий код:

    internal static string GetStringSha256Hash(string text)
    {
        if (String.IsNullOrEmpty(text))
            return String.Empty;

        using (var sha = new System.Security.Cryptography.SHA256Managed())
        {
            byte[] textData = System.Text.Encoding.UTF8.GetBytes(text);
            byte[] hash = sha.ComputeHash(textData);
            return BitConverter.ToString(hash).Replace("-", String.Empty);
        }
    }

Примітки:

  • якщо метод часто викликається, створення shaзмінної слід перетворити на поле класу;
  • вихід подається у вигляді кодованого шістнадцяткового рядка;

SHA1Managedклас не дуже дорогий. він витрачає близько 130 байт і ініціалізує їх до деякого статичного значення, але це все. тому в більшості випадків не повинно бути проблем із продуктивністю.
Earth Engine

1
Також SHA1Managedє IDisposableі, отже, вимагає обернути його використання в usingблок.
Earth Engine

Метою призначення Disposeє очищення внутрішнього буфера. Якщо цього не зробити, буде загроза нападу пам'яті.
Earth Engine

3
@MuhammadRehanSaeed, коли я сказав, що SHA1Managedце не дорого, я маю на увазі його створення - ні. Крім того, алгоритм хешування не обов'язково дорогий. Це має коштувати (надзвичайно) дорого, коли ви хочете знайти зіткнення.
Earth Engine

1
@King_Fisher - це неможливо! Хеш - це одностороння функція, інформація втрачається. Якщо вам потрібно розшифрувати, вам потрібно використовувати метод шифрування без хешування. До речі, шифрування паролів - погана практика.
andrew.fox

8

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

Просто використовуйте метод GetHashCode.

Подобається це:

string hash = username.GetHashCode();

1
Так, саме це те, що шукають. Але це код - велика помилка. Показати запис як int hash = "username" .GetHasCode ();
Edy Cu

3
Чому ви ввели ім’я користувача у подвійні лапки? Це отримає хеш слова `` ім'я користувача '' і тепер, що міститься у змінній імені користувача.
Кирило Гупта,

14
не зберігати значення з GetHashCode, це інше для 32x та 64x
Слава

12
Це поганий спосіб створення хешу пароля. За допомогою GetHashCode () ви не можете припустити, що одне і те ж число буде генеровано для іншого комп'ютера. Використовуйте хеш-метод
Sha1

2
Слід зазначити, що GetHashCodeце не криптографічно безпечний алгоритм хешування. Використовуйте SHA256 принаймні або навіть краще використовуйте BCrypt або Scrypt для безпечного алгоритму.
Мухаммед Рехан Саїд

5

Я думаю, що ви шукаєте не хешування, а шифрування. За допомогою хешування ви не зможете отримати вихідну назву файлу зі змінної "хеш". За допомогою шифрування ви можете, і це безпечно.

Докладніше про шифрування в .NET див. У розділі AES у ASP.NET із VB.NET .


так, я думаю, що це шифрування, але я просто хочу порівняти хеш результату. Після сторінки переспрямування.
Edy Cu

З чим потрібно порівняти хешоване ім’я файлу?
Пітер ван Гінкель,

1
//Secure & Encrypte Data
    public static string HashSHA1(string value)
    {
        var sha1 = SHA1.Create();
        var inputBytes = Encoding.ASCII.GetBytes(value);
        var hash = sha1.ComputeHash(inputBytes);
        var sb = new StringBuilder();
        for (var i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
    }

3
НЕ ВИКОРИСТОВУЙТЕ SHA1 за цим посиланням, SHA1 є застарілим та небезпечним алгоритмами. Використовуйте SHA256 принаймні або навіть краще використовуйте BCrypt або Scrypt.
Мухаммед Рехан Саїд

Дивіться цей приклад використання Scrypt: stackoverflow.com/questions/20042977 / ...
Мухаммад Rehan Саїда

1

Якщо продуктивність не є основною проблемою, ви також можете скористатися будь-яким із цих методів:
(Якщо ви хочете, щоб хеш-рядок був у верхньому регістрі, замініть "x2"на "X2".)

public static string SHA256ToString(string s) 
{
    using (var alg = SHA256.Create())
        return string.Join(null, alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Select(x => x.ToString("x2")));
}

або:

public static string SHA256ToString(string s)
{            
    using (var alg = SHA256.Create())
        return alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Aggregate(new StringBuilder(), (sb, x) => sb.Append(x.ToString("x2"))).ToString();
}

0

Найкоротший і найшвидший шлях. Тільки 1 рядок!

    public static string StringSha256Hash(string text) =>
        string.IsNullOrEmpty(text) ? string.Empty : BitConverter.ToString(new System.Security.Cryptography.SHA256Managed().ComputeHash(System.Text.Encoding.UTF8.GetBytes(text))).Replace("-", string.Empty);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.