Этот ответ в основном касается хеширования пароля, а не других ваших подвопросов. Для них мой главный совет: не изобретайте велосипед: используйте существующие фреймворки, которые хорошо работают с 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 и т. Д.), Поскольку это может быть довольно грубо вынуждены.