python中的安全身份验证系统?

时间:2011-10-02 16:48:56

标签: python security web-applications authentication login

我正在使用python创建一个Web应用程序,我希望有一个安全的登录系统。

我之前通过让用户登录多次登录系统,然后将一个随机字符串保存在一个cookie中,该cookie也保存在该用户旁边的数据库中,该数据库工作正常,但不是很安全。

我相信理解像这样的先进系统的原则,但不是具体细节:

  • 使用HTTPS登录页面和重要页面
  • 哈希保存在数据库中的密码(bcrypt,sha256?使用salt?)
  • 使用nonces(使用页面url和ip加密?)

但除了那些我不知道如何可靠地检查登录的用户是否真的是用户,或者如何安全地保持页面请求和多个打开页面之间的会话等等。

我可以提供一些指示(最好是具体的指示,因为我是这个高级安全编程的新手。

我只是尝试使用安全性完成基本用户登录注销到一个域,没有太复杂。

2 个答案:

答案 0 :(得分:5)

此答案主要针对密码哈希,而不是您的其他子问题。对于那些人,我的主要建议是不要重新发明轮子:使用与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时,您需要注意生成自己的salt字符串,并且在加密新密码时,请调用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等),因为这些可以是非常粗暴的-forced。

答案 1 :(得分:1)

如果不了解您的设置,很难具体。但是,你不应该做的一件事就是重新发明轮子。安全性很棘手,如果你的车轮缺少你可能不知道的东西,直到为时已晚。

如果您的Web框架附带了用于处理用户,登录和会话的模块/库/插件,我不会感到惊讶。阅读其文档并使用它:希望由对安全性有所了解的人编写。

如果您想知道它是如何完成的,请研究所述模块的文档和来源。