Как генерируются идентификаторы сеанса?

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

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

Возникает вопрос: как эффективно создавать редкие и уникальные идентификаторы сеансов?

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

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

  • GUID считаются небезопасными с точки зрения безопасности (и случайности).
  • Основная проблема заключается в том, чтобы номера были уникальными, то есть не повторялись, что делало их эффективными.

person Asaf R    schedule 23.03.2010    source источник
comment
Кто сказал, что идентификаторы GUID небезопасны? Разместите пожалуйста ссылку.   -  person John Saunders    schedule 23.03.2010
comment
@John: об этом спорили даже на SO: stackoverflow.com/questions/1402696/ Я мог бы добавить, что дебаты о безопасности GUID могут быть такими же бесконечными и бесплодными, как и дебаты о безопасности моих дверных замков. Как сказал Шнайер, когда его спросили, должен ли Обама отказаться от своего Blackberry: Решения по безопасности всегда уравновешивают одно против другого ... Только он может уравновесить эти преимущества и риски и принять решение.   -  person Andras Vass    schedule 23.03.2010


Ответы (2)


Если вы хотите, чтобы они были уникальными и их было трудно угадать, почему бы не объединить их?

Возьмите счетчик (генерирует уникальное значение для нового сеанса) и добавьте случайные биты, сгенерированные CSPRNG. Убедитесь, что вы получили необходимое минимальное количество бит.

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

SSSSCCCCCRRRRRR

Где S - это идентификатор сервера, создавшего сеанс, C - это локальный счетчик сервера, а R - криптослучайный.

(Отказ от ответственности: количество букв не соответствует количеству цифр / битов, которые вы должны каким-либо образом использовать. :)

Уникальный, надежный.

person Andras Vass    schedule 23.03.2010

Вы можете взглянуть на RNGCryptoServiceProvider, если используете .NET.

http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=775

Это криптографически безопасный способ генерации случайных чисел.

person Josh Barker    schedule 23.03.2010
comment
@jbarker: Это хороший способ использовать генератор случайных чисел, но он не решает проблему отсутствия их повторения, то есть делает их уникальными. - person Asaf R; 23.03.2010
comment
Это правда, но при достаточно сильном столкновении маловероятно. Если вас беспокоит это или производительность, создайте другой процесс, проверьте уникальность и надежно сохраните их. Либо так, либо используйте их в сочетании с GUID. - person Josh Barker; 23.03.2010
comment
То, что сказал Андрас, будет правильным или использовать RNGCrypto в сочетании с GUID, как я уже упоминал выше: RRRRGGGG R = RNGCrypto G = GUID - person Josh Barker; 24.03.2010