2016-08-24 4 views
0

Я создал контроллер API, который сравнивает имя пользователя и пароль, которые я вводил, вместо имени пользователя и пароля (HASHED), которые сохраняются в моей базе данных.Как сравнить строковое значение с хэш-значением?

Моя проблема заключается в том, что мне действительно трудно сравнивать пароль, который я набрал, потому что пароль в моей базе данных находится в состоянии HASH. Очевидно, они будут иметь два разных значения. Как сравнить значение строки с значением хеша?

Если два пароля совпадают, он должен вернуть true, иначе false. Я сейчас нахожусь в замешательстве. Надеюсь, ты поможешь мне. Благодарю.

Это коды, которые я использовал.

LoginController.cs

namespace WebFormsDemo.Controllers 
{ 
    public class LoginController : ApiController 
    { 
     private EBMSEntities db = new EBMSEntities(); 

     // GET: api/Login   
     [Route("api/Login/Search/{username}/{password}")] 
     [ResponseType(typeof(List<AspNetUser>))]  
     public bool getUserPassword(string username, string password)  
     {    
      var hashedPassword = ""; 
      hashedPassword = Crypto.HashPassword(password);  

      var user = (from u in db.AspNetUsers 
            where u.UserName.Equals(username) 
            && u.PasswordHash.Equals(hashedPassword) 
            select u).ToList();  

      if (user.Count() != 0) 
      { 
       return true; 
      }  
      return false;  
     }  
    } 
} 
+1

Итак, что не так с кодом, который вы опубликовали? – sstan

+0

@Rohit ранее я забыл о праве Crypto.HashPassword в моей хэш-функции . –

+0

Вы должны взглянуть на Identity, который является аутентификацией на основе токенов - http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api –

ответ

-1

Применить ту же функцию хэширования на пароль, полученные от пользователя. Затем вы можете сравнить между двумя хэшированными паролями. Если они совпадают, то пароль правильный.

Поскольку вы используете Identity, вы можете использовать UserManager.PasswordHasher.VerifyHashedPassword(). Вам необходимо отправить хешированный пароль из базы данных в качестве первого параметра и пароля, предоставленного пользователем в качестве второго параметра.

public bool getUserPassword(string username, string password)  
{ 
    string hashPassword= (from u in db.AspNetUsers 
         where u.UserName.Equals(username) 
         select u.PasswordHash).ToString(); 
    //Get the salt from the hashed password and use it to hash the user given password 
    //Then verify that both the passwords match and check the result with the PasswordVerificationResult enum 
    if (UserManager.PasswordHasher.VerifyHashedPassword(hashPassword, password) != PasswordVerificationResult.Failed) 
     return true; 
    else 
     return false; 
} 

VerifyHashedPassword возвращает тип PasswordVerificationResult который является перечислением, которое может использоваться для проверки, был ли данный пароль не удался или прошел проверку.

В качестве альтернативы SignInManager.PasswordSignIn() или SignInManager.PasswordSignInAsync() методы могут быть использованы, если вы только хотите сделать знак пользователя в Оба метода имеют одинаковую сигнатуру

+0

Это был ho гнездо ошибка. Я изменил коды сэра, но все равно. –

+0

Как я могу использовать «UserManager»? Это ошибка. Это как-то связано с библиотекой? –

0

Из комментария ниже ответ:.

Sir на самом деле я не знаю хэш-алгоритм для MVC 5, но это то, что я использую.

Похоже, вы используете Asp.Net Identity. В этом случае вы должны использовать предоставленную инфраструктуру, включая UserManager и/или SignInManager, для проверки учетных данных.

Верните сначала пользователя, а затем сравните пароль в памяти. Это проще, чем делать это в базе данных.

var doesPasswordMatch = false; 

