1

id-Int、username-VarChar、password-VarChar、およびsalt-VarCharを含む単純なmysql接続データベースがあるログインフォームにハッシュとソルトパスワードを実装しようとしています。プログラムをデバッグして正しいデータを入力しようとすると、まだ取得しています

間違った詳細

ショーボックス。万が一、次のコードを見て、私の間違いがどこにあり、問題を解決する方法を知っていますか。

PS: データベースの "salt" フィールドに、パスワードと同じデータを挿入しようとして、空白のままにして、varchar から Sha1 に変更しようとしても、同じエラーが発生することに注意してください。

static byte[] GenerateSaltedHash(string plainText, string salt)
    {
       HashAlgorithm algorithm = new SHA256Managed();

       byte[] plainTextBytes = System.Text.Encoding.Unicode.GetBytes(plainText);
       byte[] saltBytes = Convert.FromBase64String(salt);

       byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];
       saltBytes.CopyTo(plainTextWithSaltBytes, 0);
       plainTextBytes.CopyTo(plainTextWithSaltBytes, salt.Length); 

       byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes);

       return hash;
    }

        public bool tryLogin(string username , string password)
        {
             using (var con = new MySqlConnection("host=localhost;user=admin;password=password;database=sozopouk_test2;"))
             {
                 con.Open();

                 var salt = string.Empty;

                 using (MySqlCommand cmd = new MySqlCommand("Select salt From niki where user_name = @username", con))
                 {
                     cmd.Parameters.AddWithValue("@username", username);

                     salt = cmd.ExecuteScalar() as string;
                 }

                 if (string.IsNullOrEmpty(salt)) return false;

                 var hashedPassword = GenerateSaltedHash(password, salt);

                 using (var cmd = new MySqlCommand("Select * FROM niki WHERE user_name = @username and user_password = @password", con))
                 {
                    cmd.Parameters.AddWithValue("@username", username);
                    cmd.Parameters.AddWithValue("@password", hashedPassword);

                    using (var reader = cmd.ExecuteReader())
                    {
                         return reader.Read();
                    }
                 }
             }
             }

        private void button1_Click(object sender, EventArgs e)
        {
            if (tryLogin(user.Text, pass.Text) == true)
            {
                MainScreen F2 = new MainScreen();
                F2.Show();
                this.Hide();
            }

             else MessageBox.Show("Wrong details!");
        }
4

1 に答える 1

0

私はあなたの問題を再現しようとしました。(ハッシュアルゴリズムだけ)この行は正しくないようです

plainTextBytes.CopyTo(plainTextWithSaltBytes, salt.Length);  

代わりに使用する必要があります

plainTextBytes.CopyTo(plainTextWithSaltBytes, saltBytes.Length);  

ただし、これにより、reader.Read で false ではなく例外が発生します。
したがって、問題は別のものである可能性があります。リーダーの前にデバッグでプログラムを停止するようにしてください。@username と @password の値を読み取って確認します。
その情報を使用して、好みの MySql Manager を使用して、User テーブルにパラメーターの値が正確に含まれているかどうかを確認します。

于 2012-05-18T07:42:01.007 に答える