2017-03-09 2 views
0

BCrypt로 해시 된 데이터베이스에서 해시 된 암호를 확인하려고합니다.BCrypt 데이터베이스의 암호와 암호 확인 중

두 개의 웹 양식 인 로그인 페이지와 등록 페이지가 있습니다.

등록 페이지에서 해시를 만들고 해시를 확인한 다음 데이터베이스에 삽입합니다. 잘 작동합니다.

로그인 페이지에서 데이터베이스에서 해시 된 비밀번호를 선택하고 텍스트 상자의 제출 된 비밀번호와 비교합니다.

제출 된 암호와 데이터베이스에서 해시를 확인할 때 문제가있는 것처럼 보입니다. 무엇이 잘못 될지 알 수 없습니다.

다음
protected void registerbutton_Click(object sender, EventArgs e) 
    { 
     string myPassword = passwordtextbox.Text; 
     string mySalt = BCryptHelper.GenerateSalt();  
     string myHash = BCryptHelper.HashPassword(myPassword, mySalt); 
     bool doesPasswordMatch = BCryptHelper.CheckPassword(myPassword, myHash); 


     if (doesPasswordMatch == true) 
     { 
       using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString)) 
       using (SqlCommand cmd = new SqlCommand("INSERT INTO dbo.Users (Username, Password, FirstName, LastName) VALUES (@username, @password, @firstname, @lastname)", conn)) 
       { 
        cmd.Parameters.Add("@username", SqlDbType.NVarChar).Value = usernametextbox.Text; 
        cmd.Parameters.Add("@password", SqlDbType.Char).Value = myHash; 
        cmd.Parameters.Add("@firstname", SqlDbType.NVarChar).Value = firstnametextbox.Text; 
        cmd.Parameters.Add("@lastname", SqlDbType.NVarChar).Value = lastnametextbox.Text; 

        conn.Open(); 
        cmd.ExecuteNonQuery(); 
        conn.Close(); 

        registerlabel3.Text = myHash; 


      } 
     } 
     else 
     { 
      registerlabel3.Text = "Error"; 
     } 
    } 

로그인 페이지 코드 :

protected void loginbutton_Click(object sender, EventArgs e) 
    { 
     const string query = "SELECT Username, Password FROM dbo.Users WHERE Username = @username"; 

     using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString)) 
     using (SqlCommand cmd = new SqlCommand(query, conn)) 
     { 
      cmd.Parameters.Add("@username", SqlDbType.NVarChar).Value = usernametextbox.Text; 
      conn.Open(); 

      //string hashedPassword = BCrypt.Net.BCrypt.HashPassword(passwordtextbox.Text); 

      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        var passwordInDb = reader.GetString(1); 

        Label3.Text = "submitted = " + passwordtextbox.Text; 
        Label4.Text = "database hash = " + passwordInDb; 

        if(BCryptHelper.CheckPassword(passwordtextbox.Text, reader.GetString(1))) 
        { 
         //login 
         loginlabel.Text = "Success"; 
        } 
        else 
        { 
         loginlabel.Text = "Error"; 
        } 




       } 
      } 
     } 
    } 

도움말 및 피드백에 감사드립니다 여기

은 등록 페이지 코드입니다.

+0

데이터베이스에 저장된 암호와 해시 란 무엇입니까? [다른 사람이 3 년 전에 정확한 문제를 겪었습니다.] (http://stackoverflow.com/questions/22833610/bcrypthelper-checkpassword-always-returns-false). 그것은 [BcryptHelper] (https://www.npmjs.com/package/bcrypt-helper)의 버그 인 것 같습니다 (실패 할 이유는 전혀 없습니다). –

답변

0

데이터베이스에 쓰기, 시도 :

protected void registerbutton_Click(object sender, EventArgs e) { .... cmd.Parameters.Add("@password", SqlDbType.NVarChar).Value = myHash; .... } 설정

+0

NVarChar와 Char 모두 데이터베이스에 해시를 넣는 데는 문제가 없습니다. –

0

데이터베이스 필드가 CHAR하는

(60) 나는 해시 된 암호가 CHAR에 저장되어있는 내 데이터베이스 필드를 (설정 60) 이제 작동합니다.

특별히 CHAR (60)이어야하는 이유는 모르겠지만 작동합니다.

이것이 설명 될 수 있다면 좋을 것입니다.