Как использовать jBCrypt для сравнения хэша паролей?

У меня возникли проблемы с получением пароля открытого текста и предыдущего хеша, чтобы он соответствовал методу BCrypt checkpw (plaintextpw, previoushash).

В сервлете регистра я беру введенный пароль, хеширую его с помощью метода hasphpw (password, genSalt) BCrypt и сохраняю его в db.

В сервлете входа я беру этот хеш из db и использую проверочный файл BCrypt, чтобы узнать, соответствует ли он введенному паролю.

Он никогда не совпадает. Это отлично работает в моем обычном приложении Java, а не в webapp. Ни у кого другого нет этой проблемы, поэтому я полагаю, что я должен делать это неправильно:

//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 символов.

(Проводка данного ответа [см. комментарии к вопросу], чтобы удалить вопрос из оставшейся без очереди очереди. Пользователь был задан почти год назад, чтобы сделать это, но еще не сделал этого. Кредит за этот ответ принадлежит им)