Spring 5, базовая аутентификация и кодировщик паролей base64

#java #spring #spring-mvc #spring-security #basic-authentication

#java #spring #spring-mvc #spring-безопасность #базовая аутентификация

Вопрос:

Я использую spring 5 во всех своих проектах. Я хочу добавить базовую аутентификацию только с одним секретом / логином для одной конечной точки. (просто для запоминания, базовая аутентификация основана на запросе, который используется для аутентификации заголовка « Authorization : Basic ${encryptedInBase64('login:password')} «)

Моя проблема в том, что базовая аутентификация, инициализированная spring-web, шифрует login: secret с помощью кодировщика base64

НО

spring security больше не предлагает кодировщик паролей base64, «потому что уровень шифрования слишком низкий»

Быстрое решение было бы

  1. используйте устаревший Md4PasswordEncoder, который кодирует / декодирует в base64
  2. внедрите мой собственный класс «MtBase64PasswordEncoder», который делает то же самое.

Но ни один из них не кажется чистым.

Итак, мой вопрос: каков самый простой способ установить соединение с базовой аутентификацией между двумя проектами spring 5? Как spring ожидает, что мы будем выполнять базовую аутентификацию?

Ответ №1:

Из RFC «Basic Auth» (https://www.rfc-editor.org/rfc/rfc7617.txt ):

Этот документ определяет «базовую» схему аутентификации протокола передачи гипертекста (HTTP), которая передает учетные данные в виде пар идентификатор пользователя / пароль, закодированных с использованием Base64.

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

Base64 также не является «слабым», потому что это не шифрование, а просто кодировка. Это не лучше, чем обычный текст. Его все равно нужно закодировать, потому что и имя пользователя, и пароль могут содержать символы, которые не разрешены в заголовках HTTP.

Ответ №2:

API кодировщика паролей Spring предназначен для кодирования пароля перед сохранением в базе данных, например. Это не имеет ничего общего с базовой аутентификацией!

Базовая аутентификация должна использовать Base64 по определению, см. RFC 7617 . И он использует кодировку Base64 для имени пользователя и пароля.

Spring Security PasswordEncoder используется для создания своего рода хэша, который будет надежно храниться и использоваться позже для проверки пароля. Результат не должен быть незашифрованным, чтобы получить исходный пароль! Поэтому PasswordEncoder использование Base64 — плохая идея, поскольку вы всегда можете отменить декодирование содержимого.

С моей точки зрения, название PasswordEncoder вводит в заблуждение, и команда Spring должна была назвать его maybe PasswordHashFunction или подобным, чтобы уточнить его одностороннюю функциональность.

Если вы используете текущие версии Spring Security, помните о двух PasswordEncoder интерфейсах:

  • org.springframework.security.authentication.encoding.PasswordEncoder устарел
  • лучше использовать org.springframework.security.crypto.password.PasswordEncoder .