Вычисление MD5 хэша в .NET
Во время написания некого проекта на 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.