이 코드를 몇 시간 동안 디버깅 했으므로 다른 사람이이 문제를 검토하면 도움이 될 것이라고 생각합니다. 나는 C# .net에서 내 소프트웨어의 로그인 시스템을 작성하고있다. SHA512에서 암호를 암호화하고 있습니다. Rush Frisby로 작성된 해시 알고리즘을 사용하고 있습니다.해시 함수가 실패한 시도에서 다른 값을 반환 함 버그
또한 사용자 비밀번호에 소금과 후추를 사용하고 있습니다.
// Form1.cs (inside button1_Click)
// IsConnected is a variable which holds the state of the connection
// to the server
if (IsConnected == true)
{
UsernameField = textBox1.Text; // Fetch the username
PasswordField = textBox2.Text; // Fetch the password
// The per-user salt is stored in the DB, go get it:
Salt = MH.GetUserSalt(UsernameField); // Get the salt for the user
// Encrypt the salt, pepper and secret keys in SHA512
Salt = HH.SHA512(Salt); // The salt is stored in the DB
Pepper = HH.SHA512(Pepper); // The salt is a private field in the current class
SecretKey = HH.SHA512(Salt + Pepper); // The secret key = SHA512(Salt + Pepper)
// Now, with the secret key let's add that to the password after it's encrypted
PasswordField = SecretKey + (HH.SHA512(PasswordField)); // The password is now secret key + SHA512(password)
// I am expecting 1 row back from the database:
success = MH.CheckUser(UsernameField, PasswordField); // success (bool): Did CheckUser return 1 row?
[SPACER]
// MySQLHelper.cs
public bool CheckUser(string username, string password)
{
if (IsConnected != true)
{
LastError = "Not connected!";
return false;
}
cmd = connection.CreateCommand();
cmd.CommandText = "SELECT * FROM credentials WHERE Username = '" + username + "' AND Password = '" + password + "'";
rdr = cmd.ExecuteReader();
rows = 0;
while (rdr.Read())
{
rows++;
}
// Gracefully release resources (rdr)
ReleaseResources();
if (rows == 1)
return true;
else
return false;
}
이 항상 내가 처음 시도, 두 번째 시도에 실패하지만 경우, (나는 합법적 인 자격 증명을 제공 부여)에 로그인하는 첫 번째 시도에서 작동
(및 해당 시도)는 자격 증명이 양호하더라도 (항상 1 행을 반환해야 함) 항상 0 (행)을 반환합니다. 응용 프로그램을 닫고 다시 열면 똑같은 일이 발생합니다. 로그인 할 수 있지만 첫 번째 시도에서 올바른 자격 증명을 제공해야합니다. 그렇지 않으면 나머지는 작동하지 않습니다.
필자가 언급했듯이이 문제는 일치하지 않는 암호 필드로 격리되었습니다. 이것은 sha512로 인코딩 된 사용자 비밀번호에 비밀 키가 추가되는 단계입니다.
유효한 (첫 번째 시도) : "B045B1FA1FCD4450D34EEEF17414E334B9E928EDB076E3D3D1EE8AF4EF25FD4076B6B228EA4AC53136FDF2BFF3FF780096EA5A63851EADB6133EB537C61CA23ECBE0CD68CBCA3868250C0BA545C48032F43EB0E8A5E6BAB603D109251486F77A91E46A3146D887E37416C6BDB6CBE701BD514DE778573C9B0068483C1C626AEC"
유효한 (두 번째 시도에서,하지만 기억 실패) : "B1316286A4628120FF77A53CE11CE0B16DF49358858729E3D01B25CDAFB5194112C982B11AC08424C6637F8F445D2D7A76A41B4857B43D60A54BD9E67FC14F20CBE0CD68CBCA3868250C0BA545C48032F43EB0E8A5E6BAB603D109251486F77A91E46A3146D887E37416C6BDB6CBE701BD514DE778573C9B0068483C1C626AEC"
저가 당신에게 예를 보자알다시피, 어떤 이유로 비밀번호가 변경되고 있습니다. 그것이 무엇인지 알 수 있습니까? 나는 모든 도움에 감사한다!
C#을 윈도우 7 64 비주얼 스튜디오 11 MySQL의 커넥터 순 6.5.4
내가 실수로 원천 징수 한 그와 함께 당신을 제공 할 수있는 추가 정보가 있으면 말씀해주십시오.
주제가 없지만 매우 중요 : 'SqlParameter'를 사용해야합니다. – SimpleVar
할 것이다, Yorye. 나는 그것을 위해 의사를 지금보고있다! 감사합니다 : ( –