2016-02-07 4 views
2

Я могу изменить свой введенный пользователем пароль, но я не могу узнать, как сравнить сохраненный хэш и новый хеш для введенного пользователем пароля.Как сравнить два хэша с помощью SHA256Managed?

Это мой хеширования код:

public static string CalculateHash(string clearTextPassword, string salt) 
{ 
    //Convert the salted password to a byte array 
    byte[] saltedHashBytes = Encoding.UTF8.GetBytes(clearTextPassword + salt); 

    //Use hash algorithm to calulate hash 
    HashAlgorithm algorithm = new SHA256Managed(); 
    byte[] hash = algorithm.ComputeHash(saltedHashBytes); 

    //Return the hash as a base64 encoded string to be compared and stored 
    return Convert.ToBase64String(hash); 
} 

Как сравнить два хэшей для проверки пароля?

+0

Просто выполните '==' на двух хэшах, помните, что это строки. Есть более безопасные решения, но это слишком сложно, если вы просто используете SHA256. Кстати, я бы рекомендовал вам переключиться на SHA512 –

+1

, простой '==' уязвим для временной атаки. Типично делать поразрядное сравнение, которое повторяется через каждый бит, а не останавливается при первом несоответствии, поэтому время, затрачиваемое на вычисление, не зависит от количества совпадающих битов. – Matthew

ответ

1

Во-первых, вы должны хранить соль с хешей.

Затем, когда пользователь пытается аутентифицировать с некоторыми login и password вы можете использовать следующий сценарий:

  1. Получить пользовательские данные из базы данных с помощью Логина (например, GetUser(login)). Пользовательский класс должен содержать логин, хешированный пароль и соль.
  2. Если у пользователя нет такого логина, выполните проверку подлинности. Else выполните CalculateHash() с password и соль из класса User, полученного на предыдущем шаге.
  3. Сравнить 2 строки: сначала хешированный пароль от класса пользователя, а второй - от метода CalculateHash(). Если хеши равны, то пользователь успешно аутентифицируется.
1

Вы сохранили как хэш, так и соль, верно?

Теперь, когда пользователь пытается войти в систему, вы можете снова запустить свой метод, используя соль, которую вы сохранили, а вывод вашего метода должен соответствовать хеш-памяти, хранящейся в вашей базе данных.

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