Что такое временная атака? Как защищаться в Spring Boot?

Spring Boot Spring
Что такое временная атака? Как защищаться в Spring Boot?

Недавно Сонг Гэ изучил исходный код Spring Security и нашел много интересного, поэтому он нашел время написать несколько статей и поделиться ими со своими друзьями.

Многие жалуются, что Spring Security тяжелее Shiro, этот тяжеловес не из воздуха, преимущество веса в том, что он обеспечивает более мощные функции защиты.

Например, кусок кода, который недавно видел Сонг Гэ:

protected final UserDetails retrieveUser(String username,
		UsernamePasswordAuthenticationToken authentication)
		throws AuthenticationException {
	prepareTimingAttackProtection();
	try {
		UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username);
		if (loadedUser == null) {
			throw new InternalAuthenticationServiceException(
					"UserDetailsService returned null, which is an interface contract violation");
		}
		return loadedUser;
	}
	catch (UsernameNotFoundException ex) {
		mitigateAgainstTimingAttack(authentication);
		throw ex;
	}
	catch (InternalAuthenticationServiceException ex) {
		throw ex;
	}
	catch (Exception ex) {
		throw new InternalAuthenticationServiceException(ex.getMessage(), ex);
	}
}

Этот код находится в классе DaoAuthenticationProvider.Чтобы облегчить ваше понимание, позвольте мне кратко описать контекст этого кода.

После того, как пользователь отправит имя пользователя и пароль для входа в систему, Spring Security должен запросить пользователя в базе данных в соответствии с именем пользователя, отправленным пользователем.Если вы не знакомы с этим, вы можете обратиться к предыдущей статье Songge:

  1. Как Spring Security хранит пользовательские данные в базе данных?
  2. Spring Security+Spring Data Jpa объединяют усилия, управление безопасностью становится еще проще!

Найдя объект пользователя, сравните разницу между паролем пользователя, найденным в базе данных, и паролем, предоставленным пользователем. Для конкретных сравнительных работ см.Две позиции шифрования паролей в Spring Boot!одна статья.

Приведенный выше код представляет собой Spring Security для запроса пользователя в базе данных в соответствии с именем пользователя, переданным при входе пользователя в систему, и возврата найденного пользователя. В методе также есть параметр аутентификации, в котором хранится информация об имени пользователя и пароле, передаваемая при входе пользователя в систему.

Так что же такого волшебного в этом коде?

Давайте проанализируем его построчно.

Сортировка исходного кода

1

Прежде всего, метод 1 вызывает метод prepareTimingAttackProtection Как видно из названия метода, это подготовка к защите от атаки по времени, так что же такое атака по времени? Не волнуйтесь, Сун Гэ объяснит это позже. Давай сначала, процесс окончен. Выполнение метода prepareTimingAttackProtection очень простое:

private void prepareTimingAttackProtection() {
	if (this.userNotFoundEncodedPassword == null) {
		this.userNotFoundEncodedPassword = this.passwordEncoder.encode(USER_NOT_FOUND_PASSWORD);
	}
}

Этот метод заключается в кодировании константы USER_NOT_FOUND_PASSWORD с помощью passwordEncoder (если вы не знаете passwordEncoder, вы можете обратиться кДве позиции шифрования паролей в Spring Boot!Одна статья), назначьте закодированный результат переменной userNotFoundEncodedPassword.

2

Затем вызовите метод loadUserByUsername, чтобы запросить пользователя в базе данных в соответствии с именем пользователя, переданным вошедшим в систему пользователем.Если он найден, будет возвращен найденный объект.

3

Если в процессе запроса возникает исключение UsernameNotFoundException, само собой разумеется, что исключение генерируется напрямую, и нет необходимости выполнять следующее сравнение паролей, поскольку по имени пользователя невозможно найти пользователя, этот вход в систему должен завершиться ошибкой. , и нет необходимости выполнять сравнение паролей.Правильная операция!

Но обратите внимание, что метод mitigateAgainstTimingAttack вызывается до создания исключения. Из названия этот метод имеет значение смягчения атак по времени.

Давайте посмотрим на поток выполнения этого метода:

private void mitigateAgainstTimingAttack(UsernamePasswordAuthenticationToken authentication) {
	if (authentication.getCredentials() != null) {
		String presentedPassword = authentication.getCredentials().toString();
		this.passwordEncoder.matches(presentedPassword, this.userNotFoundEncodedPassword);
	}
}

