Я обновляю Spring Security 4.x до 5.x.
ReflectionSaltSource
из Spring 4 позволяет нам настраивать пользовательскую соль.Но это удалено в Spring Security 5. Затем я обнаружил, что должен использовать MessageDigestPasswordEncoder
.У него длинный подробный java-документ, но, к сожалению, документ представляет собой пакет слов без передачи какой-либо структурированной информации (я пробовал несколько раз; плохо, если я был в неведении).
В любом случае, я думал, что должен сделать следующее, исходя из моего ограниченного понимания.
Старая система с 4.x - myEncodedPassword
и mySalt
передается отдельнокодировщик.
Новая система с 5.x - Передайте одно поле со значением {mySalt}myEncodedPassword
в MessageDigestPasswordEncoder
Однако это не сработало. Проблема заключалась в том, что когда MessageDigestPasswordEncoder
видит {mySalt}encodedPassword
, он использует {mySalt}
(с {}) в качестве соли вместо использования mySalt
в качестве соли.Я в замешательстве.
Вот пример кода.Я использовал Groovy для уменьшения шума.
@Grab(group='org.springframework.security', module='spring-security-core', version='5.1.4.RELEASE')
import org.springframework.security.crypto.password.MessageDigestPasswordEncoder
String password = 'myPassword'
String salt_1 = 'mySalt'
String salt_2 = '{mySalt}'
// http://www.lorem-ipsum.co.uk/hasher.php generated below hashes
String encodedPasswordWithSalt_1 = '57bc828628811a10496215e217b7ae9b714c859fc7a8b1c678c9a0cc40aac422'
String encodedPasswordWithSalt_2 = 'a18b53fc58843def1e08e00a718f40d6f8eda0b97ef97824b5078c1fad93c0c5'
MessageDigestPasswordEncoder encoder = new MessageDigestPasswordEncoder('SHA-256')
println "expected=true, actual=" + encoder.matches(password, "{${salt_1}}${encodedPasswordWithSalt_1}") // <--- expected to match but did not
println "expected=false, actual=" + encoder.matches(password, "{${salt_1}}${encodedPasswordWithSalt_2}") // <--- why does this match?
Вывод:
expected=true, actual=false
expected=false, actual=true
Я надеюсь найти способ поддержки SHA256 с помощью пользовательской и отдельной соли для каждого пароля пользователя.
Если кому-то интересно, я создал тикет на GitHub - https://github.com/spring-projects/spring-security/issues/6594.Пока нет решения.Я буду обновлять здесь, если есть.Так что это все еще без ответа вопрос.