Spring как сопоставить пароль bcrypt неблокирующим способом - PullRequest
1 голос
/ 03 августа 2020

Привет, я создаю api отдыха, используя webflux для учебных целей, и я застрял с совпадениями паролей bcrypt на странице входа.

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

Ниже мой код

.filter(user -> {
    long s = System.currentTimeMillis();
    boolean matches = bCryptPasswordEncoder.matches(loginRequest.getPassword(), user.getPassword());
    long e = System.currentTimeMillis();
    System.out.println(e-s);
    return matches;
})

Все мое время отклика api составляет 70 мс, а время diff печатает 62, 63, это означает, что совпадения замедляют все мое приложение. что, если я получу 50 запросов на вход за раз. Интересно, как правильно сделать это неблокирующим способом.

1 Ответ

3 голосов
/ 04 августа 2020

Операция «блокируется», когда ЦП по существу простаивает, ожидая завершения чего-то еще, прежде чем он сможет продолжить работу. Это может быть сетевой запрос, доступ к диску, временная задержка и т. Д. c.

То, что у вас здесь, не то, поэтому это не операция блокировки. Вместо этого у вас есть операция с интенсивным использованием ЦП , которая является сутью BCrypt (вкратце, проверка правильности пароля намеренно затруднена для предотвращения атак методом грубой силы.)

Там нет способа ускорить это «бесплатно» (иначе вы сломаете BCrypt), но есть несколько подходов, которые вы можете предпринять в зависимости от ситуации. От «наименьшей работы» до «наибольшей работы»:

  • Это 70 мсек, что для целей тестирования / обучения нормально. Не зацикливайтесь на деталях, просто примите это в этой ситуации.
  • Распараллеливайте поток, вызывая parallel() и subscribeOn(Schedulers.parallel()), чтобы ваша реактивная цепочка использовала все ядра ЦП. Вероятно, это наиболее разумный вариант для сценария «обучения и развития».
  • Добавьте больше оборудования для решения проблемы, если это проблема, например, контейнеризация и использование Kubernetes или аналогичное автоматическому масштабированию по запросу.
  • Переведите работу BCrypt в отдельный микросервис, автоматически масштабируйте его по мере необходимости, а затем обработайте проверку пароля неблокирующим образом, вызвав этот микросервис (и используя flatMap().)
...