Проверьте пароль BCrypt Hash при входе в систему - PullRequest
0 голосов
/ 14 марта 2019

Я использую IDE Net Beans для создания формы логина и сервлета. Я использовал метод хеширования BCrypt для защиты пароля, когда он хранится в базе данных, и он был успешным. но при входе в систему всегда выдается «Неверные учетные данные»

как я могу решить это

вот мой CompanyLoging.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body style="background-color: #666666;">



<%
    Cookie[] cookies=request.getCookies();
    String email = "", password = "",rememberVal="";
    if (cookies != null) {
         for (Cookie cookie : cookies) {
           if(cookie.getName().equals("cookuser")) {
             email = cookie.getValue();
           }
           if(cookie.getName().equals("cookpass")){
             password = cookie.getValue();
           }
           if(cookie.getName().equals("cookrem")){
             rememberVal = cookie.getValue();
           }
        }
    }
%>

<div class="limiter">
    <div class="container-login100">
        <div class="wrap-login100">
                        <form class="login100-form validate-form" action="CompanyLogin" method="post">
                <span class="login100-form-title p-b-43">
                    Login to continue
                </span>


                <div class="wrap-input100 validate-input" data-validate = "Valid email is required: ex@abc.xyz">
                                        <input class="input100" type="text" name="email" >
                    <span class="focus-input100"></span>
                    <span class="label-input100">Email</span>
                </div>


                <div class="wrap-input100 validate-input" data-validate="Password is required">
                    <input class="input100" type="password" name="pass" autocomplete="off">
                    <span class="focus-input100"></span>
                    <span class="label-input100">Password</span>
                </div>

                <div class="flex-sb-m w-full p-t-3 p-b-32">
                    <div class="contact100-form-checkbox">
                                                <label>Remember me?</label> 
                                                <input type="checkbox" name="remember_me" value="1" <%="1".equals(rememberVal.trim()) %>>
                    </div>

                    <div>
                        <a href="#" class="txt1">
                            Forgot Password?
                        </a>
                    </div>
                </div>


                <div class="container-login100-form-btn">
                    <button class="login100-form-btn">
                        Login
                    </button>
                </div>

                <div class="text-center p-t-46 p-b-20">
                    <span class="login100-form-btn2">
                                                or <a href="CompanyReg.jsp">sign up</a> 
                    </span>
                </div>


            </form>

            <div class="login100-more" style="background-image: url('resources/Company/CompanyLogin/images/bg-01.jpg');">
            </div>
        </div>
    </div>
</div>
</body>
</html>

вот мой CompanyLog.java

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String email = request.getParameter("email");
    String password = request.getParameter("pass");
    String hashPass = BCrypt.hashpw(password, BCrypt.gensalt(12));

    try
    {
        connection = Connector.ConnectDb();
        PreparedStatement pst = connection.prepareStatement("SELECT * FROM Company WHERE Email= '"+email+"' AND Password='"+hashPass+"'");

        ResultSet rs = pst.executeQuery();
        if (rs.next())
        {
            if(request.getParameter("remember_me") != null)
            {
                String remember = request.getParameter("remember_me");
                Cookie cemail = new Cookie("cookuser", email.trim());
                Cookie cPassword = new Cookie("cookpass", password.trim());
                Cookie cRemember = new Cookie("cookrem", remember.trim());

                cemail.setMaxAge(60 * 60 * 24 * 15);//15 days
                cPassword.setMaxAge(60 * 60 * 24 * 15);
                cRemember.setMaxAge(60 * 60 * 24 * 15);

                response.addCookie(cemail);
                response.addCookie(cPassword);
                response.addCookie(cRemember);

            }

            HttpSession httpSession = request.getSession();
            httpSession.setAttribute("sessuser", email.trim());
            RequestDispatcher requestDispatcher = request.getRequestDispatcher("CompanyDashboard.jsp");
            requestDispatcher.forward(request, response);
        }

        else
        {
            PrintWriter out=response.getWriter();
            out.println("<script type=\"text/javascript\">");
            out.println("alert('Invalid Credentials');");
            out.println("location='CompanyLogin.jsp';");
            out.println("</script>");
        }
    }

    catch (IOException | SQLException | ServletException e)
    {
        PrintWriter out=response.getWriter();
        out.println("Error : " + e);
    }
}

так выглядит моя база данных

My database

1 Ответ

2 голосов
/ 14 марта 2019

Вы не разместили регистрационную часть своего приложения, но я подозреваю, что проблема вызвана следующей строкой в ​​вашей регистрационной части:

String hashPass = BCrypt.hashpw(password, BCrypt.gensalt(12));

, который создает хэш пароля для новой соли. Конечно, это не соответствует хэшу пароля, созданному в вашей регистрационной части (и сохраненному в поле Password вашей БД), так как соли различаются, даже если пароли совпадают. Таким образом, вместо создания новой соли вы должны использовать соль, уже сохраненную в вашей БД:

String hashPass = BCrypt.hashpw(password, storedSalt);

В принципе, соль может быть восстановлена ​​из сохраненного BCrypt-хэша (если вы заинтересованы в этом, формат BCrypt -hash подробно объяснен в Как bcrypt может иметь встроенные соли ? и здесь ).

Однако есть более простой способ (который также предназначен): Вы можете использовать BCrypt#checkpw -метод:

boolean isAuthenticated = BCrypt.checkpw(candidatePassword, passwordHash);

Здесь candidatePassword - пароль для проверки. passwordHash - это BCrypt -хеш (хранится в Password -поле вашей БД). Если пароли совпадают, метод возвращает true.

Если вы используете этот подход, вы должны соответствующим образом адаптировать свой доступ к базе данных, например, что-то вроде (еще не проверено!):

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String email = request.getParameter("email");
    String password = request.getParameter("pass");

    try {
        connection = Connector.ConnectDb();
        PreparedStatement pst = connection.prepareStatement("SELECT * FROM Company WHERE Email= '"+email+"'");

        ResultSet rs = pst.executeQuery();
        while (rs.next()) {
            if (BCrypt.checkpw(password, rs.getString("Password"))) {
                ...
...