私はこのコードを何時間もデバッグしてきましたが、他の誰かが問題を調べてくれると助かると思います。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?
【スペーサー】
// 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;
}
これは、ログインの最初の試行では常に機能しますが (正当な資格情報を提供した場合)、最初の試行に失敗した場合、2 回目の試行 (および対応するすべての試行) は、資格情報が適切であっても常に 0 (行) を返します ( 1 行を返す必要があります)。アプリケーションを閉じて再度開くと、同じことが起こります。ログインできますが、最初の試行で適切な資格情報を提供する必要があります。そうしないと、残りは機能しません。
前述したように、パスワード フィールドが一致しないという問題に切り分けました。これは、sha512 でエンコードされたユーザー パスワードに秘密鍵が追加される段階です。例を挙げましょう:
Valid (on first attempt): "B045B1FA1FCD4450D34EEEF17414E334B9E928EDB076E3D3D1EE8AF4EF25FD4076B6B228EA4AC53136FDF2BFF3FF780096EA5A63851EADB6133EB537C61CA23ECBE0CD68CBCA3868250C0BA545C48032F43EB0E8A5E6BAB603D109251486F77A91E46A3146D887E37416C6BDB6CBE701BD514DE778573C9B0068483C1C626AEC"
Valid (on second attempt, but remember it fails): "B1316286A4628120FF77A53CE11CE0B16DF49358858729E3D01B25CDAFB5194112C982B11AC08424C6637F8F445D2D7A76A41B4857B43D60A54BD9E67FC14F20CBE0CD68CBCA3868250C0BA545C48032F43EB0E8A5E6BAB603D109251486F77A91E46A3146D887E37416C6BDB6CBE701BD514DE778573C9B0068483C1C626AEC"
ご覧のとおり、何らかの理由でパスワードが変更されています。それが何であるか知っていますか?私はすべての助けに感謝します!
C# Windows 7 x64 Visual Studio 11 MySQL Connector Net 6.5.4
誤って差し控えてしまったもので、提供できる追加情報があれば教えてください。