C# — хэширование данных с использованием соли

Всем привет! Сегодня рассмотрим пример, хеширования разными алгоритмами с добавлением так называемой salt соли. Salt это всего лишь несколько бит информации прибавленной к вашему паролю к примеру. Как это выглядит допустим у вас пароль 12345+qwe. Где qwe и есть соль, но все это проходит обертку хеш алгоритмом, и приобретает не читабельный вид. Однако имеются приложения позволяющие подбирать по БД схожие хеши. Как раз в этом случаи добавления соли к вашему паролю, усилит криптографический эффект, что затруднит подбор.

А теперь рассмотрим сам пример приложения:

using System;
using System.Text;
using System.Security.Cryptography;

public class CsharpHashAlgorithm
{

    public static string ComputeHash(string plainText,
                                     string hashAlgorithm,
                                     byte[] saltBytes)
    {
        // Если соль не указана, генерируйте ее на лету.
        if (saltBytes == null)
        {
            // Определите минимальный и максимальный размеры соли.
            int minSaltSize = 4;
            int maxSaltSize = 8;

            // Создать случайное число для размера соли.
            Random random = new Random();
            int saltSize = random.Next(minSaltSize, maxSaltSize);

            // Выделите массив байтов, который будет содержать соль.
            saltBytes = new byte[saltSize];

            // Инициализируйте генератор случайных чисел.
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

            // Заполните соль криптографически сильными значениями байт.
            rng.GetNonZeroBytes(saltBytes);
        }

        // Преобразование обычного текста в массив байтов.
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        // Выделите массив, который будет содержать обычный текст и соль.
        byte[] plainTextWithSaltBytes =
                new byte[plainTextBytes.Length + saltBytes.Length];

        // Копирование байтов обычного текста в результирующий массив.
        for (int i = 0; i < plainTextBytes.Length; i++)
            plainTextWithSaltBytes[i] = plainTextBytes[i];

        // Добавление байтов соли к полученному массиву.
        for (int i = 0; i < saltBytes.Length; i++)
            plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i];


        HashAlgorithm hash;

        // Убедитесь, что указано имя алгоритма хэширования.
        if (hashAlgorithm == null)
            hashAlgorithm = "";

        // Инициализируйте соответствующий класс алгоритма хэширования.
        switch (hashAlgorithm.ToUpper())
        {
            case "SHA1":
                hash = new SHA1Managed();
                break;

            case "SHA256":
                hash = new SHA256Managed();
                break;

            case "SHA384":
                hash = new SHA384Managed();
                break;

            case "SHA512":
                hash = new SHA512Managed();
                break;

            default:
                hash = new MD5CryptoServiceProvider();
                break;
        }

        // Вычислите хэш-значение нашего обычного текста с добавлением соли.
        byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);

        // Создайте массив, который будет содержать хэш и исходные байты соли.
        byte[] hashWithSaltBytes = new byte[hashBytes.Length +
                                            saltBytes.Length];

        // Копирование хэш-байтов в результирующий массив.
        for (int i = 0; i < hashBytes.Length; i++)
            hashWithSaltBytes[i] = hashBytes[i];

        // Добавление байтов соли к результату.
        for (int i = 0; i < saltBytes.Length; i++)
            hashWithSaltBytes[hashBytes.Length + i] = saltBytes[i];

        // Преобразование результата в строку в кодировке base64.
        string hashValue = Convert.ToBase64String(hashWithSaltBytes);

        // Возвратите результат.
        return hashValue;
    }
    public class CsharpHashAlgo
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Введите строку для хеширования:");
            string plaintext = Console.ReadLine();

            string passwordHashMD5 =
                   CsharpHashAlgorithm.ComputeHash(plaintext, "MD5", null);
            string passwordHashSha1 =
                   CsharpHashAlgorithm.ComputeHash(plaintext, "SHA1", null);
            string passwordHashSha256 =
                   CsharpHashAlgorithm.ComputeHash(plaintext, "SHA256", null);
            string passwordHashSha384 =
                   CsharpHashAlgorithm.ComputeHash(plaintext, "SHA384", null);
            string passwordHashSha512 =
                   CsharpHashAlgorithm.ComputeHash(plaintext, "SHA512", null);

            Console.WriteLine("Исходная строка   : {0}", plaintext);
            Console.WriteLine("Значение хэш-функций :\r\n");
            Console.WriteLine("MD5   : {0}", passwordHashMD5);
            Console.WriteLine("SHA1  : {0}", passwordHashSha1);
            Console.WriteLine("SHA256: {0}", passwordHashSha256);
            Console.WriteLine("SHA384: {0}", passwordHashSha384);
            Console.WriteLine("SHA512: {0}", passwordHashSha512);
            Console.WriteLine("");
            Console.ReadKey();
        }
    }
}

 

Вывод:

Введите строку для хеширования:
qwerty
Исходная строка : qwerty
Значение хэш-функций :

MD5 : Cbxto3+oPdqtzY6KaRFzbWyAVcKT
SHA1 : c6Jg7TXKXgj7rkjuGXoufSxZ22l85Eefww==
SHA256: JRmDP4ZC86CIjo0zx1V7S5XMxy5h/QNaMKmIXYtSZjeujsSYXg==
SHA384: tZzBQRIA00tBNcmJnaUOc7CMGIn2CbPMK1vRALXf9S8ahPT3x2H2surIJ8l5Fb6G+vEdR7s=
SHA512: oe19A3Rm0Al4DEyZaTXAVDstWlpsKBnyBb2DCqMxRrbTJkx5aBsz1EMPeQWM24iolh2w0yypiuEDHcGVWPS/kRRLVY6o

Обновлено: 07.01.2020 — 09:10

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.