Всем привет! Сегодня рассмотрим пример, хеширования разными алгоритмами с добавлением так называемой 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
