Согласно этому ответу , я должен сохранить свой String BCrypt хешированный пароль, passHash
, как BINARY
или BINARY(60)
(я выбрал BINARY(60)
), когда сохраняя его в моей таблице MySQL (я сохранил его в столбце с именем passHash
).
Теперь, когда я выбираю и извлекаю значение столбца passHash
из моей таблицы в Java, теперь это тип данных byte[]
.
Как мне затем преобразовать его обратно в его String форму, чтобы я мог проверить его, используя мой validateLogin()
метод ниже:
//Validate username and password login
public boolean validateLogin(String username, String userpass)
{
boolean status = false;
PreparedStatement pst = null;
ResultSet rs = null;
User user = new User(); //This is my Java bean class
try(Connection connect= DBConnection.getConnection())
{
//Here, passHash is stored as VARBINARY(60)
pst = connect.prepareStatement("SELECT * FROM user WHERE username=? and passHash=?;");
pst.setString(1, username);
pst.setString(2, userpass);
//Here's where I'm having difficulty because `passHash` column in my user table is VARBINARY(60) while `userpass` is a String
rs = pst.executeQuery();
status = rs.next();
}
catch (SQLException e)
{
e.printStackTrace();
}
return status; //status will return `true` if `username` and `userpass` matches what's in the columns
}
Параметры username
и userpass
используются для получения ввода пользователя в моей форме Login.jsp
:
String username = request.getParameter("username");
String userpass = request.getParameter("userpass");
РЕДАКТИРОВАТЬ : Мой код BCrypt выглядит следующим образом:
//returns a hashed String value
public static String bCrypt (String passPlain) {
return BCrypt.hashpw(passPlain, BCrypt.gensalt(10));
}
//Returns a true if plain password is a match with hashed password
public static Boolean isMatch(String passPlain, String passHash){
return (BCrypt.checkpw(passPlain, passHash));
}