Защита аутентификации на основе файлов cookie

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

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

В прошлом я сохранил идентификатор и токен. Токен представляет собой хэш идентификатора пользователя + пользователя Salt (повторное использование значения из информации auth) Когда пользователь посещает сайт, идентификатор проверяется на токен и соответственно аннулируется.

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

Любые советы о том, как правильно подтвердить, что файлы cookie пользователя не были изменены?

Ответ 1

Как большинство веб-сайтов делают это для аутентификации использования, и в случае успеха они отправляют браузеру cookie для хранения и отправки любых последующих запросов. Если злоумышленник смог получить токен (до истечения срока его действия), он сможет выдавать себя за пользователя.

В связи с этим процесс cookie и аутентификации всегда должен выполняться в течение сеанса https. Единственный реальный способ, которым атакующий должен завладеть куки файлом, - это перехватить его на компьютере конечного пользователя, и если они смогут это сделать, они могут, возможно, установить регистратор хода стержня и получить пароль пользователя в любом случае.

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

Ответ 2

Лучший способ - сохранить идентификатор сеанса в качестве значения cookie.

Когда пользователь регистрируется, вы создаете запись в базе данных или в каком-либо другом хранилище сеансов со случайным идентификатором сеанса. Поместите идентификатор в файл cookie. Когда вы увидите файл cookie позже, вы можете получить всю информацию о пользователе из базы данных.

Этот подход имеет следующие преимущества:

  • Это очень безопасно. Идентификатор сеанса - это просто случайное число. Вам не нужно беспокоиться о скомпрометированном ключе или соли.
  • Файл cookie может быть легко удален с сервера. Все, что вам нужно сделать, это удалить запись сеанса и сделать идентификатор бесполезным.
  • Значение cookie может быть очень коротким.

Если это не работает для вас, попробуйте шифровать. Хэш будет моим последним выбором. Сам хэш бесполезен. Вы должны четко хранить идентификатор пользователя и другую информацию в другом cookie. Вы закончили раскрывать информацию о пользователе.

Ответ 3

Два способа:

  • Зашифровать его с помощью симметричного алгоритма (AES).

Это хорошо, потому что позволяет расшифровать его; но можно утверждать, что вам не нужно расшифровывать его (в зависимости от того, что еще вы там храните).

  1. Хеш и подпишите его. Опять же, это использует закрытый ключ, поэтому, даже если кто-то знает точное содержимое, они не могут воспроизвести хэш, потому что им нужен закрытый ключ.

Я бы (и раньше) мог бы пойти с опцией # 1.

Ответ 4

Почему не только хранить хэш в cookie или любое другое псевдослучайное число? Затем проверьте базу данных, чтобы получить идентификатор пользователя.

Другие вещи: Сделать только файл cookie http, т.е. не может быть установлен с помощью javascript Если это опция, сделайте это только с данными https