Преобразование VARBINARY значений в строку в запросе выбора в MySQL? - PullRequest
0 голосов
/ 20 ноября 2018

Согласно этому ответу , я должен сохранить свой 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));
    }

1 Ответ

0 голосов
/ 20 ноября 2018

Когда вы создаете свои учетные записи, вы должны каким-то образом хэшировать пароли, чтобы создать byte[] в Java, который затем вставляете в таблицу user.

public static byte[] bCrypt (String passPlain) {
    return BCrypt.hashpw(passPlain, BCrypt.gensalt(10)).getBytes();
}

// here is how you generate the hash
byte[] hashed = bCrypt(userpass).toBytes();

// here is how you authenticate a login
String password; // from the UI
String sql = "SELECT passHash FROM user WHERE username = ?";
pst = connect.prepareStatement(sql);
pst.setString(1, username);
rs = pst.executeQuery();

if (rs.next()) {
    byte[] hash = rs.getBytes(1);
    if (isMatch(password, new String(hash))) {
        // authenticate
    }
}

Шаблон для проверки существующего пароля состоит в том, чтобы передать пароль в виде простого текста и хэш.

...