#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, «потому что уровень шифрования слишком низкий»
Быстрое решение было бы
- используйте устаревший Md4PasswordEncoder, который кодирует / декодирует в base64
- внедрите мой собственный класс «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
.