2012-06-03 2 views
-1

이 코드를 몇 시간 동안 디버깅 했으므로 다른 사람이이 문제를 검토하면 도움이 될 것이라고 생각합니다. 나는 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

내가 실수로 원천 징수 한 그와 함께 당신을 제공 할 수있는 추가 정보가 있으면 말씀해주십시오.

+3

주제가 없지만 매우 중요 : 'SqlParameter'를 사용해야합니다. – SimpleVar

+0

할 것이다, Yorye. 나는 그것을 위해 의사를 지금보고있다! 감사합니다 : ( –

답변

2

문자열의 첫 번째 부분이 다르므로 소금이나 후추가 변경되었습니다. 문자열의 마지막 부분이 여전히 동일하므로 암호가 여전히 유효합니다.

+0

소금과 후추를 바꾸는 데 아무런 변화가 없다는 대답을 한 후 Pepper = SHA512 (Pepper)를 사용하여 이전 코드 (이미 인코딩 된 후추)가 다시 인코딩된다는 사실을 기억했습니다 Pepper를 일정하게하고 다른 변수 (멍청한 실수)를 사용하여 해결했습니다. 죄송합니다 –

+0

@FairlightEvony 그가 문제를 해결 한 것 같습니다 :) :) – SimpleVar

+0

답변으로 표시하는 것을 잊어 버렸습니다. 두 개 고마워! –

관련 문제