Вы не разместили регистрационную часть своего приложения, но я подозреваю, что проблема вызвана следующей строкой в вашей регистрационной части:
String hashPass = BCrypt.hashpw(password, BCrypt.gensalt(12));
, который создает хэш пароля для новой соли. Конечно, это не соответствует хэшу пароля, созданному в вашей регистрационной части (и сохраненному в поле Password
вашей БД), так как соли различаются, даже если пароли совпадают. Таким образом, вместо создания новой соли вы должны использовать соль, уже сохраненную в вашей БД:
String hashPass = BCrypt.hashpw(password, storedSalt);
В принципе, соль может быть восстановлена из сохраненного BCrypt-хэша (если вы заинтересованы в этом, формат BCrypt
-hash подробно объяснен в Как bcrypt может иметь встроенные соли ? и здесь ).
Однако есть более простой способ (который также предназначен): Вы можете использовать BCrypt#checkpw
-метод:
boolean isAuthenticated = BCrypt.checkpw(candidatePassword, passwordHash);
Здесь candidatePassword
- пароль для проверки. passwordHash
- это BCrypt
-хеш (хранится в Password
-поле вашей БД). Если пароли совпадают, метод возвращает true.
Если вы используете этот подход, вы должны соответствующим образом адаптировать свой доступ к базе данных, например, что-то вроде (еще не проверено!):
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String email = request.getParameter("email");
String password = request.getParameter("pass");
try {
connection = Connector.ConnectDb();
PreparedStatement pst = connection.prepareStatement("SELECT * FROM Company WHERE Email= '"+email+"'");
ResultSet rs = pst.executeQuery();
while (rs.next()) {
if (BCrypt.checkpw(password, rs.getString("Password"))) {
...