gpt4 book ai didi

python - 有没有办法加快 Django 中的身份验证功能?

转载 作者:太空狗 更新时间:2023-10-29 20:59:13 25 4
gpt4 key购买 nike

我们正在使用 django 为 mysql 制作一个 json webservice 前端。我们在 EC2 实例上运行 apache 和 django,在 RDS 实例上运行 MySQL。我们已经开始使用 apache bench 对性能进行基准测试,但得到了一些非常糟糕的性能数据。我们还注意到,在运行测试时,我们的 apache/django 实例在非常低的负载下 CPU 使用率达到 100%,而 MySQL 实例的 CPU 使用率从未超过 2%。

我们试图理解这一点并隔离问题,所以我们做了几个 ab 测试:

  • 来自 apache 的静态 html 页面请求——大约 2000 个请求/秒。
  • 在 django 中执行一个小的 python 函数的请求,没有数据库交互——大约 1000 个请求/秒。
  • 执行我们的 django webservice 函数之一的请求,该函数调用身份验证,然后执行非常简单的查询以从表中获取一条记录 -- 11 个请求/秒
  • 与 3 相同,但注释了对身份验证的调用——95 个请求/秒。

  • 为什么认证这么慢?它是将数据写入数据库,找到 pi 的十亿位数字,什么?

    我们希望在这些函数中保持对身份验证的调用,因为我们不想让任何可以猜测 url 的人都可以使用它们。它?

    非常感谢!

    最佳答案

    我不是身份验证和安全方面的专家,但以下是关于为什么会发生这种情况以及可能如何提高性能的一些想法。

    由于密码存储在数据库中,为了使其存储安全,不会存储明文密码,而是存储它们的哈希值。通过这种方式,您仍然可以通过将输入密码的计算哈希值与存储在数据库中的哈希值进行比较来验证用户登录。这提高了安全性,因此如果恶意方获得数据库的副本,解码明文密码的唯一方法是使用彩虹表或进行暴力攻击。

    这就是事情变得有趣的地方。根据摩尔定律,计算机的速度呈指数级增长,因此计算散列函数在时间上变得更便宜,尤其是像 md5 或 sha1 这样的快速散列函数。这带来了一个问题,因为将当今可用的所有计算能力与快速散列函数相结合,黑客可以相对容易地暴力破解散列密码。为了解决这个问题,可以做两件事。一种是多次循环散列函数(散列的输出被反馈到散列中)。然而,这并不是很有效,因为它只会将散列函数的复杂性增加一个常数。这就是为什么首选第二种方法的原因是使实际的哈希函数更复杂且计算成本更高。具有更复杂的功能,计算散列需要更多时间。即使需要一秒钟的时间来计算,对于最终用户来说也不是什么大问题,但对于蛮力攻击来说却是一个大问题,因为必须计算数百万个哈希值。这就是为什么从 Django 1.4 开始,它使用一个称为 PBKDF2 的计算成本非常高的函数。

    回到你的答案。正是因为这个功能,当你启用身份验证时,你的基准数字会急剧下降,而你的 CPU 会上升。

    以下是一些可以提高性能的方法。

  • 从 Django 1.4 开始,您可以更改默认身份验证功能 ( docs )。如果您不需要太多安全性,您可以将默认函数更改为 SHA1 或 MD5。这应该会提高性能,但请记住,安全性会弱得多。我个人的观点是安全性很重要,值得花额外的时间,但如果在您的应用程序中没有保证,您可能需要考虑一下。
  • 使用 session 。昂贵的散列函数仅在初始登录时计算。用户登录后,将为该 session 创建一个 session ,并向用户发送带有 session ID 的 cookie。然后在随后的请求中,用户上传一个 cookie,如果 session 尚未过期,用户将自动进行身份验证(不要担心安全性,因为 session 数据已签名......)。关键是与计算昂贵的哈希函数相比,验证 session 的计算成本要低很多。我猜在 ab 测试中你没有发送 session cookie。尝试通过发送 session cookie 来做一些测试,看看它是如何执行的。如果由于您正在制作 JSON API,因此发送 cookie 不是一个真正的选项,那么您可以修改 session 后端以通过 session GET 参数而不是 cookie 来接受 session 数据。但是不确定这样做的安全后果是什么。
  • 切换到 nginx。我不是部署专家,但根据我的经验,与 Apache 相比,nginx 对 Django 更快、更友好。我认为您可能会特别感兴趣的一个优势是 nginx 能够拥有多个工作进程,并且能够使用 proxy_pass 将请求传递给 Django 进程。如果您将有多个工作进程,您可以通过 proxy_pass 将每个工作进程指向一个单独的 Django 进程,这将有效地为 Django 添加多处理。另一种选择是,如果您使用 gevent WSGI 服务器之类的东西,您可以在 Django 进程中创建一个池,这也可能会提高性能。不确定这些是否会显着提高您的性能,因为您的 CPU 负载已经达到 100%,但可能需要研究一下。
  • 关于python - 有没有办法加快 Django 中的身份验证功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14470218/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com