По сути, для генерации хеша BCryptPasswordEncoder
требуется необработанный пароль (1), соль (2) и количество раундов (3).Последние два можно определить по закодированному паролю.Это облегчает создание того же хэша.Следовательно, нет проблем с сопоставлением необработанного пароля с зашифрованным.
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
for (int i = 0; i < 10; ++i) {
String encodedPassword = encoder.encode("123");
System.out.println(encodedPassword + " " + encoder.matches("123", encodedPassword));
}
Этот фрагмент дает вам различные хэши, но во всех случаях true
для encoder.matches("123", hashOf123)
:
$2a$10$.KLpQ8ESFuWo.lNMN.J3QeUPM2sl5PrGZ1PNortSIUaRxs4T4sN.6 true
$2a$10$Fl7QAFiYKYDcnW28Rg8mMOrrCSIz9eLAkJ2kokXs2LVyV9C1GYJM. true
...
$2a$10$qTXWvu0jEf7kM8DF7HD.fu0qu.kFJID8OmlXLm/6XJUJdA1Dje4vq true
Убедитесь, что пароль, хранящийся в базе данных, был закодирован тем же алгоритмом (и той же версией), который вы используете для сравнения.В противном случае вы можете получить исключение или неверный результат.