Все мы знакомы с таким понятием как регистрация на сайтах с последующим прохождением авторизации/аутентификации.
Действительно, как минимум, при регистрации в любой мало-мальски защищенной системе следует указывать логин и пароль.
Естественно, логин и пароль хранятся в базе данных, и не имеет значения, какого типа, хоть SQL-Server, хоть обычные текстовые файлы – без разницы.
Проблема заключается в том, что если к такой БД получат доступ сторонние особы, то все логины/пароли пользователей будут «как на ладоне».
В этом случае целесообразно шифровать пароли. То есть, при регистрации нового пользователя, в БД заносится предварительно зашифрованный пароль пользователя, так сказать в закрытом виде.
Шифровать можно по своему собственному алгоритму, например, после каждого символа в пароле дописывать некоторый предварительно сформированный набор символов, или последовательность символов пароля, записанных наоборот, или еще что-нибудь, что вы придумаете сами.
Но такой подход чреват тем, что все таки имеется возможность обнаружить ключ к расшифровыванию. Это способны достаточно быстро сделать специальные программы.
Поэтому, в таких случаях следует отдавать предпочтение хеш-представлению пароля.
Для такой задачи существует алгоритм MD5. По данному алгоритму, возвращается значение в виде 32-разрядной шестнадцатеричной строки. Одним словом, имея любой длины набор символов (строку) и применив к ней алгоритм шифрования MD5, мы получим строку в 32 символа, причем в 16-ричном представлении.
Собственно, сам метод прост:
using System.Security.Cryptography;
string GetHashString(string s)
{
//переводим строку в байт-массим
byte[] bytes = Encoding.Unicode.GetBytes(s);
//создаем объект для получения средст шифрования
MD5CryptoServiceProvider CSP =
new MD5CryptoServiceProvider();
//вычисляем хеш-представление в байтах
byte[] byteHash = CSP.ComputeHash(bytes);
string hash = string.Empty;
//формируем одну цельную строку из массива
foreach (byte b in byteHash)
hash += string.Format("{0:x2}", b);
return hash;
}
Данный метод конвертирует простой символ «1» в значение «06d49632c9dc9bcb62aeaef99612ba6b», а «myparol» в «1306b1dbf201d74b03a144ab22e6d203»
Конечно, можно оставить в таком виде, но заносить в БД пароль в стринговом представлении не стоит, лучше использовать тип ячейки Uniqueidentifier.
А потому, данный метод можно дополнить конвертацие результата типа String в Guid:
Guid GetHashString(string s)
{
//переводим строку в байт-массим
byte[] bytes = Encoding.Unicode.GetBytes(s);
//создаем объект для получения средст шифрования
MD5CryptoServiceProvider CSP =
new MD5CryptoServiceProvider();
//вычисляем хеш-представление в байтах
byte[] byteHash = CSP.ComputeHash(bytes);
string hash = string.Empty;
//формируем одну цельную строку из массива
foreach (byte b in byteHash)
hash += string.Format("{0:x2}", b);
return new Guid(hash);
}
Следует знать, что обратного алгоритма не существует. Расшифровке зашифрованные по MD5 данные не поддаются, а потому проверять пароль зарегистрированного пользователя при попытке входа следует также приводить вводимый пароль к хеш-значению и только после этого сравнивать с находящимся в БД.