-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?

【スペーサー】

// 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

誤って差し控えてしまったもので、提供できる追加情報があれば教えてください。

4

1 に答える 1

2

文字列の最初の部分が異なるため、塩またはコショウが変更されました。文字列の最後の部分が同じであるため、パスワードは問題ありません。

于 2012-06-03T06:56:42.633 に答える