0

MySQLを使用してC#に基づくWPFでログインフォームを実装しようとしています。ベローは私のコードです。プログラムを実行しようとすると、すべてが正常に見えますが、情報を入力しようとすると、オンラインでエラーが発生します。

salt = cmd.ExecuteScalar() as string;

次のように表示されます。行の「フィールドリスト」の不明な列「salt」。私がやろうとしたのは、テーブルにカラムソルトを作成することです。最初にデータを入力せずに「間違った詳細」を取得し、次にパスワードと同じデータを挿入して同じエラー「間違った詳細」を取得しました。万が一、どうすれば問題を解決できるかわかりますか?

機密データが置き換えられる私のコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.Security.Cryptography;
using System.Security.Authentication;
using System.Security.Permissions;
using System.Security.AccessControl;
using System.Security.Policy;
using System.Security.Principal;
using System.Security.Util;




namespace ECBSRecruitmentAgencySoftware
{
    public partial class LogIn : Form
    {

        public LogIn()
        {

            InitializeComponent();

        }

    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=tara.rdb.superhosting.bg;user=sozopouk;password=27051996;database=sozopouk_test2;"))
             {
                 con.Open();

                 var salt = string.Empty;

                 using (var 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

テーブル Niki には、salt としてフィールド名がないようです。

次のコードは、salt変数に NULL を返しています。

salt = cmd.ExecuteScalar() as string;

したがって、次のステートメントでは、salt の null または空の値をチェックしています。

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

また、salt が空または null の場合、コードから false を返しています。そのtryLoginため、関数は false を返し、「Wrong details!」という不要なメッセージ ボックスが表示されます。

ExecuteScalar()メッセージボックスを配置して、検証のために返されたソルトの値を表示できます

于 2012-05-17T08:54:40.193 に答える