Всем привет! Сегодня рассмотрим пример, хеширования разными алгоритмами с добавлением так называемой salt соли. Salt это всего лишь несколько бит информации прибавленной к вашему паролю к примеру. Как это выглядит допустим у вас пароль 12345+qwe. Где qwe и есть соль, но все это проходит обертку хеш алгоритмом, и приобретает не читабельный вид. Однако имеются приложения позволяющие подбирать по БД схожие хеши. Как раз в этом случаи добавления соли к вашему паролю, усилит криптографический эффект, что затруднит подбор.
А теперь рассмотрим сам пример приложения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
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