Защита аутентификации на основе файлов cookie
В настоящее время я пересматриваю одно из своих веб-приложений, и я надеялся на некоторые советы по улучшению моей безопасности.
Отмечу, что приложение находится в ASP.net, и текущая реализация мешает мне использовать встроенную проверку подлинности. Это также никоим образом не приложение, требующее высокой безопасности, я просто хочу, чтобы мои базы были защищены.
В прошлом я сохранил идентификатор и токен.
Токен представляет собой хэш идентификатора пользователя + пользователя Salt (повторное использование значения из информации auth)
Когда пользователь посещает сайт, идентификатор проверяется на токен и соответственно аннулируется.
Мне кажется, что здесь есть большая дыра.
Теоретически, если кто-то получил свои соляные ценности, все, что им нужно сделать, это угадать алгоритм хэширования и перебрать возможные идентификаторы до тех пор, пока они не войдут. Я не ожидаю, что это произойдет, но это все еще кажется ошибкой.
Любые советы о том, как правильно подтвердить, что файлы cookie пользователя не были изменены?
Ответы
Ответ 1
Как большинство веб-сайтов делают это для аутентификации использования, и в случае успеха они отправляют браузеру cookie для хранения и отправки любых последующих запросов. Если злоумышленник смог получить токен (до истечения срока его действия), он сможет выдавать себя за пользователя.
В связи с этим процесс cookie и аутентификации всегда должен выполняться в течение сеанса https. Единственный реальный способ, которым атакующий должен завладеть куки файлом, - это перехватить его на компьютере конечного пользователя, и если они смогут это сделать, они могут, возможно, установить регистратор хода стержня и получить пароль пользователя в любом случае.
Что касается того, какой токен использовать, это не имеет значения до тех пор, пока он будет достаточно случайным, чтобы сделать его вычислительно дорогостоящим для злоумышленника. Я сам использую GUID. если вам нужна дополнительная информация в cookie, кроме всего лишь сеанса, вы можете добавить к ней GUID, а затем, скорее всего, хэш или зашифровать его только для подхода к поясу и фигурным скобкам.
Ответ 2
Лучший способ - сохранить идентификатор сеанса в качестве значения cookie.
Когда пользователь регистрируется, вы создаете запись в базе данных или в каком-либо другом хранилище сеансов со случайным идентификатором сеанса. Поместите идентификатор в файл cookie. Когда вы увидите файл cookie позже, вы можете получить всю информацию о пользователе из базы данных.
Этот подход имеет следующие преимущества:
- Это очень безопасно. Идентификатор сеанса - это просто случайное число. Вам не нужно беспокоиться о скомпрометированном ключе или соли.
- Файл cookie может быть легко удален с сервера. Все, что вам нужно сделать, это удалить запись сеанса и сделать идентификатор бесполезным.
- Значение cookie может быть очень коротким.
Если это не работает для вас, попробуйте шифровать. Хэш будет моим последним выбором. Сам хэш бесполезен. Вы должны четко хранить идентификатор пользователя и другую информацию в другом cookie. Вы закончили раскрывать информацию о пользователе.
Ответ 3
Два способа:
- Зашифровать его с помощью симметричного алгоритма (AES).
Это хорошо, потому что позволяет расшифровать его; но можно утверждать, что вам не нужно расшифровывать его (в зависимости от того, что еще вы там храните).
- Хеш и подпишите его. Опять же, это использует закрытый ключ, поэтому, даже если кто-то знает точное содержимое, они не могут воспроизвести хэш, потому что им нужен закрытый ключ.
Я бы (и раньше) мог бы пойти с опцией # 1.
Ответ 4
Почему не только хранить хэш в cookie или любое другое псевдослучайное число? Затем проверьте базу данных, чтобы получить идентификатор пользователя.
Другие вещи:
Сделать только файл cookie http, т.е. не может быть установлен с помощью javascript
Если это опция, сделайте это только с данными https