我正在使用 Flask Security 创建安全的 API。 我最近发现使用@auth_token_required 会使我对后端的每个 调用花费大约50 倍 的时间。 HTTPS 调用时间从每个请求 100 毫秒增加到 5 秒以上。 将 @auth_token_required 替换为 @login_required 可解决此问题。
我在 Github 上找到了这个帖子:Slow token authentication描述了围绕这个问题的问题和沮丧。
这似乎是有意的安全限制的一部分,但对我来说,将每个请求放慢 50 倍似乎很疯狂。我需要离开 Flask Security 并实现 OAuth 还是社区中的任何人都有一个轻松解决此问题?
如果您遇到此问题以及您决定做什么,请发表评论。
最佳答案
我试过 flask-security,试图让它在各种情况下为我工作。我不需要加速哈希,所以我可能没有直接的答案,所以我可能只会为您指明正确的方向。
编辑 github 中的官方 flask 安全性是 this .我在下面使用的链接指向我的 fork ,它有几个改动,所以如果你需要 fork ,请 fork 官方的
1) Flask-Security 使用 passlib 进行哈希处理
2) 如您共享的链接中所述,Flask-Security 使用 bcrypt,它有意变慢
3) Bcrypt 使用工作因数来确定散列数据所需的时间。在 passlib 中,工作因子由称为 rounds 的 int 变量表示
4 为了散列数据,flask security 在 flask-security/utils.py 中使用了以下函数
def hash_data(data):
return _hashing_context.hash(encode_string(data))
5 验证您的散列数据(例如 token )它在同一个文件中使用此函数
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 并且根据 docs将一轮增加双倍花费的时间
由于 Flask 安全性中 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
所以你需要 fork 安全性,将你的回合更改为适合你的数字并像这样安装你的 repo
pip install git+https://github.com/your_repo/flask-security
信息量太大了,希望对大家有用。 让我知道进展如何,因为在不久的将来我可能需要它
关于python - Flask 安全性令人难以置信地减慢了所有 https 流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50374614/