#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 Идентификатор для аутентификации и хранения учетных данных.