Почему MessageDigestPasswordEncoder Spring принимает `{}` в соль? Пример в его javadoc не похоже на работу - PullRequest
0 голосов
/ 06 марта 2019

Я обновляю 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.Пока нет решения.Я буду обновлять здесь, если есть.Так что это все еще без ответа вопрос.

1 Ответ

2 голосов
/ 13 марта 2019

Я полагаю, что проблема в org.springframework.security.crypto.password.MessageDigestPasswordEncoder классе

Отладкой в ​​методе private String extractSalt(String prefixEncodedPassword) они пытаются извлечь соль, возвращая prefixEncodedPassword.substring(start, end + 1);, где start - индекс префикса { в то время как конец - это индекс суффикса }, и он останавливается на первом суффиксе, который ему соответствует, так что происходит в вашем коде?

Это происходит так:

MessageDigestPasswordEncoder encoder = new MessageDigestPasswordEncoder('SHA-256')
println "expected=true, actual=" + encoder.matches(password, "{${salt_1}}${encodedPasswordWithSalt_1}") //It's not matched because the extracted salt will be {mySalt} and not mySalt
println "expected=false, actual=" + encoder.matches(password, "{${salt_1}}${encodedPasswordWithSalt_2}") //It's matched because the extracted salt will be {mySalt} and not mySalt

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

private String extractSalt(String prefixEncodedPassword) {
        int start = prefixEncodedPassword.indexOf(PREFIX);
        if (start != 0) {
            return "";
        }
        int end = prefixEncodedPassword.indexOf(SUFFIX, start);
        if (end < 0) {
            return "";
        }
        return prefixEncodedPassword.substring(start, end + 1);
    }

Этот метод находится внутри org.springframework.security.crypto.password.MessageDigestPasswordEncoder класса

Надеюсь, это полезно

Анджело

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...