Подтвердите ответ на контрольный вопрос при использовании хешированных паролей

Я унаследовал приложение, которое использует поставщик членства ASP.NET для управления пользователями. В рамках различных исправлений и улучшений я заменяю использование простых текстовых паролей хешированными. На существующей странице сброса пароля пользователь должен снова ввести правильный ответ на свой секретный вопрос, свой текущий пароль, желаемый новый пароль и желаемый новый пароль.

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

Я не могу вызвать GetPassword (), поскольку этот метод недоступен, если passwordFormat = "Хешированный" в Web.config.

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

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

Есть ли у кого-нибудь еще предложения? Это кажется довольно фундаментальным, поэтому у меня такое чувство, что я упускаю что-то очевидное.


person Malice    schedule 09.08.2011    source источник


Ответы (2)


Я не отвечаю напрямую на ваш вопрос о проверке секретного вопроса, но хочу подчеркнуть, что контрольные вопросы - это очень плохая практика с точки зрения безопасности (см. "ЧАСТЬ III: Использование Секретные вопросы "здесь ).

Вместо этого отправьте на электронную почту пользователя (которую вы уже подтвердили ранее при регистрации) «ссылку для сброса пароля», которая позволяет им создать новый пароль, предполагая, что они единственные, у кого есть доступ к своей электронной почте.

person Ofer Zelig    schedule 09.08.2011
comment
Офер, вы абсолютно правы, но, к сожалению, мы ограничены во времени, которое мы можем сделать. До этого пароли хранились в виде обычного текста в базе данных и передавались по электронной почте в виде обычного текста, так что, по крайней мере, мы улучшили некоторые аспекты функциональности управления пользователями. - person Malice; 09.08.2011
comment
Вы абсолютно правы, все надо делать по порядку. Я просто хотел подчеркнуть (ради всех остальных, кто зайдет на эту страницу), что вопросы безопасности - плохая практика ... - person Ofer Zelig; 09.08.2011

Ба, еще одна чашка кофе, и ответ был очевиден. У меня было это в моем методе проверки:

var result = DataService.ExecuteScalar(cmd);
return result == null;

где у меня должно было быть это:

var result = DataService.ExecuteScalar(cmd);
return result != null;

Похоже также, что я ошибался, когда думал, что строки хеширования для ответа на секретный вопрос отличаются.

person Malice    schedule 09.08.2011