14

BCrypt の checkpw(plaintextpw, previoushash) メソッドを使用して、平文パスワードと一致する以前のハッシュを取得するのに問題があります。

登録サーブレットでは、入力したパスワードを取得し、BCrypt の hashpw(password, genSalt) メソッドを使用してハッシュし、データベースに保存します。

ログイン サーブレットでは、データベースからそのハッシュを取得し、BCrypt の checkpw を使用して、入力したパスワードと一致するかどうかを確認します。

決して一致しません。これは、webapp ではなく、通常の Java アプリでは正常に機能します。他の誰もこの問題を抱えていないので、私は間違ったことをしているに違いないと思います:

//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を使用するとおそらく必要ないため、塩を保存していません-では、何が間違っているのでしょうか?

4

1 に答える 1

9

pw_hashが格納されたデータベースフィールドは80文字でした。これはBCryptハッシュよりも20文字多かった。ハッシュのトリミングまたはデータベースフィールドの60文字へのリセットが機能しました。

(与えられた回答を投稿して[質問へのコメントを参照]、未回答のキューから質問を削除します。ユーザーはほぼ1年前にこれを行うように求められましたが、まだ行っていません。この回答のクレジットは彼らのものです)

于 2013-02-12T10:43:56.353 に答える