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

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

6
задан retracile 30 March 2010 в 00:19
поделиться

4 ответа

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

Затем сожмите случайные байты во что-то, что вписывается в рамки того, какие символы вы можете использовать в cookie HTTP. base64 работает для этого. Это не совсем оптимально, потому что существует более 64 безопасных для файлов cookie символов, и он имеет тенденцию оставлять завершающие символы == , которые добавляют байты в заголовок, но не случайность, но это нормально. Это работает, и Python, вероятно, может выполнять кодировку base64 быстрее, чем что-либо еще, что мы можем придумать.

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

4
ответ дан 8 December 2019 в 12:19
поделиться

Купите Брюса Шнайера Секреты и ложь и его Практическая криптография . Закажите Росс Андерсон Инженерное обеспечение безопасности, 2-е изд. пока вы на нем. А теперь прочтите «Секреты и ложь» - поверьте мне, это веселое чтение. :) Тогда прочтите «Практическая криптография». На этом этапе у вас должно быть больше знаний о том, что вам нужно делать при реализации программного обеспечения, требующего некоторой защиты. Идите вперед и сделайте черновой вариант реализации. Теперь, когда ваш экземпляр Security Engineering прибыл, прочтите его ... хотя вам, возможно, захочется переваривать его немного медленнее; это довольно тяжелый фолиант.

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

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

{ {1}}
7
ответ дан 8 December 2019 в 12:19
поделиться

Используйте модуль UUID в версии 2.5 и выше. Таким образом, их невозможно угадать, поскольку они не являются последовательными. Если вы хотите, чтобы они были действительно безопасными, вы можете объединить их с идентификатором пользователя, а затем хешировать их SHA1, Base64 кодирует результат и затем использует его в качестве значения. Таким образом, вы можете проверить на стороне сервера, что это действительно ваши файлы cookie, а не просто что-то, что спамер генерирует и бросает на ваш сервер. И чтобы сделать их еще более безопасными, убедитесь, что они работают только определенное количество времени как на сервере, так и на клиенте. Python 2.6.5 имеет встроенную реализацию HMAC , которую вы также можете использовать для сгенерированного UUID.

4
ответ дан 8 December 2019 в 12:19
поделиться

Лучшим способом будет генерация UUID, используя uuid.uuid1 функцию:

Генерация UUID из ID хоста, порядкового номера и текущего времени.

-2
ответ дан 8 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: