首页 > 解决方案 > Flask 安全性令人难以置信地减慢了所有 https 流量

问题描述

我正在使用 Flask Security 来创建安全 API。我最近发现,使用 @auth_token_required 会使我对后端的每次调用都花费大约50 倍的时间。Https 调用时间从每个请求 100 毫秒增加到 5 秒以上。将 @auth_token_required 替换为 @login_required 可解决此问题。

我在 Github 上找到了这个线程:Slow token authentication描述了这个问题和围绕这个问题的挫败感。

这似乎是有意的安全限制的一部分,但对我来说将每个请求减慢 50 倍似乎很疯狂。我是否需要离开 Flask Security 并实施 OAuth 或者社区中的任何人都可以轻松解决这个问题?

如果您遇到此问题以及您决定做什么,请发表评论。

标签: pythonflaskflask-loginflask-security

解决方案


我已经尝试过使用烧瓶安全性,试图让它在各种情况下为我工作。我不需要加快哈希速度,所以我可能没有一个直接的答案,所以我只能为你指出正确的方向。

编辑github 中的官方烧瓶安全性是这样的。我在下面使用的链接指向我的叉子,它有几个改动,所以如果你需要叉子,叉官方的

1) Flask-Security 使用 passlib 进行散列

2)如您共享的链接中所述,Flask-Security 使用 bcrypt 故意慢

3) Bcrypt 使用工作因子来确定您希望散列数据需要多长时间。在 passlib 中,工作因子由称为 rounds 的 int 变量表示

4 为了散列数据,flask 安全使用以下函数在flask-security/utils.py

def hash_data(data):
    return _hashing_context.hash(encode_string(data))

5 验证您的散列数据(例如令牌)它在同一个文件中使用此函数

def verify_hash(hashed_data, compare_data):
    return _hashing_context.verify(encode_string(compare_data), hashed_data) 

6) hashing_context 是从flask-security/core.py 中的 passlib 派生的,就像在文件的各个地方一样

from passlib.context import CryptContext

def _get_hashing_context(app):
    schemes = cv('HASHING_SCHEMES', app=app)
    deprecated = cv('DEPRECATED_HASHING_SCHEMES', app=app)
    return CryptContext(
        schemes=schemes,
        deprecated=deprecated)

hashing_context=_get_hashing_context(app),

最后在 utils.py 中(之前的分享是这样的)

_hashing_context = LocalProxy(lambda: _security.hashing_context)

从 passlib 导入并在上面的六个中使用的 CryptContext 可以采用另一个参数,该参数是 4 到 31 之间的数字,默认情况下,它是 12,并且根据文档将回合增加一倍所需的时间

由于 CryptContext 在烧瓶安全性中没有传递给它的舍入值,我假设它使用默认值 12,因此您可以尝试各种数字来查看它是如何进行的。就像是

def _get_hashing_context(app):
        schemes = cv('HASHING_SCHEMES', app=app)
        deprecated = cv('DEPRECATED_HASHING_SCHEMES', app=app)
        return CryptContext(
            schemes=schemes,
            deprecated=deprecated,
            pbkdf2_sha256__default_rounds=your_rounds) #I added this line

因此,您将需要分叉安全性,将您的回合更改为适合您的数字并像这样安装您的回购

pip install git+https://github.com/your_repo/flask-security

信息量挺大的,希望对大家有用。让我知道情况如何,因为我可能在不久的将来需要这个


推荐阅读