2016-11-04 8 views
2

У меня есть база данных с паролями, созданными в старой системе Identity. Пароли были хэшированы с использованием класса MD5CryptoServiceProvider. Теперь мне нужно использовать эти пароли в ASP.NET MVC Core, но MD5CryptoServiceProvider не существует.MD5CryptoServiceProvider в ASP.NET Core

В .NET Framework функция I используется для вычисления хэшей:

public static string CreateHash(string unHashed) 
{ 
    var x = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
    var data = Encoding.ASCII.GetBytes(unHashed); 
    data = x.ComputeHash(data); 
    return Encoding.ASCII.GetString(data); 
} 

Я попытался следующие две функции в ASP.NET Core:

public static string CreateHash(string unHashed) 
{ 
    var x = new System.Security.Cryptography.HMACMD5(); 
    var data = Encoding.ASCII.GetBytes(unHashed); 
    data = x.ComputeHash(data); 
    return Encoding.ASCII.GetString(data); 
} 

и

public static string MD5Hash(string input) 
{ 
    using (var md5 = MD5.Create()) 
    { 
     var result = md5.ComputeHash(Encoding.ASCII.GetBytes(input)); 
     var strResult = BitConverter.ToString(result); 
     return strResult.Replace("-", ""); 
    } 
} 

Ни один из методов не возвращает ту же строку, что и класс MD5CryptoServiceProvider в первом методе. Я не могу изменить всю базу данных, чтобы использовать новые пароли.

Любое исправление этого вопроса?

ответ

10

Есть две проблемы:

Во-первых, вы используете различные методы, чтобы преобразовать массив байтов обратно в строку. В своем первом и втором способах, вы используете

return Encoding.ASCII.GetString(data); 

В вашем третьем методе вы используете:

var strResult = BitConverter.ToString(result); 
return strResult.Replace("-", ""); 

Они не выводите одни и те же результаты.

Во-вторых, хотя хеш-функции, используемые в первом и третьем примерах, действительно идентичны, метод, используемый во втором примере, не является.

Короче говоря, для получения того, что вы хотите, используйте третий вариант, но используйте тот же метод, чтобы преобразовать его обратно в строку, которая использовалась в первом примере (если это то, что вы ранее использовали):

public static string MD5Hash(string input) 
{ 
    using (var md5 = MD5.Create()) 
    { 
     var result = md5.ComputeHash(Encoding.ASCII.GetBytes(input)); 
     return Encoding.ASCII.GetString(result); 
    } 
} 
+0

Вы настолько правы, что ... Спасибо. Сегодня пятница. 5:00 вечера... –

Смежные вопросы