Безопасность Flask невероятно замедляет весь трафик https - PullRequest
0 голосов
/ 16 мая 2018

Я использую Flask Security для создания безопасного API. Недавно я обнаружил, что использование @auth_token_required делает каждый , один из моих вызовов на сервер занимает примерно 50 раз дольше. Время вызова Https увеличено с 100 мс на запрос до 5+ секунд. Замена @auth_token_required на @login_required устраняет проблему.

Я нашел эту тему на Github: Медленная аутентификация токена , которая описывает проблему и разочарование вокруг этой проблемы.

Похоже, что это является частью преднамеренного ограничения безопасности, но мне кажется безумным замедлять каждый запрос в 50 раз. Нужно ли мне уходить из Flask Security и внедрять OAuth или у кого-то в сообществе есть легко решить эту проблему?

Пожалуйста, прокомментируйте, если вы столкнулись с этой проблемой и что вы решили сделать.

1 Ответ

0 голосов
/ 16 мая 2018

Я немного поиграл с флеш-защитой, пытаясь заставить меня работать в различных сценариях. Мне не нужно было ускорять хэш, поэтому у меня может не быть прямого ответа, поэтому я могу лишь указать вам правильное направление.

РЕДАКТИРОВАТЬ Официальная защита фляги в github: this . Ссылки, которые я использовал ниже, указывают на мой форк, который имеет несколько изменений, так что, если вам нужно форкать, форк официальный

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 и согласно документам , увеличивающим округление на единицу 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

Это довольно много информации, надеюсь, это будет как-то полезно. Дайте мне знать, как это происходит, поскольку мне это может понадобиться в недалеком будущем

...