Как использовать Spring StandardPasswordEncode и получить соль?

Как зашифровать пароль вставить его в БД и после сравнения когда он захочет подключиться?

Я бы использовал StandardPasswordEncoder Spring security 3.1.4, чтобы зашифровать свой пароль и вставить его в базу данных. Но как восстановить соль, полученную этим методом?

Вот пример безопасности документа Spring:

StandardPasswordEncoder encoder = new StandardPasswordEncoder("secret");
String result = encoder.encode("myPassword");
assertTrue(encoder.matches("myPassword", result));

Я спросил ее, потому что мне понадобится порядок выбора, чтобы перекодировать пароль для сравнения? И проверить, должен ли пользователь вводить правильный пароль?

Вот кодировка пароля: 9e7e3a73a40871d4b489adb746c31ace280d28206dded9665bac40eabfe6ffdc32a8c5c416b5878f и я бы сравнил кодировку нового пароля

Ссылка на Doc Spring: http://docs.spring.io/spring-security/site/docs/3.1.4.RELEASE/reference/crypto.html Link API SPring security 3.1.4: http://docs.spring.io/spring-security/site/docs/3.1.4.RELEASE/apidocs/


person MaximeF    schedule 20.10.2013    source источник
comment
Вы не можете изменить сохраненный пароль как удобочитаемый.   -  person Prabhakaran Ramaswamy    schedule 20.10.2013
comment
Как зашифровать пароль вставить его в БД и после сравнения когда он захочет подключиться?   -  person MaximeF    schedule 20.10.2013
comment
В качестве отступления я рекомендую BCryptPasswordEncoder   -  person farrellmr    schedule 11.01.2017


Ответы (2)


Я думаю, вы спрашиваете, как это работает?? Ответ довольно прост. StandardPasswordEncoder.matches() — это метод, который вы хотите использовать. За кулисами StandardPasswordEncoder расшифрует хешированный пароль и извлечет соль из полученного массива байтов. Затем он будет использовать эту соль для хеширования пароля в виде простого текста, который вы передали. Если полученный хэш совпадает с исходным хэшем, ваши пароли совпадают! Подробную информацию о StandardPasswordEncoder.matches() см. в источнике:

public boolean matches(CharSequence rawPassword, String encodedPassword) {
    byte[] digested = decode(encodedPassword);
    byte[] salt = subArray(digested, 0, saltGenerator.getKeyLength());
    return matches(digested, digest(rawPassword, salt));
}
person MattSenter    schedule 20.10.2013
comment
Чтобы уточнить, декодирование означает преобразование шестнадцатеричной строки в байты. - person Warren Dew; 22.04.2014

Вы не можете изменить сохраненный пароль как удобочитаемый.

предположим, что myPassword ="9e7e3a73a40871d4b489adb746c31ace280d28206dded9665bac40eabfe6ffdc32a8c5c416b5878f" присутствует в базе данных.

Вы можете сделать так

StandardPasswordEncoder encoder = new StandardPasswordEncoder("secret");
String result = encoder.encode("myPassword");

now your result is equal to `9e7e3a73a40871d4b489adb746c31ace280d28206dded9665bac40eabfe6ffdc32a8c5c416b5878f` 

String passworddb = getPasswordFromDB();

passworddb from daabase is `9e7e3a73a40871d4b489adb746c31ace280d28206dded9665bac40eabfe6ffdc32a8c5c416b5878f`

assertTrue(encoder.matches(passworddb, result)); then passworddb and result are equal.
person Prabhakaran Ramaswamy    schedule 20.10.2013