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

She*_*kan 4 python security authentication login web-applications

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

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

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

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

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

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

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

Eli*_*ins 5

这个答案主要解决密码哈希问题,而不是你的其他子问题.对于那些人,我的主要建议是不要重新发明轮子:使用与GAE配合良好的现有框架.它提供的Django的内置部署,而且还具有内置安装的WebOb的,所以各种基于的WebOb的框架(金字塔,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加密中.

或者,您可以使用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)
Run Code Online (Sandbox Code Playgroud)

注意:如果关心密码安全性,无论你做什么,都不要使用单个HASH(盐+密码)算法(例如Django,PHPass等),因为这些算法可能非常粗暴.


Pet*_*rin 1

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

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

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

  • 另一方面,我的观点是:如果您想要高级安全性,*不要*从头开始编写。已经做过足够多次了。从专家的工作中受益。(如果缺少任何东西,您可以为改善现有系统做出贡献 - 并让您的贡献得到审查。)您无法阅读 GAE 的代码;您可以阅读 GAE 的代码。但您可以选择 Django(直接使用,或了解它是如何完成的)。我也不明白在 GAE 托管的网站上注册比在 Google 本身注册更好……但是已经够火了。如果重新发明轮子是您的要求,那么我的回答对您没有帮助。 (3认同)