Видно, что сначала получается пароль, переданный вошедшим в систему пользователем, который представляет собой PresentPassword, а затем вызывается метод passwordEncoder.matches для выполнения операции сравнения паролей.Первоначально вторым параметром этого метода является пароль пользователя запрошен из базы данных, но теперь в базе данных нет запроса к пользователю, поэтому второй параметр заменяется на userNotFoundEncodedPassword, который представляет собой переменную, которая была назначена при первом вызове метода prepareTimingAttackProtection. Это сравнение паролей с самого начала обречено на неудачу, так зачем нам его сравнивать?

время атаки

Это подводит нас к сегодняшней теме — атакам по времени.

Атака по времени — это тип атаки по побочному каналу.В криптографии атака по побочному каналу также называется атакой по побочному каналу и атакой по побочному каналу.

Этот метод атаки не использует ни теоретические недостатки алгоритма шифрования, ни взлом методом грубой силы, а информацию, полученную от физической реализации криптографической системы. Например: дополнительные источники информации, такие как информация о времени, потребляемая мощность, электромагнитная утечка и т. д., которые можно использовать для дальнейшего расшифровки системы.

Существует несколько различных классификаций атак по побочным каналам:

  • Cache Side-Channel Attacks (Атаки по сторонним каналам кеша), получить некоторую конфиденциальную информацию в кеше, получив доступ к кешу, например, злоумышленник получает права доступа к физическому хосту облачного хоста и получает права доступа к хранилище.
  • Атака по времени (Атака по времени) делает вывод об операции операции, используемой во время работы устройства, или делает вывод, на каком устройстве хранения находятся данные, сравнивая время операции, или использует разницу во времени связи для кражи данных.
  • При обходной атаке, основанной на мониторинге энергопотребления, энергопотребление различных аппаратных схем одного и того же устройства также различается, поэтому энергопотребление программы при работе будет зависеть от того, какой аппаратный блок использует программа. в каком аппаратном блоке находится вывод данных, а затем украсть данные.
  • Электромагнитная атака (Электромагнитная атака), во время работы устройства происходит утечка электромагнитного излучения.После надлежащего анализа информация, содержащаяся в утечке электромагнитного излучения (например, текст, звук, изображение и т. д.), может быть проанализирована.Этот метод атаки не только используется для криптографии. В дополнение к атакам он также используется для перехвата действий, таких как некриптографические атаки, такие как атаки TEMPEST.
  • Акустический криптоанализ, который фиксирует информацию путем захвата акустического сигнала, просачиваемого устройством во время работы (аналогично анализу мощности).
  • Дифференциальный анализ ошибок, скрытые данные обнаруживаются, когда программа запускается с ошибкой и выводит сообщение об ошибке.
  • Остаточное хранение данных, которое позволяет прочитать конфиденциальные данные, которые должны быть удалены (например, атаки с холодной загрузкой).
  • Атаки с ошибкой инициализации программного обеспечения в настоящее время относительно редки. Примером такого типа атаки является молоток строки. В этой реализации атаки область памяти рядом с запрещенной ячейкой памяти будет иметь состояние, если к ней часто обращаются. Риск потери зарезервирован. .
  • Оптические средства, то есть секретные данные захватываются некоторыми визуальными оптическими приборами (такими как камеры высокой четкости, камеры высокой четкости и т. д.).

Все типы атак используют преимущества системы шифрования/дешифрования, в которой алгоритмическая логика операции шифрования/дешифрования не является ошибочной, но предоставляет полезную дополнительную информацию посредством физических эффектов (это также является причиной так называемого «обхода»). "), и эта физическая информация часто содержит секретные данные, такие как ключи, пароли и зашифрованные тексты.

Код в Spring Security выше предназначен для предотвращения атак по времени.

Как это делается? Предполагая, что Spring Security выдает исключение, не находя информацию о пользователе в базе данных, и не выполняет метод mitigateAgainstTimingAttack, после большого количества тестов и статистического анализа хакер обнаружит, что некоторые проверки входа в систему занимают значительно меньше времени, чем другие входы в систему. затем сделайте вывод, что пользователи с коротким временем проверки входа в систему являются несуществующими пользователями, а пользователи, которые входят в систему с более длительным временем, являются пользователями, которые существуют в базе данных.

Теперь в Spring Security, выполняя метод mitigateAgainstTimingAttack, независимо от того, существует пользователь или нет, время проверки входа в систему не будет существенно отличаться, что позволяет избежать атак по времени.

Некоторые друзья могут спросить, сколько времени занимает выполнение метода passwordEncoder.matches? Это зависит от того, как вы измеряете время, чем меньше единица времени, тем больше разница: миллисекунды (мс), микросекунды (мкс), наносекунды (нс), пикосекунды (пс), фемтосекунды (фс), аттосекунды ( as) и зигзагообразные секунды (zs).

