如何使用jBCrypt进行密码哈希比较?

2022-09-04 03:59:53

我在使用BCrypt的checkpw(plaintextpw,previoushash)方法获取明文密码和以前的哈希值时遇到麻烦。

在寄存器servlet中,我获取输入的密码,使用BCrypt的hashpw(密码,genSalt)方法对其进行哈希处理并将其存储在数据库中。

在登录servlet中,我从数据库中获取该哈希值,并使用BCrypt的checkpw查看它是否与输入的密码匹配。

它永远不会匹配。这在我的常规Java应用程序中工作正常,但在Web应用程序中不起作用。没有其他人遇到这个问题,所以我想我一定是做错了:

//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");
            }

BCrypt API非常简单 - 这里

我没有储存盐,因为有了BCrypt,你应该不必这样做 - 所以我做错了什么?


答案 1

存储pw_hash的数据库字段为 80 个字符。这比BCrypt哈希多了20个字符。修剪哈希或将数据库字段重置为 60 个字符有效。

(发布给定的答案[请参阅问题评论]以从未回答的队列中删除问题。用户在大约一年前被要求这样做,但尚未这样做。这个答案的功劳是他们的)


答案 2

推荐