Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

работа метода Object.GetHashCode()

#c_sharp #net


вычитал в книге про одну компанию которая конкатенировала строку логина и пароля
и получала хешкод вызовом этого метода, заносила его в куки что бы пометить авторизированных
пользователей, но потом Microsoft поменяла алгоритм хеширования и многие пользователи
не смогли получить доступ к своим учётным записям.
Неужели в хотя бы в тысячи строк не найдётся две разные строки которые выдадут одинаковый
хеш? Так же в книге говорилось что так делать не надо, подскажите алгоритм хеширования
что бы в будущем я не писал такие методы авторизации.
    


Ответы

Ответ 1



Никаких гарантий нет на то, что значения хешкода не поменяются между запусками приложения. Поэтому компания, которая на это рассчитывала, сама виновата в проблемах своих пользователей, нечего винить Microsoft. Хранить хешкод для использовании при следующем пробеге программы неверно, он имеет право поменяться. Разумеется, хешкоды разных строк с логином/паролем вполне могут совпадать! То, что на основе хешкода от логина/пароля была построена безопасность — ещё одна ошибка. Авторизация должна не быть основана на хешкоде. Объект, представляющий собой пользователя, нужно создавать на основе логина или на том, что в вашей системе уникально идентифицирует пользователя. Хешкод тут вовсе не при чём, он не идентифицирует пользователя.

Ответ 2



В книге говорится правильно. Метод GetHashCode не предназначен для решения задач связанных с авторизацией. С его помощью осуществляется иднетификация объекта при проверке на равенство. Подробнее можете почитать на MSDN. В подобных случаях лучше использовать из пространства имён System.Security.Cryptography. Например, тот же MD5.

Ответ 3



Суть алгоритма Хеширования и состоит в том, чтобы обеспечивать "лавинный эффект". Изменение хотя бы одного бита должно кардинально менять значение хэш-функции. Но есть коллизии т.е. совпадение результатов, когда они не должны совпадать. Тщательно выбирать саму хэшфункцию не имеет особого смысла. Просто не применяйте подобный паттерн, это bad practice. Прислушайтесь к ответу @VladD и @Streletz.

Ответ 4



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

Комментариев нет:

Отправить комментарий