Подписанные сессионные куки. Хорошая идея? - PullRequest
27 голосов
/ 13 июля 2010

Чтобы повысить производительность, я думал о том, чтобы попытаться исключить простой «cookie-файл сеанса», но зашифровать всю информацию в самом cookie-файле.

Очень простой пример:

userid= 12345
time=now()
signature = hmac('SHA1',userid + ":" + time, secret);

cookie = userid + ':' + time + ':' + signature;

Время будет использоваться для максимального срока годности, поэтому куки не будут жить вечно.

Теперь большой вопрос: плохая ли это идея?

Я лучшеиспользовать AES256 вместо?В моем случае данные не являются конфиденциальными, но их нельзя изменять ни при каких обстоятельствах.

РЕДАКТИРОВАТЬ

После некоторой хорошей критики и комментариев я хотел быДобавьте это:

  • «Секрет» будет уникальным для каждого пользователя и непредсказуемым (случайная строка + идентификатор пользователя?)
  • Срок действия файла cookie истекает автоматически (это делается на основезначение времени + определенное количество секунд).
  • Если пользователь меняет свой пароль (или, возможно, даже выходит из системы?), секрет должен измениться.

Последнее замечание: Iпытаюсь придумать решения для снижения нагрузки на базу данных.Это только одно из решений, которые я изучаю, но это мое любимое решение.Основная причина в том, что мне не нужно искать другой механизм хранения, лучше подходящий для такого рода данных (memcache, nosql), и это делает веб-приложение немного более «не имеющим состояния».

10 лет спустя edit

JWT теперь вещь.

Ответы [ 5 ]

26 голосов
/ 13 июля 2010

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

  • ограниченный по времени, счет-Логин;
  • пароль восстанавливающийся;
  • анти-XSRF формы;
  • отправка формы с ограничением по времени (защита от спама).

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

HMAC - один из разумных способов создания подписанного токена. Это не будет самым быстрым; Вы можете избежать простого хэша, если знаете об этом и можете избежать атак с расширением. Я оставлю вас, чтобы решить, стоит ли это для вас риска.

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

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

5 голосов
/ 01 июня 2017

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

Стремясь повысить производительность, я пытался исключить простой файл cookie сеанса, но зашифровать всю информацию в само печенье.

Теперь о большом вопросе: это плохая идея?

Краткий ответ: Нет, это не плохая идея, на самом деле это действительно хорошая идея, ставшая отраслевым стандартом.

Длинный ответ таков: Это зависит от вашей реализации. Сессии отличные, они быстрые, они простые и их легко защитить. Однако, когда система без сохранения состояния работает хорошо, она немного сложнее в развертывании и может выходить за рамки небольших проектов.

Внедрение системы аутентификации на основе токенов (cookie) очень распространено в настоящее время и работает исключительно хорошо для систем без состояний / apis . Это позволяет проводить аутентификацию для множества различных приложений с одной учетной записью. то есть. войдите на {неаффилированный сайт} через Facebook / Google.

Внедрение такой системы oAuth само по себе является БОЛЬШИМ предметом. Поэтому я оставлю вам документацию oAuth2 Docs . Я также рекомендую просмотреть Json Web Tokens (JWT) .

дополнительный

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

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

5 голосов
/ 13 июля 2010

Да, это плохая идея.

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

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

Онидолжны быть конфиденциальными, чтобы злоумышленники не могли их украсть и выдать себя за аутентифицированного пользователя.Любой запрос, выполняющий действие, требующее авторизации, должен быть защищен от несанкционированного доступа.То есть, запрос whole должен иметь какую-то защиту целостности, такую ​​как HMAC, чтобы его содержимое не могло быть изменено.Для веб-приложений эти требования неизбежно приводят к HTTPS.

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


Если у канала нет конфиденциальности и целостности, вы открываете себя для атак «человек посередине».,Например, без конфиденциальности Алиса отправляет свой пароль Бобу.Ева выслеживает его и может войти позже как Алиса.Или, с частичной целостностью, Алиса присоединяет свой подписанный файл cookie к запросу на покупку и отправляет их Бобу.Ева перехватывает запрос и изменяет адрес доставки.Боб проверяет MAC-адрес файла cookie, но не может обнаружить, что адрес был изменен.

У меня нет цифр, но мне кажется, что возможности для человека посерединеатаки постоянно растут.Я замечаю рестораны, использующие сеть Wi-Fi, которую они предоставляют клиентам для обработки своих кредитных карт.Люди в библиотеках и на рабочих местах часто подвержены прослушиванию, если их трафик не превышает HTTPS.

1 голос
/ 13 июля 2010

Вы не должны изобретать велосипед. Обработчик сеансов, который поставляется с вашей платформой разработки, намного безопаснее и, безусловно, проще в реализации. Cookies всегда должны быть очень большими случайными числами, которые связаны с данными на стороне сервера. Файл cookie, содержащий идентификатор пользователя и отметку времени, не помогает защитить сеанс от атаки.

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

Вероятно, вы используете один и тот же секрет для расчета HMAC для всех сеансов. Таким образом, этот секрет может быть взломан злоумышленником, который входит в систему со своей учетной записью. Глядя на свой идентификатор сессии, он может получить все, кроме секрета. Затем злоумышленник может перебить секрет, пока не будет воспроизведено значение hmac. Используя этот секрет, он может восстановить административный файл cookie и изменить свой user_id=1, что, вероятно, предоставит ему административный доступ.

1 голос
/ 13 июля 2010

Что заставляет вас думать, что это улучшит производительность по сравнению с безопасными идентификаторами сеансов и извлечет идентификатор пользователя и информацию о времени из серверного компонента сеанса?

Если что-то должно быть защищено от несанкционированного доступа, неположить его в руки малышей.Например, вообще не передавайте его клиенту, даже с защитой от несанкционированного доступа.

Игнорирование идеологических проблем выглядит довольно прилично.У вас нет одноразового номера.Вы должны добавить это.Просто случайный мусор, который вы храните вместе с идентификатором пользователя и временем, чтобы предотвратить воспроизведение или прогноз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...