Безопасная система аутентификации в python? - PullRequest
4 голосов
/ 02 октября 2011

Я делаю веб-приложение на python и хотел бы иметь систему безопасного входа в систему.

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

Я верю, что понимаю принципы продвинутой системы, подобной этой, но не конкретику:

  • Использовать HTTPS для страницы входа и важных страниц
  • Хэш пароля, сохраненного в базе данных (bcrypt, sha256? Использовать соль?)
  • Использовать одноразовые номера (зашифрованные с помощью URL страницы и ip?)

Но кроме них, я не знаю, как надежно проверить, действительно ли пользователь, вошедший в систему, является пользователем, или как безопасно поддерживать сеансы между запросами страниц и несколькими открытыми страницами и т. Д.

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

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

Ответы [ 2 ]

5 голосов
/ 03 октября 2011

Этот ответ в основном касается хеширования пароля, а не других ваших подвопросов. Для них мой главный совет: не изобретайте велосипед: используйте существующие фреймворки, которые хорошо работают с GAE. Он предлагает встроенные развертывания Django, но также имеет встроенную установку WebOb, поэтому следует также учитывать различные платформы на основе WebOb (Pyramid, Turbogears и т. Д.). Все они будут иметь готовые библиотеки, которые будут обрабатывать многие из них для вас (например: многие платформы WebOb используют Beaker для обработки сеансов на основе файлов cookie)


Относительно хеширования пароля ... поскольку вы указали в некоторых других комментариях, что используете Google App Engine, вы хотите использовать хэш пароля SHA512-Crypt .

Другими основными вариантами максимально надежного хранения хэшей паролей являются BCrypt, PBKDF2 и SCrypt. Тем не менее, GAE не предлагает C-ускоренную поддержку этих алгоритмов, поэтому единственный способ их развертывания - через реализацию на чистом python. К сожалению, их алгоритмы слишком сложны для реализации на чистом Python, чтобы выполнять достаточно быструю работу, чтобы быть безопасными и отзывчивыми. Принимая во внимание, что реализация GAE модуля Python crypt предлагает поддержку ускоренного C-SHA512-Crypt (по крайней мере, каждый раз, когда я его тестировал), так что он мог работать с достаточной силой.


Что касается написания реального кода, вы можете напрямую использовать модуль crypt. Вам нужно будет позаботиться о создании ваших собственных солевых строк при передаче их в крипту, а при шифровании новых паролей звоните crypt.crypt(passwd, "$6$" + salt). $6$ говорит ему использовать SHA512-Crypt.

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

from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["sha512_crypt"], 
                           default="sha512_crypt", 
                           sha512_crypt__default_rounds=45000)
# encrypt password 
hash = pwd_context.encrypt("toomanysecrets")

# verify password
ok = pwd_context.verify("wrongpass", hash)

Примечание: если вы заботитесь о безопасности пароля, что бы вы ни делали, не использует один алгоритм HASH (соль + пароль) (например, Django, PHPass и т. Д.), Поскольку это может быть довольно грубо вынуждены.

1 голос
/ 02 октября 2011

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

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

Если вы хотите узнать, как это делается, изучите документацию и источник указанного модуля.

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