var user = db.AspNetUsers.SingleOrDefault(x => x.UserName == username); 
if(user != null) 
{ 
    var hashedPassword = Crypto.HashPassword(password); 
    // var doesPasswordMatch = //compare u.PasswordHash with hashedPassword in memory 
} 
return doesPasswordMatch; 

Вам все равно необходимо преобразовать сохраненный пароль в тот же формат. Неясно, является ли это байтовым массивом или чем-то еще. Лучший вариант - отвлечь это на другой класс утилиты. Также неясно, как вы хешируете свой пароль (что такое алгоритм). Убедитесь, что вы используете безопасную технологию хэширования с солью (которая зависит от хэшированного пароля).

+0

Сэр, на самом деле я не знаю хэш-алгоритм для MVC 5, но это то, что я использую. То, что я хочу сделать, это просто сравнить ключ в пароле и пароль в моей базе данных. Но мой пароль в базе данных находится в хеш-значении. В любом случае, я могу сравнить свой пароль с хешированным паролем? –

+0

@JayceeEvangelista - так вы используете идентификатор ASP.NET (по умолчанию) с MVC5 или что-то еще? Независимо от того, что вы используете, уже должна быть обертка вокруг всей проверки пользователя и пароля, которую вы можете вызывать с помощью обычного текстового пароля, который затем конвертер будет конвертировать и сравнивать. – Igor

+0

Я использую идентификатор ASP.NET с моим контроллером Web API 2 с помощью приложений, используя Entity Framewoek. –

1

Существует множество методов, предоставляемых для хэш-строк пароля. Некоторые из них - MD5, SHA1, SHA256 и т. Д. И многие другие, которые содержат даже сложные функциональные коды, чтобы убедиться, что пароли менее уязвимы для возврата к строке. Теперь проблема может быть, что вы используете неправильную версию алгоритма хэширования.

Я бы предпочел оставить этот код самому членству ASP.NET, есть функция Validation в объекте класса Membership, который может использоваться для запроса ASP.NET для проверки того, является ли пользователь действительным. Затем, ваш код будет нравится,

public bool getUserPassword(string username, string password)  
{    
    return Membership.ValidateUser(username, password); 
} 

Это будет под управлением самого ASP.NET, и вы получите то, что вы хотите! Если нет, то я бы рекомендовал проверить алгоритм хеширования и убедиться, что вы используете тот же алгоритм хэширования, который использовался для хэширования начального пароля пользователя. В противном случае это всегда будет отличаться.

В случае с идентификатором ASP.NET вы можете использовать UserManager.CheckPassword(user, password), чтобы определить, подходит ли пароль для пользователя. Поскольку ASP.NET Идентичность является рекомендуемой рамкой (и членство старше один), следующий код рекомендуется способом сделать это с помощью UserManager.Find (пользователя:

public bool getUserPassword(string username, string password) { 
    var user = UserManager.Find(username, password); 
    return user == null; // If user is null, password didn't match. 
} 

Таким образом, вы будете в состоянии сделать это Наконец, вы можете найти полезный и полезный материал в документации MSDN для полного обзора этих функций.

+0

Сэр, на самом деле я не знаю хэш-алгоритм для MVC 5, но это то, что я использую. То, что я хочу сделать, это просто сравнить ключ в пароле и пароль в моей базе данных. Но мой пароль в базе данных находится в хеш-значении. В любом случае, я могу сравнить свой пароль с хешированным паролем? –

+0

@JayceeEvangelista, возможно, вы неправильно поняли мой ответ. ** Хэш не может быть преобразован обратно в обычный текст **. Вот почему каждый раз при входе в систему пользовательский пароль также преобразуется в хеш-значение. Хэши для одного и того же пароля (одинаковый случай тоже!) Всегда одинаковы. Вот как эти системы регистрируют вас. Вот почему я предоставил вам функции фреймворка; с которыми легче работать. –

+0

О, я понял. Спасибо за это. Но сэр основывался на моих исследованиях. Я использую идентификатор ASP.NET . В этом случае, что мне делать? –

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