два кода md5 хэширования не возвращают один и тот же результат

#c# #asp.net #asp.net-core #md5

#c# #asp.net #asp.net-ядро #md5

Вопрос:

У меня есть два фрагмента кода для генерации пароля, оба из которых используют алгоритм хеширования md5. Проблема, с которой я сталкиваюсь, заключается в том, что эти два, несмотря на то, что они используют алгоритм хеширования, но их выходные данные не совпадают. Оба возвращают строку длиной 32 символа, но первый результат в нижнем регистре, а второй — в ВЕРХНЕМ. В чем разница? И как пароли, сгенерированные методом 2, могут быть преобразованы в метод 1?

Способ 1:

 public static string ConvertToMD5Hash(this string password)
        {
            using (var md5 = MD5.Create())
            {
                var result = md5.ComputeHash(Encoding.ASCII.GetBytes(password));
                return result.ToHex(false);
            }
        }
 

Способ 2:

 FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5");
 

Обновить:

 result method 1: 93db94704e31b49b44452ddb5fcada2c

result method 2: 02EF13AE7287E27CF74D5E3F42A7FCB2
 

Комментарии:

1. @CodeCaster: Конечно, я прав!!!

2. @CodeCaster: ОП спросил, в чем разница. Если использование другой кодировки работает, то кодировка изменяет регистр букв.

Ответ №1:

Шестнадцатеричное представление не зависит от регистра («1A» == «1a»). Подумайте, какое представление вы хотите, в нижнем или верхнем регистре, и преобразуйте другое в это представление или сделайте само сравнение нечувствительным к регистру.

Что касается разницы в фактическом содержимом хэша, ваша проблема заключается здесь:

 Encoding.ASCII.GetBytes(password)
 

Вы не должны использовать кодировку ASCII, так как это приведет к получению «?» для каждого входного символа выше кодовой точки 127, что приведет к другому хэшу, чем при использовании правильной кодировки.

FormsAuthentication.HashPasswordForStoringInConfigFile() кстати, блестящее имя использует UTF-8, так что:

 Encoding.UTF8.GetBytes(password)
 

Кроме того, использование хэша MD5 для хранения паролей — это практика 00-х годов, и ее больше не следует использовать. Это небезопасно. Не выполняйте собственное хэширование пароля, особенно после того, как вы отметили вопрос ASP.NET Ядро, просто используйте ASP.NET Идентификатор для аутентификации и хранения учетных данных.