我在使用BCrypt的checkpw(平原‘s,previoushash)方法来匹配明文密码和先前的散列时遇到了问题。
在寄存器servlet中,我接受输入的密码,使用BCrypt的hashpw(password,genSalt)方法散列它,并将其存储在db中。
在登录servlet中,我从db获取该散列,并使用BCrypt的checkpw查看它是否与输入的密码匹配。
从来都不匹配。这在我的常规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");
}BCrypt API非常简单- here
我不会储存盐,因为你认为BCrypt没必要--那我做错了什么?
发布于 2013-02-12 10:43:56
pw_hash存储的数据库字段为80个字符。这比一个BCrypt散列多20个字符。将散列修整或将数据库字段重置为60个字符。
(张贴给定的答案请参见有关问题的注释,以将问题从未回答的队列中删除。用户在将近一年前被要求这样做,但还没有这样做。这个答案是他们的功劳)
https://stackoverflow.com/questions/9722388
复制相似问题