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";
}
}
}
}
}
도움말 및 피드백에 감사드립니다 여기
은 등록 페이지 코드입니다.
데이터베이스에 저장된 암호와 해시 란 무엇입니까? [다른 사람이 3 년 전에 정확한 문제를 겪었습니다.] (http://stackoverflow.com/questions/22833610/bcrypthelper-checkpassword-always-returns-false). 그것은 [BcryptHelper] (https://www.npmjs.com/package/bcrypt-helper)의 버그 인 것 같습니다 (실패 할 이유는 전혀 없습니다). –