Мне интересно, достаточно ли безопасен пароль хэшер, который по умолчанию реализован в UserManager, который поставляется с MVC 5 и ASP.NET Identity Framework? И если да, то не могли бы вы объяснить мне, как это работает?
Интерфейс IPasswordHasher выглядит так:
public interface IPasswordHasher
{
string HashPassword(string password);
PasswordVerificationResult VerifyHashedPassword(string hashedPassword,
string providedPassword);
}
Как вы можете видеть, это не требует соли, но упоминается в этой теме: « Хэширование идентификационного пароля Asp.net », что оно действительно замаскирует его за кулисами. Поэтому мне интересно, как это сделать? И откуда эта соль?
Меня беспокоит то, что соль статична, что делает ее небезопасной.
securiry.stackexchange.com
. И спасибо за совет!Ответы:
Вот как работает реализация по умолчанию ( ASP.NET Framework или ASP.NET Core ). Для получения хэша используется функция получения ключа со случайной солью. Соль включена в состав продукции KDF. Таким образом, каждый раз, когда вы «хэшируете» один и тот же пароль, вы получаете разные хэши. Чтобы проверить хеш, выходные данные разделяются на соль и остальные, и KDF снова запускается на пароле с указанной солью. Если результат соответствует остальной части исходного вывода, хеш проверяется.
Хэш:
Проверка:
источник
HashPassword
функция возвращает оба в одной строке? И когда вы проверяете это, он снова разделяет его, снова хэширует и хэширует входящий пароль открытого текста вместе с солью из разбиения и сравнивает его с исходным хешем?var hashedPassword = HashPassword(password); var result = VerifyHashedPassword(hashedPassword, password);
- это то, что вам нужно сделать. после этогоresult
содержит истину.Поскольку в наши дни ASP.NET является открытым исходным кодом, вы можете найти его на GitHub: AspNet.Identity 3.0 и AspNet.Identity 2.0 .
Из комментариев:
источник
Я понимаю принятый ответ и проголосовал за него, но подумал, что дам ответ моего мирянина здесь ...
Создание хэша
Проверка пароля по хешу
Чтобы проверить пароль, который вводит пользователь.
Хеш
Под покровом хеш генерируется с использованием хеш-функции SHA1 ( https://en.wikipedia.org/wiki/SHA-1 ). Эта функция итеративно вызывается 1000 раз (в стандартной реализации Identity)
Почему это безопасно
источник
Для таких, как я, новичок в этом, вот код с const и реальный способ сравнить байты []. Я получил весь этот код из stackoverflow, но определил константы, чтобы значения могли быть изменены, а также
В своем пользовательском ApplicationUserManager вы задаете свойству PasswordHasher имя класса, который содержит приведенный выше код.
источник
_passwordHashBytes = bytes.GetBytes(SaltByteSize);
Я думаю, вы имели в виду это_passwordHashBytes = bytes.GetBytes(HashByteSize);
.. Не имеет значения в вашем сценарии, поскольку оба имеют одинаковый размер, но в целом ..