Кроме того, для безопасности Spring Security вводит концепцию, называемую адаптивной односторонней функцией в passwordEncoder, Эта функция намеренно медленная для выполнения и потребляет много системных ресурсов, поэтому она очень необходима для защиты от атак по времени.

Что касается адаптивной односторонней функции, это совсем другая история.Сун Гэ нашел время, чтобы поболтать со своими друзьями~

Что ж, сегодня я буду много болтать со своими друзьями. Если друзья решат что-то получить, не забудьте нажать и подбодрить Сонге~

Прежде чем вы это узнаете, 49 статей из серии Spring Security были сериализованы.Заинтересованные друзья также могут прочитать другие статьи из этой серии:

  1. Выкопайте большую яму и позвольте Spring Security сделать это!
  2. Song Ge поможет вам начать работу с Spring Security, не спрашивайте, как снова расшифровать пароль.
  3. Научите, как настроить вход в форму в Spring Security
  4. Spring Security разделяет внешний и внутренний интерфейсы, давайте не будем переходить по страницам! Все взаимодействия JSON
  5. Операции авторизации в Spring Security оказались такими простыми
  6. Как Spring Security хранит пользовательские данные в базе данных?
  7. Spring Security+Spring Data Jpa объединяют усилия, управление безопасностью становится еще проще!
  8. Spring Boot + Spring Security реализует функцию автоматического входа в систему
  9. Spring Boot автоматически входит в систему, как контролировать риски безопасности?
  10. В проекте микросервиса, где Spring Security лучше, чем Shiro?
  11. Два способа для Spring Security настроить логику аутентификации (расширенный игровой процесс)
  12. Как быстро просмотреть IP-адрес пользователя для входа и другую информацию в Spring Security?
  13. Spring Security автоматически удаляет предыдущего пользователя, вошедшего в систему, одна конфигурация выполнена!
  14. Spring Boot + Vue разделяет интерфейсные и серверные проекты, как выгнать вошедших в систему пользователей?
  15. Spring Security поставляется с собственным брандмауэром! Вы даже не представляете, насколько безопасна ваша система!
  16. Что такое атака с фиксацией сеанса? Как защититься от атак фиксации сеанса в Spring Boot?
  17. Развертывание кластера, как Spring Security обрабатывает совместное использование сеансов?
  18. Song Ge учит вас, как защищаться от CSRF-атак в SpringBoot! так легко!
  19. Учиться учиться досконально! Анализ исходного кода защиты от CSRF в Spring Security
  20. Две позиции шифрования паролей в Spring Boot!
  21. Как изучить Spring Security? Почему необходимо учиться систематически?
  22. Spring Security имеет две стратегии выпуска ресурсов, не используйте их неправильно!
  23. Song Ge научит вас, как начать работу с единым входом Spring Boot + CAS
  24. Spring Boot реализует третье решение для единого входа!
  25. Единый вход Spring Boot + CAS, как подключиться к базе данных?
  26. Страница входа в Spring Boot + CAS по умолчанию слишком уродлива, что мне делать?
  27. Используя Swagger для тестирования интерфейса, как перенести токен в заголовок запроса?
  28. Краткое изложение трех междоменных сценариев в Spring Boot
  29. Как реализовать HTTP-аутентификацию в Spring Boot?
  30. Четыре метода управления разрешениями в Spring Security
  31. Spring Security сосуществует с несколькими схемами шифрования и интегрирует старые и изношенные системы!
  32. Магия! Новые объекты также могут управляться контейнером Spring!
  33. Как понять и в конфигурации Spring Security?
  34. Получите механизм обработки исключений Spring Security в одной статье!
  35. После стольких лет написания кода я впервые вижу такой метод входа!
  36. Может ли Spring Security иметь несколько цепочек фильтров одновременно?
  37. Может ли Spring Security одновременно подключаться к нескольким пользовательским таблицам?
  38. В Spring Security я просто хочу получить информацию для входа пользователя из дочернего потока, что мне делать?
  39. Глубокое понимание FilterChainProxy [исходный код]
  40. Глубокое понимание SecurityConfigurer [исходный код]
  41. Глубокое понимание HttpSecurity [исходный код]
  42. Глубокое понимание AuthenticationManagerBuilder [исходный код]
  43. Поиграйте в Spring Security, возможно, вы еще не видели такого определяемого пользователем способа!
  44. Глубокое понимание WebSecurityConfigurerAdapter [исходный код]
  45. Перечень восьми классических шаблонов проектирования в среде Spring Security.
  46. Расчесывание процесса инициализации Spring Security
  47. Почему вы используете устаревший Spring Security OAuth? Брат Сун, иди и потрахайся со всеми!
  48. Странная проблема со входом