Я пишу свой собственный контроллер сессий, который выходит, уникальный идентификатор пользователю однажды вошел в систему, и затем проверяет и аутентифицирует тот уникальный идентификатор при каждой загрузке страницы. Что самый безопасный путь состоит в том, чтобы генерировать такой идентификатор? Уникальный идентификатор должен быть абсолютно случайным? Там какая-либо оборотная сторона к включению идентификатора пользователя как часть уникального идентификатора?
Если единственная информация в файле cookie - это идентификатор, по сути, метка, единственная атака, от которой вы пытаетесь защититься, - это злоумышленник, угадывающий, что это такое. Так что используйте несколько случайных байтов. Достаточно случайных байтов, чтобы это было «невозможно угадать».
Затем сожмите случайные байты во что-то, что вписывается в рамки того, какие символы вы можете использовать в cookie HTTP. base64 работает для этого. Это не совсем оптимально, потому что существует более 64 безопасных для файлов cookie символов, и он имеет тенденцию оставлять завершающие символы ==
, которые добавляют байты в заголовок, но не случайность, но это нормально. Это работает, и Python, вероятно, может выполнять кодировку base64 быстрее, чем что-либо еще, что мы можем придумать.
Если вы также хотите добавить к нему идентификатор пользователя, это упростит отслеживание и отладку, что, вероятно, облегчит вашу жизнь, так что продолжайте. Это не дает злоумышленнику значительного преимущества. (если им не удастся украсть один, не имея возможности иначе определить, у какого пользователя они воруют, что кажется маловероятным.)
Купите Брюса Шнайера Секреты и ложь и его Практическая криптография . Закажите Росс Андерсон Инженерное обеспечение безопасности, 2-е изд. пока вы на нем. А теперь прочтите «Секреты и ложь» - поверьте мне, это веселое чтение. :) Тогда прочтите «Практическая криптография». На этом этапе у вас должно быть больше знаний о том, что вам нужно делать при реализации программного обеспечения, требующего некоторой защиты. Идите вперед и сделайте черновой вариант реализации. Теперь, когда ваш экземпляр Security Engineering прибыл, прочтите его ... хотя вам, возможно, захочется переваривать его немного медленнее; это довольно тяжелый фолиант.
Существует также технический документ о том, что можно и чего нельзя делать при веб-аутентификации , который стоит прочитать и который имеет прямое отношение к тому, что вы делаете. Я все еще рекомендую книги выше.
И еще одна своевременная статья на LWN.net , в которой перечислено большое количество подводных камней, которых вам нужно поработать, чтобы избежать. (Кстати, LWN.net стоит подписаться, и я настоятельно рекомендую его. Вышеупомянутая ссылка дает бесплатный доступ к этой статье, которая в противном случае была бы недоступна для тех, у кого нет подписки.)
{ {1}}Используйте модуль UUID в версии 2.5 и выше. Таким образом, их невозможно угадать, поскольку они не являются последовательными. Если вы хотите, чтобы они были действительно безопасными, вы можете объединить их с идентификатором пользователя, а затем хешировать их SHA1, Base64 кодирует результат и затем использует его в качестве значения. Таким образом, вы можете проверить на стороне сервера, что это действительно ваши файлы cookie, а не просто что-то, что спамер генерирует и бросает на ваш сервер. И чтобы сделать их еще более безопасными, убедитесь, что они работают только определенное количество времени как на сервере, так и на клиенте. Python 2.6.5 имеет встроенную реализацию HMAC , которую вы также можете использовать для сгенерированного UUID.
Лучшим способом будет генерация UUID, используя uuid.uuid1
функцию:
Генерация UUID из ID хоста, порядкового номера и текущего времени.