【问题标题】:Flask security incredibly slowing all https trafficFlask 安全性令人难以置信地减慢了所有 https 流量
【发布时间】:2018-10-26 17:28:59
【问题描述】:

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

我在 Github 上找到了这个帖子:Slow token authentication,它描述了这个问题的问题和挫败感。

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

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

【问题讨论】:

    标签: python flask flask-login flask-security


    【解决方案1】:

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

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

    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 导入并用于上述 6 的 CryptContext 可以采用另一个参数,即在 4 到 31 之间舍入一个数字,默认为 12,根据docs 将舍入增加一 DOUBLES花费的时间

    由于 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
    

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

    【讨论】:

    • 感谢摩西,这绝对是迈向应许之地的一步。我希望有一些我缺少的开箱即用的东西,或者快速修复。我认为,当更新和更改可用时,将来分叉安全存储库可能会出现问题。在这种情况下,我可能更愿意使用 OAuth2,但仍在探索选项。
    • @TacoEater 我将尝试为将来的版本提出功能请求,并允许 api 注册和登录(没有 CSRF 令牌),这也是我必须在 fork 中实现的。我希望这些可以在未来的版本中提供
    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2016-12-10
    • 2013-11-21
    • 2014-12-28
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多