Вычисление MD5 хэша в .NET

5 апреля 2011 г.

Во время написания некого проекта на ASP.NET, мне понадобилось подключить к своему веб-сайту виджет авторизации ВКонтакте. Так как с JavaScript я вообще не знаком, а как таковых прямых примеров на подключение OpenAPI к веб-сайту я не нашел, возможно плохо искал, но скорее не было желания использовать чужую библиотеку, хотелось понять и изучить само подключение OpenAPI к моему веб-сайту. Я начал с тривиального, то-есть подключение виджета авторизации. Изучив небольшую документацию на сайте, принялся за дело.

Итак, я узнал, что last_name и прочие параметры передаются путем запросов. Собственно для проверки вошел ли пользователь используется зашифрованный MD5 хэш ID приложения, ID пользователя, и Secret key приложения. Отсюда логично то, что нужно путем обычных действий в C#, то-есть декодированием данного набора символов кодировкой UTF-8, вычислением хэша массива байтов и кодированием той-же кодировкой в string, получить зашифрованную строку. Но не тут то было…

Первый нерабочий пример:

static string OneTest()
 {
 byte[] hash = Encoding.UTF8.GetBytes("194253766748fTanppCrNSeuYPbA4ENCo");
 MD5 md5 = new MD5CryptoServiceProvider();
 string hashenc = Encoding.UTF8.GetString(md5.ComputeHash(hash));
 return hashenc;
 }

Результат: ?♣Q?↔??&A%?1B??=

Второй нерабочий пример:

static string TwoTest()
 {
 byte[] hash = Encoding.ASCII.GetBytes("194253766748fTanppCrNSeuYPbA4ENCo");
 MD5 md5 = new MD5CryptoServiceProvider();
 string hashenc = Encoding.ASCII.GetString(md5.ComputeHash(hash));
 return hashenc;
 }

Результат: ?♣Q?↔??&A%?1B??=

Рабочий пример:

static string FreeTest()
 {
 byte[] hash = Encoding.ASCII.GetBytes("194253766748fTanppCrNSeuYPbA4ENCo");
 MD5 md5 = new MD5CryptoServiceProvider();
 byte[] hashenc = md5.ComputeHash(hash);
 string result = "";
 foreach (var b in hashenc)
 {
 result += b.ToString("x2");
 }
 return result;
 }

Результат: f10551c61d8f9d264125e1314287933d

На тот момент первый и второй результат меня очень удивили, не единой ошибки в методе, а тут данный набор символов. Наверняка в кодировке дело, свято думал я, но как видно из тестов, не верно.
Мне повезло что я попал на замечательный ресурс, честно не помню уже как называется, не суть важно. На этом ресурсе был описан алгоритм побайтового преобразования каждого символа в шестнадцатеричный символ, тем самым получая желаемый результат, то-есть хэш уже в string.

  • Похожие статьи
  • Предыдущие из рубрики