Как использовать jBCrypt для сравнения хэшей паролей?
У меня возникают проблемы при получении пароля в виде открытого текста и предыдущего хеш-кода для сопоставления с использованием метода BCrypt checkpw(plaintextpw, previoushash).
В регистрационном сервлете я беру введенный пароль, хэширую его с помощью метода BCrypt hashpw(password, genSalt) и сохраняю его в БД.
В сервлете входа я беру этот хеш из базы данных и использую команду checkryp BCrypt, чтобы проверить, соответствует ли он введенному паролю.
Это никогда не совпадает. Это прекрасно работает в моем обычном Java-приложении, но не в веб-приложении. Ни у кого больше нет этой проблемы, поэтому я полагаю, что я делаю это неправильно:
//RegisterServlet
String pw_hash = BCrypt.hashpw(request.getParameter("password"), BCrypt.gensalt());
String loginInsertString = "insert into login (loname,lopassword,locustomerid)" +
" VALUES ('" + username + "','" + pw_hash + "','" + loginInsert + "');";
//LoginServlet
ResultSet rs = stmt.executeQuery("select lopassword from login where loname = '" +
loginName + "';");
while( rs.next()){
dbhash = rs.getString(1);
}
out.println(dbhash+"<br>");
if (BCrypt.checkpw(request.getParameter("password"), dbhash)) {
out.println("It matches");
}else{
out.println("It does not match");
}
API BCrypt очень прост - здесь
Я не храню соль, потому что с BCrypt вам не нужно - так что я делаю не так?
1 ответ
Поле базы данных, в котором хранился pw_hash, было 80 символами. Это было на 20 символов больше, чем хеш BCrypt. Сработала обрезка хеша или сброс поля базы данных до 60 символов.
(Публикация данного ответа [см. Комментарии к вопросу], чтобы удалить вопрос из очереди без ответа. Пользователя попросили сделать это почти год назад, но пока не сделал этого. Кредит за этот ответ принадлежит им)