python - 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 或者社区中的任何人都可以轻松解决这个问题?
如果您遇到此问题以及您决定做什么,请发表评论。
解决方案
我已经尝试过使用烧瓶安全性,试图让它在各种情况下为我工作。我不需要加快哈希速度,所以我可能没有一个直接的答案,所以我只能为你指出正确的方向。
编辑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
信息量挺大的,希望对大家有用。让我知道情况如何,因为我可能在不久的将来需要这个
推荐阅读
- ios - 当用于同时下载多个时,URLSessionDownloadTask 调用并不总是有效
- redirect - DELETE 请求在重定向时不会更改为 GET
- android - 为什么所有活动都可能关闭?
- postgresql - Flyway:关系不存在
- dashboard - Google Data Studio - 高级过滤器“特定品牌的客户还购买了哪些其他品牌”
- c - 为什么函数调用即使在调用之前没有定义也能工作?
- css - 如何在自动调整父级大小的同时在子级上使用 transform: translateY?
- javascript - 如何在子窗口的父窗口中运行脚本?
- javascript - 与nextjs在同一页面上链接页面
- javascript - JSON 不会被数组中的变量解析