Безопасность Flask невероятно замедляет весь трафик https
Я использую Flask Security для создания безопасного API. Недавно я обнаружил, что использование @auth_token_required заставляет каждый из моих вызовов к серверу занимать примерно в 50 раз больше времени. Время вызова Https увеличено с 100 мс на запрос до 5+ секунд. Замена @auth_token_required на @login_required устраняет проблему.
Я нашел эту тему на Github: медленная аутентификация токенов, которая описывает проблему и разочарование вокруг этой проблемы.
Кажется, что это является частью преднамеренного регулирования безопасности, но мне кажется безумным замедлять каждый запрос в 50 раз. Нужно ли мне отойти от Flask Security и внедрить OAuth, или у кого-то в сообществе есть простое решение? Эта проблема?
Пожалуйста, прокомментируйте, если вы столкнулись с этой проблемой и что вы решили сделать.
1 ответ
Я немного поиграл с колбами, пытаясь заставить меня работать в разных ситуациях. Мне не нужно было ускорять хэш, поэтому у меня может не быть прямого ответа, поэтому я могу лишь указать вам правильное направление.
РЕДАКТИРОВАТЬ Официальная безопасность фляги в GitHub это. Ссылки, которые я использовал ниже, указывают на мой форк, который имеет несколько изменений, так что, если вам нужно форкать, форк официальный
1) Flask-Security использует passlib для хеширования
2) Как указано в ссылке, которой вы поделились, Flask-Security использует bcrypt, который намеренно медленно
3) Bcrypt использует коэффициент работы, чтобы определить, сколько времени вы хотите, чтобы он хэшировал данные. В passlib рабочий фактор представлен переменной int, которая называется rounds
4 Для хеширования данных безопасность колб использует нижеуказанную функцию в 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 получен из passlib в flask-security/core.py, как это в разных местах файла
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)
CryptContext, импортированный из passlib и использованный в шестом выше, может принимать другой аргумент, который округляет число от 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
Это довольно много информации, я надеюсь, что это будет как-то полезно. Дайте мне знать, как это происходит, поскольку мне это может понадобиться в недалеком будущем.