Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder) / 14 сообщений из 14, страница 1 из 1
28.04.2016, 16:24
    #39226800
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
Коллеги подскажите плз, не могу понять.
написал два теста чтобы понять как работат кодировщик.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	private String plainPassword = "admin";
	
	@Test
	public void bCryptPasswordEncoder_test_1(){
		PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
		String encodedPassword = passwordEncoder.encode(plainPassword);
		System.out.println(encodedPassword);
	}

	@Test
	public void bCryptPasswordEncoder_test_2(){
		PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
		String encodedPassword = passwordEncoder.encode(plainPassword);
		System.out.println(encodedPassword);
	}


Результат:
Код: java
1.
2.
$2a$10$rLXvwF4zmfkiABm/mpBsluMISlRJKcHeM/zxFWSiETUEqlVxquajC
$2a$10$O45D79ruNx5oYpUIFFjhN./pbAvirosQorUORERwo1pYP3kn1zika



Вот я не понимаю, как нужно использовать кодировщик. Допустим клиент задал новый паспорт. Я его кодирую

Код: java
1.
hashedPassword = passwordEncoder.encode(plainPassword)


и сохраняю результат в базу. Потом клиент логинится со своим паспортом. Я вытаскиваю для него значение из БД и сравниваю:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	@Autowired
	private PasswordEncoder passwordEncoder;

       protected void additionalAuthenticationChecks(UserDetails userDetail, UsernamePasswordAuthenticationToken authentication){
                     String hashedPassword = authentication.getCredentials().toString(); // для простоты в реальности такой вызов  => dao.getPasswordFor(sessionUser.getId());
                     String plainSessionPassword = userDetails.getPassword();
                     if(passwordEncoder.match(plainSessionPassword, hashedPassword)){
                             throw new BadCredentialsException("bad credential");
                     }

      }



т.е. я тесты специально положил в надежде увидеть что BCryptPasswordEncoder генерит один и тот же хэш, но это не так. Естественно проверка тоже не работает.

Что я не понимаю или что делаю не правильно ?

заранее благодарен.
...
Рейтинг: 0 / 0
28.04.2016, 16:31
    #39226805
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
В одном из конструкторов у него есть зависимость от SecureRandom. Это заставляет
думать что инстанциирование BCryptPasswordEncoder() - более сложное чем мы
себе представляем.
...
Рейтинг: 0 / 0
28.04.2016, 16:33
    #39226809
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
kadetЧто я не понимаю или что делаю не правильно ?

То что хэши нужно " подсаливать ".
...
Рейтинг: 0 / 0
28.04.2016, 16:38
    #39226819
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
kadetЕстественно проверка тоже не работает.
Test case с неработающей проверкой в студию!
...
Рейтинг: 0 / 0
28.04.2016, 16:38
    #39226820
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
maytonВ одном из конструкторов у него есть зависимость от SecureRandom. Это заставляет
думать что инстанциирование BCryptPasswordEncoder() - более сложное чем мы
себе представляем.

я тогда вообще не понимаю как это использовать?

Логически если один генератор используется для создания хэш-кода, то он же должен использоваться для сравнения, или не так ? Как тогда по уму сделать ?
...
Рейтинг: 0 / 0
28.04.2016, 16:40
    #39226822
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public class PasswordEncoderTest {
	@Test
	public void standardPasswordEncoder_test(){
		PasswordEncoder passwordEncoder = new StandardPasswordEncoder("secret");
		String password = "admin";
		String encodedPassword = passwordEncoder.encode(password);
		System.out.println(encodedPassword);
	}

	@Test
	public void standardPasswordEncoder_test_2(){
		PasswordEncoder passwordEncoder = new StandardPasswordEncoder("secret");
		String password = "admin";
		String encodedPassword = passwordEncoder.encode(password);
		System.out.println(encodedPassword);
	}

	private String plainPassword = "admin";
	private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
	
	@Test
	public void bCryptPasswordEncoder_test_1(){
		String encodedPassword = passwordEncoder.encode(plainPassword);
		System.out.println(encodedPassword);
	}

	@Test
	public void bCryptPasswordEncoder_test_2(){
		String encodedPassword = passwordEncoder.encode(plainPassword);
		System.out.println(encodedPassword);
	}
}
...
Рейтинг: 0 / 0
28.04.2016, 16:40
    #39226823
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
kadet,

Немного не понятно зачем городить этот огород кодируя и сравнивая пароли вручную, если Spring Security это и так умеет?
...
Рейтинг: 0 / 0
28.04.2016, 16:42
    #39226825
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
...
Рейтинг: 0 / 0
28.04.2016, 16:43
    #39226828
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
kadet
Код: java
1.
public class PasswordEncoderTest {


Не вижу ни одного assert для метода match().
Тесты нужны не для того чтобы в sout писать.
...
Рейтинг: 0 / 0
28.04.2016, 16:46
    #39226832
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
Автор не знаю откуда ты копипастил но там другой метод

Код: java
1.
public boolean matches(CharSequence rawPassword,  String encodedPassword)



Пробуй его.
...
Рейтинг: 0 / 0
28.04.2016, 16:53
    #39226837
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
kadet
Код: java
1.
2.
3.
if(passwordEncoder.match(plainSessionPassword, hashedPassword)){
                             throw new BadCredentialsException("bad credential");
}



Метод match() откуда взялся?
...
Рейтинг: 0 / 0
28.04.2016, 17:12
    #39226858
kadet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
Мужики !

я входные параметры местами перепутал у метода "passwordEncoder.matchs()". Теперь все работает.

набросал вот это
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
	private String plainPassword = "admin";
	private PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
	
	@Test
	public void bCryptPasswordEncoder_test_1(){
		String encodedPassword = passwordEncoder.encode(plainPassword);
		Assert.assertTrue(passwordEncoder.matches(plainPassword, encodedPassword));
		System.out.println(encodedPassword);
		
		String encodedPassword_2 = passwordEncoder.encode(plainPassword);
		Assert.assertTrue(passwordEncoder.matches(plainPassword, encodedPassword));
		System.out.println(encodedPassword_2);
		
		String encodedPassword_3 = passwordEncoder.encode(plainPassword);
		Assert.assertTrue(passwordEncoder.matches(plainPassword, encodedPassword_2));
		System.out.println(encodedPassword_3);
		
		String encodedPassword_4 = passwordEncoder.encode(plainPassword);
		Assert.assertTrue(passwordEncoder.matches(plainPassword, encodedPassword_3));
		System.out.println(encodedPassword_4);
	}



и удивился, что не смотря на то что "encode" выдает каждый раз новое значение, тем не менее assertTrue работает. Мне это странно, но главное assert глотает.


я извиняюсь, чуть крыша не съехала


спасибо:
Blazkowicz
mayton
...
Рейтинг: 0 / 0
28.04.2016, 17:15
    #39226864
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
Пжлст.
...
Рейтинг: 0 / 0
28.04.2016, 22:12
    #39227068
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder)
И тесты надо по другому писать. То что ты написал - не тест.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / не понимаю работу spring PasswordEncoder (BCryptPasswordEncoder) / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]